版權(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 商業(yè)培訓(xùn)中的團(tuán)隊(duì)凝聚力培養(yǎng)與音樂(lè)游戲
- 商業(yè)思維在學(xué)生時(shí)間管理中的應(yīng)用
- 2025中國(guó)航天科工集團(tuán)第十研究院校園招聘593人高頻重點(diǎn)提升(共500題)附帶答案詳解
- 2025中國(guó)科學(xué)院紫金山天文臺(tái)人才公開招聘6人(江蘇南京市第2期)高頻重點(diǎn)提升(共500題)附帶答案詳解
- 2025中國(guó)石化江蘇油田分公司畢業(yè)生招聘10人高頻重點(diǎn)提升(共500題)附帶答案詳解
- 2025中國(guó)電信股份限公司數(shù)字智能科技分公司社會(huì)招聘21人高頻重點(diǎn)提升(共500題)附帶答案詳解
- 2025中國(guó)電信安全公司社會(huì)招聘高頻重點(diǎn)提升(共500題)附帶答案詳解
- 2025中國(guó)核工業(yè)集團(tuán)限公司校園招聘7000人高頻重點(diǎn)提升(共500題)附帶答案詳解
- 2025中國(guó)兵器裝備集團(tuán)限公司總部招聘5人(北京)高頻重點(diǎn)提升(共500題)附帶答案詳解
- 2025中化學(xué)國(guó)際工程限公司招聘32人高頻重點(diǎn)提升(共500題)附帶答案詳解
- 楊功旭主任運(yùn)用六經(jīng)辨證治療肩周炎的學(xué)術(shù)經(jīng)驗(yàn)及用藥規(guī)律
- 電力工程監(jiān)理實(shí)施細(xì)則
- 基于費(fèi)托合成的天然氣制合成油工藝技術(shù)綜述
- 常見(jiàn)抗痛風(fēng)藥物課件整理
- 2023年高考真題-地理(浙江卷)含答案
- 人員招聘與培訓(xùn)實(shí)務(wù)期末復(fù)習(xí)資料
- kv桿塔防腐施工組織設(shè)計(jì)
- 外國(guó)文學(xué)智慧樹知到答案章節(jié)測(cè)試2023年山東師范大學(xué)
- 醫(yī)院侵害未成年人案件強(qiáng)制報(bào)告制度培訓(xùn)課件
- 版管井及輕型井點(diǎn)降水施工方案
- YY/T 0506.6-2009病人、醫(yī)護(hù)人員和器械用手術(shù)單、手術(shù)衣和潔凈服第6部分:阻濕態(tài)微生物穿透試驗(yàn)方法
評(píng)論
0/150
提交評(píng)論