FineReport報表軟件API源代碼之程序數(shù)據(jù)集自定義函數(shù)和導出API_第1頁
FineReport報表軟件API源代碼之程序數(shù)據(jù)集自定義函數(shù)和導出API_第2頁
FineReport報表軟件API源代碼之程序數(shù)據(jù)集自定義函數(shù)和導出API_第3頁
FineReport報表軟件API源代碼之程序數(shù)據(jù)集自定義函數(shù)和導出API_第4頁
FineReport報表軟件API源代碼之程序數(shù)據(jù)集自定義函數(shù)和導出API_第5頁
已閱讀5頁,還剩7頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

本文格式為Word版,下載可任意編輯——FineReport報表軟件API源代碼之程序數(shù)據(jù)集自定義函數(shù)和導出API概述

隨著FineReport的發(fā)展,它提供的設計器和服務器應當能夠滿足您絕大部分的需求,完全實現(xiàn)零編碼的軟件開發(fā),革命性地加快軟件開發(fā)速度,提高軟件穩(wěn)定性。但是需求是千變萬化的,而FineReport所包含的功能是報表行業(yè)中比較普遍的、典型的,可能某些特性化的功能通過FineReport軟件無法實現(xiàn)。因此FineReport開放了能夠進行二次開發(fā)的接口,來更好的滿足您軟件產品或項目中的特性化的需求。您可以根據(jù)該引擎API文檔學習各類接口的使用方法,另外若您是一名程序員,且對FineReport報表深感興趣,希望更深入地了解FineReport軟件的內部原理,您也可以閱讀該章節(jié)。

FineReport引擎API文檔對如何定義類、編譯類文件及JAVA開發(fā)平臺使用等JAVA基礎知識未作介紹,因此在您查看引擎API文檔前請確保您有一定的JAVA基礎。

目錄

1.程序數(shù)據(jù)源

2.1簡單程序數(shù)據(jù)集2.2帶參程序數(shù)據(jù)集2.自定義函數(shù)

3.1自定義函數(shù)

3.2SubSection函數(shù)-Oracle查詢參數(shù)個數(shù)限制3.3自定義函數(shù)生產UPC條形碼3.導出api

注:另有報表調用的相關代碼,如有需要可以另行下載。

程序數(shù)據(jù)集

簡單程序數(shù)據(jù)集

FineReport報表的數(shù)據(jù)來源可以是數(shù)據(jù)庫數(shù)據(jù)或是文本數(shù)據(jù),并且還可以是其它任何類型的數(shù)據(jù),由于FineReport是通過TableData接口來讀取數(shù)據(jù)源的,而上述所有的數(shù)據(jù)來源都實現(xiàn)了該接口,因此用戶只要實現(xiàn)了TableData接口,也就可以用自定義類型的數(shù)據(jù)源了(程序數(shù)據(jù)集),F(xiàn)ineReport報表引擎就能夠讀取定義的數(shù)據(jù)源作為報表數(shù)據(jù)源使用。

TableData接口主要有5個方法,如下://獲取TableData的總列數(shù)publicintgetColumnCount();

//獲取TableData中第columnIndex列的列名publicStringgetColumnName(intcolumnIndex);

//判斷是否存在第rowIndex行,這主要是用于處理超大數(shù)據(jù)時,完全遍歷所有數(shù)據(jù)獲取總行數(shù)相當困難,用這個方法來判斷第rowIndex行是否存在,存在則可讀取publicbooleanhasRow(introwIndex);//獲取TableData的總行數(shù)publicintgetRowCount();

//獲取TableData中第columnIndex列,第rowIndex行的數(shù)據(jù)

publicObjectgetValueAt(introwIndex,intcolumnIndex);使用程序數(shù)據(jù)集分為如下三個步驟:

在某些應用場景中,需要在程序中對數(shù)據(jù)進行處理后再作為報表的數(shù)據(jù)源使用,以下例子即為一個簡單的不帶參程序數(shù)據(jù)集ArrayTableData的使用過程,并以此簡要說明程序數(shù)據(jù)集的使用方法。

1.定義程序數(shù)據(jù)源

由之前的概述可知,程序數(shù)據(jù)集需要實現(xiàn)TableData接口,可以直接繼承該接口,實現(xiàn)其5個方法,也可以從AbstractTableData擴展,由于AbstractTableData已經實現(xiàn)了默

認的hasRow(introwIndex)方法。

該例中的程序數(shù)據(jù)集ArrayTableData就是直接從AbstractTableData擴展的,完整代碼如下:

packagecom.fr.data;

importcom.fr.data.AbstractTableData;

