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

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

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

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

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

目錄

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

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

3.1自定義函數(shù)

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

注:另有報(bào)表調(diào)用的相關(guān)代碼,如有需要可以另行下載。

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

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

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

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

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

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

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

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

在某些應(yīng)用場(chǎng)景中,需要在程序中對(duì)數(shù)據(jù)進(jìn)行處理后再作為報(bào)表的數(shù)據(jù)源使用,以下例子即為一個(gè)簡(jiǎn)單的不帶參程序數(shù)據(jù)集ArrayTableData的使用過(guò)程,并以此簡(jiǎn)要說(shuō)明程序數(shù)據(jù)集的使用方法。

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

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

認(rèn)的hasRow(introwIndex)方法。

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

packagecom.fr.data;

importcom.fr.data.AbstractTableData;

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

//實(shí)現(xiàn)構(gòu)建函數(shù),在構(gòu)建函數(shù)中準(zhǔn)備數(shù)據(jù)publicArrayTableDataDemo(){

String[]columnNames={\,\};

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

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

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

publicStringgetColumnName(intcolumnIndex){returncolumnNames[columnIndex];}

publicintgetRowCount(){returnrowData.length;}

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

}}

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

首先在構(gòu)建函數(shù)中定義好所用的程序數(shù)據(jù)集表結(jié)構(gòu),通過(guò)參數(shù)獲得表名;其次在初始化函數(shù)中準(zhǔn)備數(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í)際列數(shù)量privateintcolNum=0;//保存查詢得到列值

privateArrayListvalueList=null;

//構(gòu)造函數(shù),定義表結(jié)構(gòu),該表有10個(gè)數(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;}

}說(shuō)明:

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

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

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

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

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

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

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

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

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

串與0

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

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

確定后可以看到結(jié)果

說(shuō)明STRINGCAT公式可以正常使用啦。

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

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

實(shí)際狀況中studenno可能是根據(jù)其他條件查詢出來(lái)的結(jié)果列表,可能超過(guò)1000個(gè)學(xué)號(hào),如最終為

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í)行上述語(yǔ)句,由于studentno參數(shù)的個(gè)數(shù)超過(guò)了1000個(gè),數(shù)據(jù)庫(kù)端將報(bào)ORA-01795的錯(cuò)誤,如下圖

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

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

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

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

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

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

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

溫馨提示

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

最新文檔

評(píng)論

0/150

提交評(píng)論