FineReport 提供四種 Excel 導出模式,針對不同報表呈現需求與數據量級:
| 模式 | 適用場景 | 關鍵類別 | 輸出特徵 |
|---|---|---|---|
| 原樣導出 | 無需預覽,直接導出報表設計樣式 | ExcelExporter / Excel2007Exporter | 單檔,保留原始排版 |
| 分頁導出 | 報表含分頁設定,需依頁碼分頁輸出 | PageExcelExporter / PageExcel2007Exporter | 單檔,重複頁首頁尾 |
| 分頁分 Sheet 導出 | 每頁獨立為一 Sheet | PageToSheetExcelExporter / PageToSheetExcel2007Exporter | 單檔多 Sheet,頁面隔離 |
| 大數據量導出 | 超大數據集(如 5 萬行以上) | LargeDataPageExcelExporter / LargeDataPageExcel2007Exporter | 分檔/壓縮包,規避記憶體溢出 |
// 1. 取得報表工作簿對象(假設已載入)
WorkBook rworkbook = ...;
// 2. 選擇導出器並執行
OutputStream outputStream = new FileOutputStream(new File("E:\\Export.xlsx"));
// 原樣導出
Excel2007Exporter exporter = new Excel2007Exporter();
exporter.export(outputStream, rworkbook);
// 分頁導出
PageExcel2007Exporter pageExporter = new PageExcel2007Exporter(
ReportUtils.getPaperSettingListFromWorkBook(rworkbook));
pageExporter.export(outputStream, rworkbook);
// 分頁分 Sheet
PageToSheetExcel2007Exporter sheetExporter = new PageToSheetExcel2007Exporter(
ReportUtils.getPaperSettingListFromWorkBook(rworkbook));
sheetExporter.export(outputStream, rworkbook);
// 大數據導出(第二參數 true 表示啟用壓縮)
LargeDataPageExcel2007Exporter largeExporter = new LargeDataPageExcel2007Exporter(
ReportUtils.getPaperSettingListFromWorkBook(rworkbook), true);
largeExporter.export(outputStream, rworkbook);
| 伺服器承受範圍 | 表現 | 原因 |
|---|---|---|
| 可承受(如 10 萬行、結構簡單、記憶體充足) | 導出成功,超過 Excel 行數限制(65,536)自動換 Sheet | 單次載入記憶體,依賴 JVM Heap |
| 不可承受(百萬行以上、結構複雜) | 導出失敗(OOM),但輸出檔案內容有效(部分數據) | 記憶體不足中斷,輸出流未正常關閉 |
關鍵臨界點取決於 數據量 × 列數 × 複雜度 與可用 Heap 的關係。
.xls 檔案,打包為 .zip 傳輸| 版本 | 最大行數 | 最大列數 | FineReport 處理方式 |
|---|---|---|---|
Excel 2003 (.xls) | 65,536 | 256 | 自動拆分多 Sheet 或多檔 |
Excel 2007+ (.xlsx) | 1,048,576 | 16,384 | 單檔支援更大數據量 |
建議:現代專案優先使用 2007Exporter 系列,避免舊版限制。
PageToSheetExcel2007Exporter,頁面邏輯清晰對應 SheetPageExcel2007Exporter 單檔分頁LargeDataPageExcel2007ExporterOutputStream 是否正確 flush()/close(),確認 rworkbook 已完整載入-Xmx、啟用行式引擎、分批導出FineReport 四種導出模式各有定位,關鍵在於 數據量級判斷 與 行式引擎啟用。大數據場景下,行式引擎 + 分檔壓縮是穩定導出的核心保障;中小數據場景則可靈活選擇分頁/分 Sheet 模式提升閱讀體驗。