首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 綜合教學

FineReport 批量導入導出 Excel 實戰:高性能填報數據批量處理方案

     編輯:Java 綜合教學

報表填報場景下的 Excel 批量導入導出最佳實踐

企業級報表常面臨:**下發 Excel 模板給員工填寫 → 回收大量 Excel → 批量導入數據庫** 或 **按條件批量導出多個 Excel 文件** 的需求。FineReport 提供 op=excel_submit 免預覽導入與 ExcelExporter 批量導出 API,本文給出完整實現代碼與關鍵配置。

一、批量導入:op=excel_submit 免預覽提交

  • 適用場景:員工填好 Excel,管理員統一上傳入庫,無需逐個打開報表預覽;
  • 權限模式:
    • 直連 FineReport 決策系統 (op=fs) → 走平台用戶體系;
    • 集成模式 (op=fr_platform) → 走集成系統用戶體系。
  • 前端調用:POST /WebReport/ReportServer?op=excel_submit&reportlet=xxx.cpt,multipart 上傳 Excel 文件。

二、批量導出:Java 代碼遍歷參數調用 ExcelExporter

核心思路

  1. 讀取參數文件(如 para.txt),每行一組參數(如 省份,姓名);
  2. 循環調用 TemplateWorkBook.execute(params) 計算報表;
  3. 用 ExcelExporter.export(outputStream, resultWorkBook) 導出單個 Excel;
  4. 文件命名:模板名_序號.xls。

完整代碼

package com.fr.io;

import java.io.*;
import java.util.*;
import com.fr.base.FRContext;
import com.fr.dav.LocalEnv;
import com.fr.general.ModuleContext;
import com.fr.io.exporter.ExcelExporter;
import com.fr.main.TemplateWorkBook;
import com.fr.main.workbook.ResultWorkBook;
import com.fr.report.module.EngineModule;
import com.fr.stable.StableUtils;
import com.fr.stable.WriteActor;

public class ExportBatch {
    public static void main(String[] args) {
        try {
            // 1. 初始化報表運行環境
            String envPath = "D:\\FineReport_7.1\\WebReport\\WEB-INF";
            FRContext.setCurrentEnv(new LocalEnv(envPath));
            ModuleContext.startModule(EngineModule.class.getName());

            // 2. 讀取模板
            TemplateWorkBook workbook = TemplateWorkBookIO.readTemplateWorkBook(
                    FRContext.getCurrentEnv(), "doc\\Primary\\DetailReport\\Details.cpt");

            // 3. 讀取參數文件
            File paraFile = new File(envPath + "\\para.txt");
            try (BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(paraFile)))) {
                String header = br.readLine().trim();
                String[] paramNames = StableUtils.splitString(header, ",");
                Map<String, Object> params = new HashMap<>();
                int idx = 0;
                String line;
                while ((line = br.readLine()) != null) {
                    String[] values = StableUtils.splitString(line.trim(), ",");
                    for (int i = 0; i < paramNames.length; i++) params.put(paramNames[i], values[i]);

                    // 4. 執行報表並導出
                    ResultWorkBook result = workbook.execute(params, new WriteActor());
                    try (OutputStream os = new FileOutputStream("E:\\ExportEg" + idx + ".xls")) {
                        new ExcelExporter().export(os, result);
                    }
                    params.clear();
                    idx++;
                }
            }
            ModuleContext.stopModules();
        } catch (Exception e) { e.printStackTrace(); }
    }
}

para.txt 示例

省份,姓名
江蘇,陳羽
江蘇,安娜
浙江,李四

導出結果

生成 ExportEg0.xls、ExportEg1.xls、ExportEg2.xls 三個文件,分別包含對應參數下的報表數據。

三、性能與注意事項

  • 大數據量導出建議啟用 **分頁導出** 或 **流式寫入** 避免 OOM;
  • 導入時若 Excel 結構不一致,需預處理統一表頭;
  • 集成模式下注意線程安全,FRContext 非線程安全,多線程導出需隔離環境;
  • 導出路徑建議配置化,避免硬編碼絕對路徑。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved