百萬級數據高效導出EXCEL

一.HSSF,XSSF和SXSSF的區別

HSSF是POI工程對Excel 97-2007  (.xls) 文件操作的純Java實現
XSSF是POI工程對Excel 2007 OOXML (.xlsx) 文件操作的純Java實現

從POI 3.8版本開始,提供了一種基於XSSF的低內存佔用的API----SXSSF

SXSSF實現了一套自動刷入數據的機制。當數據數量達到一定程度時(用戶可以自己設置這個限制)。像文本中刷入部分數據。這樣就緩解了程序運行時候的壓力。達到高效的目的。

二.百萬級數據高效導出EXCEL 方案

1.這種數據量的導出,肯定是異步的方式,將內存數據異步生成excel文件,存儲到服務器中(根據特定規則命名);

  此過程採用 POI 3.8的 SXSSF 進行寫excel操作

2.從服務器下載excel文件

 

  異步處理方式:

//根據條件拿到數據集
List<OrderBean> orderExportList = orderQueryService.getOrderList(orderSearchBean);
//創建線程池
int size = orderExportList.size();
int count = size / 5;
ExecutorService executorService = Executors.newFixedThreadPool(5);
//future存儲器
List<Future<List<OrderBean>>> futureList = new ArrayList<Future<List<OrderBean>>>();
//截取開啓5個線程分起任務完善信息
for (int i = 0; i < 5; i++)
{
	int start = count * i;
	int end = count * (i + 1);
	if (i == 5 - 1)
	{
		end = size;
	}
	@SuppressWarnings("unchecked")
	Future<List<OrderBean>> future = executorService.submit(new RunOrderThread(orderQueryService,
			orderExportList.subList(start, end)));
	// 每個異步計算的結果存放在future存儲器中
	futureList.add(future);
}
//啓動異步計算結果輸出線程,該線程掃描異步計算Futrue的狀態,如果已經完成,則輸出異步計算結果
ExportThread export = new ExportThread(this, futureList, fileName, staffid);
Thread resultThread = new Thread(export);
resultThread.start();

 SXSSF 方式寫excel:

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章