在日常使用報表過程中,會有這樣一種情況,你將Excel表分發給各個員工,員工填完後,統一整理成多個Excel,你需要將這些數據,用報表的填報功能,提交錄入到數據庫中,這樣一來可避免到服務器機房錄數據的繁瑣步驟,但是無論是批量導入和還是導出Excel,這對諸多報表軟件或稱集成報表功能的系統來說都是不容易的。
解決Excel導入的性能問題,可以利用FineReport開發的op=excel_submit功能,來實現不預覽報表即可對填報表導入Excel。
根據報表工程的使用方式不同,批量導入Excel中權限控制方式有所不同。
報表工程一般有以下兩種方式:
1、使用FineReport自主開發的數據決策系統op=fs使用報表工程;
2、將報表工程集成到自己的系統中。
1.1 直接使用op=fs
用戶使用數據決策系統op=fs查看報表,那麼所有的權限都是通過op=fs進行認證,用戶也都是添加在op=fs中。
1.2 集成FR報表工程
用戶將FR報表工程集成到自己的系統中,通過自己的系統查看報表,那麼FR所有的權限都是通過報表平台管理op=fr_platform進行認證,詳細請查權限管理。
除了批量導入,還有批量導出。一張報表可以根據不同的條件統計出不同的數據結果,有時希望將每一種條件下的結果都保存下來如導出成Excel文件至磁盤,可以在後台調用FineReport的導出接口ExcelExporter將每種情況下的結果批量保存起來。
實現的原理是遍歷讀取para.txt中的每組參數值,將該參數值組合傳入模板進行計算,然後將結果導出excel,循環直至最後一條參數組合。
例如:
由於我們需要對模板輸入參數對應的值才能夠計算得到最終的結果,因此我們需要所有可能的參數值組合,可以來源於數據庫中某個表,或者某個文件。這裡我們假設所需的參數值組合保存在WebReport\WEB-INF\para.txt中。如下圖新建para.txt
如果模板有兩個參數格式如下:
批量導出程序,完整代碼如下:
package com.fr.io; import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.InputStreamReader; import java.io.OutputStream; import java.util.Arrays; import com.fr.base.FRContext; import com.fr.general.ModuleContext; import com.fr.dav.LocalEnv; 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 { // 定義報表運行環境,用於執行報表 String envpath = "D:\\FineReport_7.1\\WebReport\\WEB-INF"; FRContext.setCurrentEnv(new LocalEnv(envpath)); ModuleContext.startModule(EngineModule.class.getName()); // 讀取環境下的模板文件 TemplateWorkBook workbook = TemplateWorkBookIO.readTemplateWorkBook(FRContext.getCurrentEnv(), "doc\\Primary\\DetailReport\\Details.cpt"); // 讀取用於保存的參數值的txt文件 File parafile = new File(envpath + "\\para.txt"); FileInputStream fileinputstream; fileinputstream = new FileInputStream(parafile); BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(fileinputstream)); // 定義保存參數的map,用於執行報表 java.util.Map paramap = new java.util.HashMap(); /* * 遍歷參數值所在txt文件,txt文件中參數保存形式為 para1,para2 江蘇,陳羽 江蘇,安娜 首先取出第一行保存參數名稱 * 遍歷每個參數組合,如para1=江蘇、para2=陳羽,根據參數執行模板,並將結果導出excel excel文件名為名稱+導出編號 */ // 讀第一行,保存參數名稱 String lineText = bufferedReader.readLine(); lineText = lineText.trim(); String[] paraname = StableUtils.splitString(lineText, ","); System.out.println(Arrays.toString(paraname)); // 遍歷每個參數組合,執行模板,導出結果 int number = 0; while ((lineText = bufferedReader.readLine()) != null) { lineText = lineText.trim(); String[] paravalue = StableUtils.splitString(lineText, ","); for (int j = 0; j < paravalue.length; j++) { paramap.put(paraname[j], paravalue[j]); } ResultWorkBook result = workbook.execute(paramap,new WriteActor()); OutputStream outputstream = new FileOutputStream(new File("E:\\ExportEg" + number + ".xls")); ExcelExporter excelexporter = new ExcelExporter(); excelexporter.export(outputstream, result); // 最後要清空一下參數map,用於下次計算 paramap.clear(); number++; outputstream.close(); } ModuleContext.stopModules(); } catch (Exception e) { e.printStackTrace(); } } }
上述為示例程序,其中報表運行環境與模板名稱等需要根據您實際環境進行修改。編譯運行該程序您便可以得到結果,在E盤根目錄下將生成3個Excel文件,如下
內容分別為
這樣批量導出便成功了。