首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計疑難解答

Java 導出 Excel 大數據量循環優化:避免重復創建對象與參數傳遞開銷

     編輯:程式設計疑難解答

問題現象

循環中每行調用 Service 獲取 Page 對象,再寫入單元格,數據量大時 OOM(500 錯誤)。

優化要點

  1. 輕量級 DTO 替代 Page:Service 返回 List<Map> 或自定義簡單 POJO,僅包含導出所需字段,避免 Page 內部持有大量無關數據(總頁數、總條數、分頁參數等)。
  2. 參數精簡:方法簽名僅傳必要參數(如 rowIndex, pageSize),避免傳遞大 Map、Page 等重對象。
  3. 對象復用:循環外創建 List<Map> list = new ArrayList<>(),循環內 list.clear() 復用,減少 GC 壓力。
  4. 流式寫入:使用 SXSSFWorkbook (POI 流式 API) 邊生成邊刷盤,不佔用堆內存。
  5. 批次提交:每 1000 行刷新一次 sheet.flushRows()。

重構示例

// Service 簽名優化
List> getExportData(int offset, int limit);

// Controller 循環
List> buffer = new ArrayList<>();
int pageSize = 1000;
for (int offset=0; ; offset+=pageSize) {
    buffer.clear();
    buffer.addAll(service.getExportData(offset, pageSize));
    if (buffer.isEmpty()) break;
    for (Map row : buffer) writeRow(sheet, row);
    if (buffer.size() < pageSize) break;
}
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved