1. 程式人生 > >FineReport 報表模板生成+匯出Excel表格

FineReport 報表模板生成+匯出Excel表格

看官方的文件糾結了一天,好東西,這個怎麼下手,但是還是想總結一下。

FineReport報表技術,給我的感覺跟IReport報表的思路差不多,所以我就抱著這種試試的心態去嘗試,在我搜集資料加看官方文件之後,覺得更像了!!!

FineReport報表軟體是一款純java編寫的,集資料展示(報表)和資料錄入(單表)功能與一身的企業級web報表工具,可以簡單的應用多業務的系統資料,集中資料於一張報表,還有類EXCEL的設計模式,EXCEL+繫結資料列的形式支援SHEET和跨SHEET的計算(跟IReport的功能有點相似,但是比較強大),完美相容EXCEL公式,支援匯入現有的Excel表樣製作報表。

資料的支援:

支援的資料庫有:Orcal、sql server 、DB2、my sql 等主流的關係型資料庫

文字資料來源:包括Excel檔案、Txt檔案等儲存在檔案中的資料

下面進入正題:主要講解兩個方面,模板的生成+於模板整合匯出Excel表格

1,模板的生成

     1.1:新建模板   -- 開啟安裝完成的軟體,點選圖中所指的按鈕,即可完成表格的新建

                 

     1.2: 資料庫的配置

  

1.3:資料的獲取和資料的新增   -- 資料是從資料庫中獲取,這裡我以Orcal資料庫為例

                        

         

       

點選儲存之後,會在左下角顯示你儲存的sql語句

                                          

上圖點選確定之後,就會顯示資料,可自行完成

模板設計(此處跟IReport是一樣的,首先從資料庫中查詢出資料,然後在進行資料的設定)

2,程式碼編寫

 

  1. package com.fr.io;        
  2.         
  3. import java.io.BufferedReader;        
  4. import java.io.File;        
  5. import java.io.FileInputStream;        
  6. import java.io.FileOutputStream;        
  7. import java.io.InputStreamReader;        
  8. import java.io.OutputStream;        
  9. import java.util.Arrays;        
  10. import com.fr.base.FRContext;        
  11. import com.fr.general.ModuleContext;  
  12. import com.fr.dav.LocalEnv;    
  13.     
  14. import com.fr.io.exporter.ExcelExporter;    
  15. import com.fr.main.TemplateWorkBook;      
  16. import com.fr.main.workbook.ResultWorkBook;  
  17. import com.fr.report.module.EngineModule;  
  18. import com.fr.stable.StableUtils;    
  19. import com.fr.stable.WriteActor;  
  20.        
  21.          
  22.  public class ExportBatch {        
  23.      public static void main(String[] args) {        
  24.          try {        
  25.              // 定義報表執行環境,用於執行報表        
  26.              String envpath = "D:\\FineReport_7.1\\WebReport\\WEB-INF";        
  27.              FRContext.setCurrentEnv(new LocalEnv(envpath));      
  28.      ModuleContext.startModule(EngineModule.class.getName());      
  29.     // 讀取環境下的模板檔案      
  30.     TemplateWorkBook workbook = TemplateWorkBookIO.readTemplateWorkBook(FRContext.getCurrentEnv(),      
  31.         "doc\\Primary\\DetailReport\\Details.cpt");      
  32.     // 讀取用於儲存的引數值的txt檔案      
  33.     File parafile = new File(envpath + "\\para.txt");      
  34.     FileInputStream fileinputstream;      
  35.     fileinputstream = new FileInputStream(parafile);      
  36.     BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(fileinputstream));      
  37.     // 定義儲存引數的map,用於執行報表      
  38.     java.util.Map paramap = new java.util.HashMap();      
  39.     /*   
  40.      * 遍歷引數值所在txt檔案,txt檔案中引數儲存形式為 para1,para2 江蘇,陳羽 江蘇,安娜 首先取出第一行儲存引數名稱   
  41.      * 遍歷每個引數組合,如para1=江蘇、para2=陳羽,根據引數執行模板,並將結果匯出excel excel檔名為名稱+匯出編號   
  42.      */      
  43.     // 讀第一行,儲存引數名稱      
  44.     String lineText = bufferedReader.readLine();      
  45.     lineText = lineText.trim();      
  46.     String[] paraname = StableUtils.splitString(lineText, ",");      
  47.     System.out.println(Arrays.toString(paraname));      
  48.     // 遍歷每個引數組合,執行模板,匯出結果      
  49.     int number = 0;      
  50.     while ((lineText = bufferedReader.readLine()) != null) {      
  51.         lineText = lineText.trim();      
  52.         String[] paravalue = StableUtils.splitString(lineText, ",");      
  53.         for (int j = 0; j < paravalue.length; j++) {      
  54.             paramap.put(paraname[j], paravalue[j]);      
  55.         }      
  56.         ResultWorkBook result = workbook.execute(paramap,new WriteActor());    
  57.         OutputStream outputstream = new FileOutputStream(new File("E:\\ExportEg" + number + ".xls"));      
  58.         ExcelExporter excelexporter = new ExcelExporter();      
  59.         excelexporter.export(outputstream, result);      
  60.         // 最後要清空一下引數map,用於下次計算      
  61.         paramap.clear();      
  62.         number++;      
  63.         outputstream.close();    
  64.         }   
  65.     ModuleContext.stopModules();  
  66.     } catch (Exception e) {      
  67.         e.printStackTrace();      
  68.     }      
  69.           }      
  70. }  

上面的做法會因為帆軟報表軟體的執行而在查詢的時候,很慢,最常用的就是在sql的查詢語句中將要傳入的引數直接變成形參,然後在呼叫的時候,形參直接在請求中傳遞過去,就可以直接執行SQL語句然後查詢