publicclassArrayTableDataDemoextendsAbstractTableData{//定義程序數(shù)據(jù)集的列名與數(shù)據(jù)保存位置privateString[]columnNames;privateObject[][]rowData;

//實現(xiàn)構建函數(shù),在構建函數(shù)中準備數(shù)據(jù)publicArrayTableDataDemo(){

String[]columnNames={\,\};

Object[][]datas={{\,newInteger(15)},{\,newInteger(22)},{\,newInteger(99)}};

this.columnNames=columnNames;this.rowData=datas;}

//實現(xiàn)TableData的其他四個方法,由于AbstractTableData已經實現(xiàn)了hasRow方法publicintgetColumnCount(){returncolumnNames.length;}

publicStringgetColumnName(intcolumnIndex){returncolumnNames[columnIndex];}

publicintgetRowCount(){returnrowData.length;}

publicObjectgetValueAt(introwIndex,intcolumnIndex){returnrowData[rowIndex][columnIndex];

}}

1.1把上面代碼復制到txt文檔重命名為ArrayTableDataDemo.java

放到報表環(huán)境/WebReport/WEB-INF/classes/com/fr/data這個目錄下

1.2編譯ArrayTableData.java生成ArrayTableData.class類

將生成的類文件拷貝到報表工程/WEB-INF/classes目錄下。由于該類是在com.fr.data包中的,因此最終應當將該ArrayTableData.class放在

/WEB-INF/classes/com/fr/data下面。此時該程序數(shù)據(jù)源便定義好了。

2.配置程序數(shù)據(jù)源2.1新建報表

在報表數(shù)據(jù)集中新建程序數(shù)據(jù)源,選擇我們定義好的程序數(shù)據(jù)集,如下圖名字可以自定義,如student

3.使用程序數(shù)據(jù)集

配置好程序數(shù)據(jù)源后便可以使用定義的student程序數(shù)據(jù)集了,與其他類型的數(shù)據(jù)集使用方法是一致的,可以通過拖拽方法實現(xiàn)單元格數(shù)據(jù)列綁定。如下圖

帶參程序數(shù)據(jù)集

在實際應用中,可能需要根據(jù)表名動態(tài)地改變數(shù)據(jù)源,譬如在程序數(shù)據(jù)集中,通過傳

進的表名參數(shù),到數(shù)據(jù)庫取出對應的表作為數(shù)據(jù)源。由于FineReport是通過TableData接口來讀取數(shù)據(jù)源的,而上述所有的數(shù)據(jù)來源都實現(xiàn)了該接口,因此用戶只要實現(xiàn)了

TableData接口,也就可以用自定義類型的數(shù)據(jù)源了(程序數(shù)據(jù)集),F(xiàn)ineReport報表引擎就能夠讀取定義的數(shù)據(jù)源作為報表數(shù)據(jù)源使用。以下就對這種狀況舉例說明。

TableData接口主要有5個方法,如下://獲取TableData的總列數(shù)publicintgetColumnCount();

//獲取TableData中第columnIndex列的列名publicStringgetColumnName(intcolumnIndex);

//判斷是否存在第rowIndex行,這主要是用于處理超大數(shù)據(jù)時,完全遍歷所有數(shù)據(jù)獲取總行數(shù)相當困難,用這個方法來判斷第rowIndex行是否存在,存在則可讀取publicbooleanhasRow(introwIndex);//獲取TableData的總行數(shù)publicintgetRowCount();

//獲取TableData中第columnIndex列,第rowIndex行的數(shù)據(jù)publicObjectgetValueAt(introwIndex,intcolumnIndex);使用程序數(shù)據(jù)集分為如下三個步驟:?定義程序數(shù)據(jù)源?配置程序數(shù)據(jù)源?使用程序數(shù)據(jù)集

1.定義程序數(shù)據(jù)源

首先在構建函數(shù)中定義好所用的程序數(shù)據(jù)集表結構,通過參數(shù)獲得表名;其次在初始化函數(shù)中準備數(shù)據(jù)并放入定義的表中;完整代碼如下:packagecom.fr.data;

importjava.sql.Connection;importjava.sql.DriverManager;importjava.sql.ResultSet;

importjava.sql.ResultSetMetaData;importjava.sql.Statement;importjava.util.ArrayList;

importjava.util.logging.Level;importcom.fr.base.FRContext;

importcom.fr.data.AbstractTableData;importcom.fr.report.parameter.Parameter;

