報表開發之批量導入導出excel

在平常使用報表過程當中,會有這樣一種狀況,你將Excel表分發給各個員工,員工填完後,統一整理成多個Excel,你須要將這些數據,用報表的填報功能,提交錄入到數據庫中,這樣一來可避免到服務器機房錄數據的繁瑣步驟,可是不管是批量導入和仍是導出Excel,這對諸多報表軟件或稱集成報表功能的系統來講都是不容易的。java

解決Excel導入的性能問題,能夠利用FineReport開發的op=excel_submit功能,來實現不預覽報表便可對填報表導入Excel。數據庫

根據報表工程的使用方式不一樣,批量導入Excel中權限控制方式有所不一樣。數組

報表工程通常有如下兩種方式:服務器

一、使用FineReport自主開發的數據決策系統op=fs使用報表工程;性能

二、將報表工程集成到本身的系統中。excel

1.1 直接使用op=fscode

用戶使用數據決策系統op=fs查看報表,那麼全部的權限都是經過op=fs進行認證,用戶也都是添加在op=fs中。orm

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文件,以下 輸入圖片說明

內容分別爲 輸入圖片說明 輸入圖片說明

這樣批量導出便成功了。

相關文章
相關標籤/搜索