反饋已提交

網絡繁忙

匯出API

1. 概述

1.1 應用場景

FineReport 支援預覽報表時將報表匯出成各種通用的檔案格式,如 PDF 、Excel 、Word 等;FineReport 設計器中也支援將範本匯出成通用的檔案格式或者內建資料範本。如下圖所示:

如果使用者不想透過預覽報表或操作設計器匯出檔案,想直接後台匯出,該如何實現呢?

1.2 實現思路

FineReport 提供了強大的輸入匯出功能,所有的這些輸入/匯出類都在 com.fr.report.io 包裏面。

報表的輸入指從報表的範本檔案( XML 格式的 )建立 WorkBook 物件,在報表呼叫章節已經介紹過;匯出則指將報表儲存為各種格式檔案,即透過編譯 Java 程式呼叫工程資源後台將範本匯出成 cpt 、內建資料 cpt 、PDF 、Excel 、Word 、SVG 、CSV 、image (包含 png 、 jpg 、gif 、bmp )等多種檔案格式,匯出後釋放進程。 

注:範例程式碼方案不支援 使用新計算引擎範本 的匯出。

1.3 API介紹

注:匯出時,不同的預覽方式將對應不同的計算結果報表程式碼。填報預覽匯出:Writeactor、分析預覽匯出:Viewactor,分頁預覽匯出:PageActor

1)匯出成內建資料集範本

匯出成內建資料集範本就是將原範本的資料源根據參數條件查詢出結果並轉為內建資料集,然後把範本匯出,不需要對原範本進行計算。程式碼如下:

 /**將範本工作薄匯出為內建資料集範本檔案*/
outputStream = new FileOutputStream(new java.io.File(outputUrl+"EmbExport.cpt"));
EmbeddedTableDataExporter templateExporter = new EmbeddedTableDataExporter();
templateExporter.export(outputStream, workbook);

2)匯出成範本檔案

可以將原範本通程式式編輯後再次匯出為範本檔案,或者將某一路徑下的範本儲存至另一路徑下。程式碼如下:

/**將範本工作薄匯出為範本檔案*/
outputStream = new FileOutputStream(new java.io.File(outputUrl+"TmpExport.cpt"));
((WorkBook) workbook).export(outputStream);

 3)匯出成 2003Excel 檔案

範本工作薄 WorkBook 執行後為結果工作薄 ResultWorkBook,可以把計算後的結果匯出成 2003Excel 檔案。程式碼如下:

 /**將結果工作薄匯出為2003Excel檔案*/
outputStream = new FileOutputStream(new java.io.File(outputUrl+"ExcelExport2003.xls"));
ExcelExporter ExcelExport = new ExcelExporter();
ExcelExport.export(outputStream, workbook.execute(parameterMap, new WriteActor()));

4)匯出 2007Excel 檔案 

範本工作薄 WorkBook 執行後為結果工作薄 ResultWorkBook,可以把計算後的結果匯出成 20037Excel 檔案。程式碼如下:

/**將結果工作薄匯出為2007Excel檔案*/
outputStream = new FileOutputStream(new java.io.File(outputUrl+"ExcelExport2007.xlsx"));
StreamExcel2007Exporter ExcelExport1 = new StreamExcel2007Exporter();
ExcelExport1.export(outputStream, workbook.execute(parameterMap, new WriteActor()));

5)匯出 Word 檔案 

注:FineReport 報表匯出 Word 不支援匯出懸浮元素,若您需匯出的範本中包含懸浮元素如圖表,請將其改為儲存格元素如儲存格中插入圖表。

/**將結果工作薄匯出為Word檔案*/
outputStream = new FileOutputStream(new java.io.File(outputUrl+"WordExport.doc"));
WordExporter WordExport = new WordExporter();
WordExport.export(outputStream, workbook.execute(parameterMap, new WriteActor()));

6)匯出 PDF 檔案

/**將結果工作薄匯出為Pdf檔案*/
outputStream = new FileOutputStream(new java.io.File(outputUrl+"PdfExport.pdf"));
PDFExporter PdfExport = new PDFExporter();
PdfExport.export(outputStream, workbook.execute(parameterMap, new WriteActor()));

7)匯出 Txt 檔案

/**將結果工作薄匯出為Txt檔案(txt檔案本身不支援表格、圖表等,被匯出範本一般為明細表)*/
outputStream = new FileOutputStream(new java.io.File(outputUrl+"TxtExport.txt"));
TextExporter TxtExport = new TextExporter();
TxtExport.export(outputStream, workbook.execute(parameterMap, new WriteActor()));

8)匯出 CSV 檔案

/**將結果工作薄匯出為Csv檔案*/
outputStream = new FileOutputStream(new java.io.File(outputUrl+"CsvExport.csv"));
CSVExporter CsvExport = new CSVExporter();
CsvExport.export(outputStream, workbook.execute(parameterMap, new WriteActor()));

9)匯出 SVG 檔案

 /**將結果工作薄匯出為SVG檔案*/
outputStream = new FileOutputStream(new java.io.File(outputUrl+"SvgExport.svg"));
SVGExporter SvgExport = new SVGExporter();
SvgExport.export(outputStream, workbook.execute(parameterMap, new WriteActor()));

