1. 概述
1.1 應用場景
電腦某個目錄下儲存了幾個 XML 檔案,希望把 XML 檔案轉換為報表資料源。如下圖所示,將 Northwind.xml 中的資料轉換為報表資料源。
Northwind.xml 檔案內容如下:
<?xml version="1.0" encoding="UTF-8"?>
<Northwind>
<Customers>
<CustomerID>ALFKI</CustomerID>
<CompanyName>ALfreds Futterkiste</CompanyName>
<ContactName>Maria Anders</ContactName>
<ContactTitle>Sales Representative</ContactTitle>
<Address>Obere Str.57</Address>
<City>Berlin</City>
<PostalCode>12209</PostalCode>
<Country>Germany</Country>
<Phone>030-0074321</Phone>
<Fax>030-0076545</Fax>
</Customers>
</Northwind>
通程式式資料集轉換成報表資料源:
當目錄下有多個檔案時,就可以定義參數,最終實現根據不同的檔案名稱動態獲取不同的 XML 中的內容作為報表資料源。如下圖所示:
1.2 實現原理
FineReport 中可以透過自訂程式資料集來對 XML 欄位資料進行解析,再透過參數的方式,動態獲取 XML 檔案名稱,最終作為報表資料源。
2. 範例
範例將實現 1.1 中的效果,定義程式資料集,透過檔案名稱,獲取特定目錄下的 XML 格式資料,最終解析成適合製作報表的行式資料。
2.1 準備編譯環境
編譯程式前,需先建立一個 Java 工程環境,並且需要一個 Java 編輯器,如 Eclipse 或 idea 。
在編輯器工程中匯入 FineReport 工程 JAR 包。包括安裝的報表工程
%FR_HOME%/lib下的所有的包,
%FR_HOME%/server/lib 下的所有包,
%FR_HOME%/webapps/webroot/WEB-INF/lib下的所有包,
還要引入 JDK 下的的 tools.jar。詳細操作可參考:編譯Java程式
2.2 定義程式資料源
2.2.1 編寫Java檔案
1)在編輯器中編寫 Java 檔案,首先定義參數 name 及 type ,供其他類直接呼叫,安全性比較高。完整程式碼可參見:
2)在編輯器中定義定義 XMLParseDemoDataModel.java 類繼承 AbstractDataModel API,實現 getColumnCount、getColumnName、getRowCount、getValueAt 四個方法。完整程式碼可參見:
注:程式碼中的資料庫連結資訊和資料表資訊需要改成使用者自己存放 xmltest 表的資訊。
3)定義程式資料集 XMLDemoTableData,其中定義一個參數 $filename,動態獲取某個路徑下的 XML 檔案內容,並將其解析成資料列,資料列名稱和 XML 內欄位名稱是一一對應。完整程式碼可參見:
注1:如果 XML 檔案的格式與問題描述處所展示的 XML 格式不一致,則需要修改類中的 deep 變數,把列名所在的節點層數改成相對應的數值。
注2:注意程式碼中XML檔案存放的位置要修改為使用者自己的檔案路徑。
2.2.2 編譯Java檔案
Java 檔案編寫完成後,在編譯器中依次編譯。編譯透過後,將會在編譯器對應工程檔案儲存路徑下生成 class 檔案。如下圖所示:
2.2.3 匯入class檔案
將以上編譯後生成的所有類檔案複製到 %FR_HOME%\webapps\webroot\WEB-INF\classes\com\fr\data工程目錄下。如下圖所示:
注:遠端設計時,本地設計器和遠端伺服器的工程下都需要放置程式資料集對應的 class 檔案。
2.3 建立程式資料集
1)建立普通報表,資料集管理面板建立程式資料集,選擇我們定義好的程式資料集 XMLDemoTableData.class檔案。如下圖所示:
2)選擇 class 後新增一個預設參數 filename,值為 Northwind,如下圖所示:
在範本資料集視窗,點選預覽按鈕,彈出參數對話框,輸入要顯示的 XML 檔案名稱,點選確定則可以把 Northwind.xml 檔案裏面的資料讀取出來轉換報表資料源了,如下圖:
2.4 使用程式資料集
配置好程式資料源後便可以使用自訂的程式資料集,與其他類型的資料集使用方法相同,可以透過拖曳方法實現儲存格資料列綁定。如下圖所示: