帆軟 FineReport 作為企業級 Web 報表工具,其 Excel 導出功能是業務系統中高頻剛需。針對不同業務場景——如財務對帳需「原樣導出」、分頁列印需「分頁導出」、多部門數據需「分 Sheet 導出」、百萬級數據需「大數據量導出」——FineReport 提供了四種截然不同的導出模式與對應的 Java API。本文詳細解析各模式適用場景、核心代碼與避坑指南。
| 模式 | 核心類 (Excel 2003) | 核心類 (Excel 2007+) | 適用場景 | 輸出格式 |
|---|---|---|---|---|
| 原樣導出 | ExcelExporter | Excel2007Exporter | 無分頁、樣式完整保留、數據量小 | .xls / .xlsx |
| 分頁導出 | PageExcelExporter | PageExcel2007Exporter | 報表有分頁,需保留分頁結構與重複標題 | .xls / .xlsx |
| 分頁分 Sheet | PageToSheetExcelExporter | PageToSheetExcel2007Exporter | 每頁獨立一 Sheet,便於分部門/分區域存檔 | .xls / .xlsx |
| 大數據量導出 | LargeDataPageExcelExporter | LargeDataPageExcel2007Exporter | 超過 6.5 萬行 (xls) 或百萬級數據,自動分 Sheet/分檔案 | .zip / .xlsx |
假設 `rworkbook` 為報表模型對象,`outputStream` 為輸出流。
// Excel 2003 (.xls)
outputStream = new FileOutputStream(new File("E:\\ExcelExport.xls"));
ExcelExporter exporter = new ExcelExporter();
exporter.export(outputStream, rworkbook);
// Excel 2007+ (.xlsx) - 突破 65536 行限制
outputStream = new FileOutputStream(new File("E:\\ExcelExport.xlsx"));
Excel2007Exporter exporter = new Excel2007Exporter();
exporter.export(outputStream, rworkbook);
outputStream = new FileOutputStream(new File("E:\\PageExcelExport.xls"));
PageExcelExporter exporter = new PageExcelExporter(
ReportUtils.getPaperSettingListFromWorkBook(rworkbook)
);
exporter.export(outputStream, rworkbook);

outputStream = new FileOutputStream(new File("E:\\PageSheetExcelExport.xls"));
PageToSheetExcelExporter exporter = new PageToSheetExcelExporter(
ReportUtils.getPaperSettingListFromWorkBook(rworkbook)
);
exporter.export(outputStream, rworkbook);

// 導出為 ZIP 壓縮包,內含多個 .xls 分卷文件
outputStream = new FileOutputStream(new File("E:\\LargeExcelExport.zip"));
LargeDataPageExcelExporter exporter = new LargeDataPageExcelExporter(
ReportUtils.getPaperSettingListFromWorkBook(rworkbook), true // 開啟分頁
);
exporter.export(outputStream, rworkbook);
大數據導出是最容易踩坑的環節,主要面臨兩大風險:
根因:未啟用行式引擎時,報表引擎需將所有數據一次性載入記憶體構建完整模型,再寫入 Excel,記憶體峰值極高。
行式引擎採用「流式計算 + 分塊輸出」機制:
關鍵配置:報表設計器中勾選「使用行式引擎」,並設定合理的「每頁記錄數」。代碼中 `LargeDataPageExcelExporter` 兩個構造函數參數 `true` 表示啟用分頁導出模式。
選對導出模式 = 事半功倍。小數據用「原樣/分頁/分 Sheet」,大數據「必開行式引擎 + 導出 ZIP」。開發階段務必用生產級數據量壓測,驗證記憶體、CPU、網絡帶寬三大指標,才能確保上線零事故。