10)匯出 Image 檔案

注:Image 圖片支援 png、jpg、 gif、 bmp 格式,這裏範例是 png 格式,預設為 jpg。

/**將結果工作薄匯出為image檔案*/
outputStream = new FileOutputStream(new java.io.File(outputUrl+"PngExport.png"));
ImageExporter ImageExport = new ImageExporter();
ImageExport.export(outputStream, workbook.execute(parameterMap, new WriteActor()));

11)釋放進程

透過匯出 API 在後台匯出 Excel 等檔案,會產生很多進程,在匯出完成之後新增如下程式碼可釋放進程:

outputStream.close();            
module.stop();

2. 範例

下面實現後台匯出 GettingStarted.cpt 範本,參數為報表參數,且設定預設值為華東。

2.1 準備編譯環境

編譯程式前,需先建立一個 Java 工程環境,並且需要一個 Java 編輯器,如 Eclipse 或 idea 。

在編輯器工程中引入 FineReport 工程 JAR 包。包括安裝的報表工程

  • %FR_HOME%\webapps\webroot\WEB-INF\lib目錄下 fine 開頭的 12 個 JAR 包。

  • %FR_HOME%\webapps\webroot\WEB-INF\lib目錄下的 sqlite-jdbc.jar

  • %Tomcat_HOME%\libTomcat目錄下的 servlet-api.jar

  • %JAVA_HOME%\jdk\lib JDK 目錄下的 tools.jar

  • slf4j-simple-1.7.25.jar ,點選可下載:slf4j-simple-1.7.25.jar

  • 如果報表中需要查詢資料庫,還需要匯入對應的 jdbc 驅動或者插件的 JAR 包(如使用 JSON 資料集,就要引入 JSON 資料集插件下的 JAR 包)。

詳細引入程式可參考:編譯Java程式 

2.2 編寫 Java 程式

在編輯器中編寫 Java 程式 ExportApi.java,即引入必要類後,獲取範本,將範本匯出成指定格式的檔案。完整程式碼可參見:

注1:程式碼中 StateServiceActivator 是針對 2020.4.26 JAR 包之後的改動,若之前版本報錯將其改為 StateServerActivator 即可。

注2:使用者使用時,注意將範例程式碼中的工程路徑、範本名稱和匯出路徑更換為使用者自己工程下的。

普通報表 cpt 程式碼:

https://code.fanruan.com/demo/example/src/branch/persist/10.0/src/main/java/com/fr/io/ExportApi.java

決策報表 frm 程式碼:

https://code.fanruan.com/demo/example/src/branch/persist/10.0/src/main/java/com/fr/io/ExportApi_frm.java

2.3 編譯 Java 檔案

Java 程式編寫完成後,在編譯器中編譯 ExportApi.java ,編譯透過後,運作java程式碼,就會在程式碼中匯出路徑的資料夾下生成不同格式的檔案,這樣就匯出成功了。如下圖所示:


如果想自動觸發程式匯出,可以透過 Java 寫定時任務觸發執行;也可以透過「排程管理>自訂附件處理」功能實現定時觸發。如下圖所示:

瞭解自訂附件處理功能可查看:自訂上傳檔案至磁碟


3. 注意事項

3.1 FineDB 鎖死

問題描述:

運作編譯好的程式碼時,會彈出錯誤提示:SQLException : Database lock acquisition failure: lockFile:.....。如下圖所示:


原因分析:

匯出的時候啟動了運作環境,如開啟了設計器,因為報表內建資料庫為 HSQL 資料庫,HSQL 資料庫不能多執行緒存取,所以在匯出時啟動運作環境就會把 FineDB 鎖死,匯出時報錯。

解決方案:

方法一:

關閉 java 編輯器,如 idea、 Eclipse 進程,將程式碼中匯出範本工程 %FR_HOME%\webapps\webroot\WEB-INF\embed\finedb 下的 db.lck 檔案刪除,再次開啟java 編輯器運作程式碼運即可。

注:該方法在運作一次後仍會報錯,需要反覆刪除 db.lck 檔案。

方法二:

報表工程內建 HSQL 資料庫不能多執行緒存取,可以將其遷移為其他資料庫。遷移方法可參考文檔:配置外接資料庫


附件列表


主題: 二次開發
  • 有幫助
  • 沒幫助
  • 只是瀏覽
  • 圖片不清晰
  • 用語看不懂
  • 功能說明看不懂
  • 操作說明太簡單
  • 內容有錯誤
中文(繁體)

滑鼠選中內容,快速回饋問題

滑鼠選中存在疑惑的內容,即可快速回饋問題,我們將會跟進處理。

不再提示

10s後關閉

獲取幫助
線上支援
獲取專業技術支援,快速幫助您解決問題
工作日9:00-12:00,13:30-17:30在线
頁面反饋
針對當前網頁的建議、問題反饋
售前咨詢
業務咨詢
電話:0933-790886或 0989-092892
郵箱:taiwan@fanruan.com
頁面反饋
*問題分類
不能為空
問題描述
0/1000
不能為空

反馈已提交

网络繁忙