publicclassParamTableDataDemoextendsAbstractTableData{//列名數(shù)組,保存程序數(shù)據(jù)集所有列名privateString[]columnNames=null;//定義程序數(shù)據(jù)集的列數(shù)量privateintcolumnNum=10;//保存查詢表的實際列數(shù)量privateintcolNum=0;//保存查詢得到列值

privateArrayListvalueList=null;

//構造函數(shù),定義表結構,該表有10個數(shù)據(jù)列,列名為column#0,column#1,。。。。。。column#9

publicParamTableDataDemo(){//定義tableName參數(shù)

this.parameters=newParameter[]{newParameter(\)};//定義程序數(shù)據(jù)集列名

columnNames=newString[columnNum];for(inti=0;i=colNum){

packagecom.fr.demo;

importcom.fr.report.script.NormalFunction;

publicclassstringcatextendsNormalFunction{publicObjectrun(Object[]args){Stringresult=\;Objectpara;

for(inti=0;ireturnresult;}

}說明:

使用函數(shù)STRINGCAT(Para,Para,Para…..)時,根據(jù)函數(shù)名取得運算該函數(shù)的類STRINGCAT,并將參數(shù)傳入類中的args對象數(shù)組中,執(zhí)行該類的run函數(shù)。

而在run函數(shù)中即實現(xiàn)了將傳入的參數(shù)以字符串的形式連接起來。并返回最終形成的字符串。

2.編譯自定義函數(shù)

將編譯后的STRINGCAT.CLASS放到FineReport的安裝目錄WEB-INF下面的classes目錄下,由于STRINGCAT.JAVA屬于包com.fr.demo,所以STRINGCAT.CLASS需要放到classes\\com\\fr\\demo目錄下。

3.注冊自定義函數(shù)

生成該函數(shù)的類后需要在設計器中進行注冊,才可以使用該函數(shù)。開啟服務器|函數(shù)管理器,選擇剛剛定義好了STRINGCAT類,如下圖

函數(shù)名稱可以自定義,如這邊定義為Stringcat;同時可以添加該函數(shù)的使用說明,如上圖所示的描述4.使用自定義函數(shù)

注冊好自定義函數(shù)后,制作報表時便可直接使用了,使用方法與內置的函數(shù)是一致的。4.1新建報表

4.2定義兩個報表參數(shù)para1、para2,類型分別為字符串型與整形,默認值分別為空字符

串與0

在空白報表的任意單元格里寫入公式:=Stringcat($para1,$para2)(注意:寫入公式的時候在參數(shù)名前加$,說明這是使用的參數(shù))

點擊預覽會彈出填寫參數(shù)的對話框,寫入?yún)?shù)值如下

確定后可以看到結果

說明STRINGCAT公式可以正常使用啦。

SubSection函數(shù)之Oracle查詢參數(shù)個數(shù)限制

如有一個參數(shù)查詢語句:SELECT*FROMStscoreWHEREStdnoIN(${studentno})

實際狀況中studenno可能是根據(jù)其他條件查詢出來的結果列表,可能超過1000個學號,如最終為

SELECT*FROMStscoreWHEREStdnoIN(10001,10002,10003,10004,10005,10006,10007,10008,10009,10010,10011,10012,10013,……,10989,10990,10991,10992,10993,10994,10995,10996,10997,10998,10999,11000,11001)

直接執(zhí)行上述語句,由于studentno參數(shù)的個數(shù)超過了1000個,數(shù)據(jù)庫端將報ORA-01795的錯誤,如下圖

如何解決該問題呢?此時,假使將studentno參數(shù)分割成多段,如以500為單位進行分割,將上述11001個參數(shù)值分為3部分,形成3條查詢條件,便可避免該問題。

即變?yōu)镾ELECT*FROMStscoreWHEREStdnoIN(10001,10002,…,10500)orStdnoIN(10501,10502,…,11000)orStdnoIN(11001)

FineReport并沒有實現(xiàn)該功能的內置函數(shù),對于這種狀況,我們可以自定義一個SubSection分組函數(shù)

該函數(shù)的使用規(guī)則為:SubSection(para)

參數(shù)para為字符串形式,該函數(shù)的作用即將字符串參數(shù)以500為單位進行分割,并返回分割后形成的數(shù)組。完整代碼如下:packagecom.fr.demo;

importcom.fr.report.script.NormalFunction;importcom.fr.report.script.core.FArray;

publicclassSubSectionextendsNormalFunction{publicObjectrun(Object[]args){//獲取第一個對象,即取得傳入的參數(shù)Objectpara=args[0];Stringparastr=para.toString();//由于是復選參數(shù),因此要去掉前后的\和\if(parastr.startsWith(\parastr=parastr.substring(1,parastr.length()-1);}//將字符串轉為\分割的數(shù)組Stringtest[]=parastr.split(\

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論