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,程式碼編寫
- 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();
- }
- }
- }
上面的做法會因為帆軟報表軟體的執行而在查詢的時候,很慢,最常用的就是在sql的查詢語句中將要傳入的引數直接變成形參,然後在呼叫的時候,形參直接在請求中傳遞過去,就可以直接執行SQL語句然後查詢