




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
本文格式為Word版,下載可任意編輯——FineReport報表軟件API源代碼之程序數據集自定義函數和導出API概述
隨著FineReport的發(fā)展,它提供的設計器和服務器應當能夠滿足您絕大部分的需求,完全實現零編碼的軟件開發(fā),革命性地加快軟件開發(fā)速度,提高軟件穩(wěn)定性。但是需求是千變萬化的,而FineReport所包含的功能是報表行業(yè)中比較普遍的、典型的,可能某些特性化的功能通過FineReport軟件無法實現。因此FineReport開放了能夠進行二次開發(fā)的接口,來更好的滿足您軟件產品或項目中的特性化的需求。您可以根據該引擎API文檔學習各類接口的使用方法,另外若您是一名程序員,且對FineReport報表深感興趣,希望更深入地了解FineReport軟件的內部原理,您也可以閱讀該章節(jié)。
FineReport引擎API文檔對如何定義類、編譯類文件及JAVA開發(fā)平臺使用等JAVA基礎知識未作介紹,因此在您查看引擎API文檔前請確保您有一定的JAVA基礎。
目錄
1.程序數據源
2.1簡單程序數據集2.2帶參程序數據集2.自定義函數
3.1自定義函數
3.2SubSection函數-Oracle查詢參數個數限制3.3自定義函數生產UPC條形碼3.導出api
注:另有報表調用的相關代碼,如有需要可以另行下載。
程序數據集
簡單程序數據集
FineReport報表的數據來源可以是數據庫數據或是文本數據,并且還可以是其它任何類型的數據,由于FineReport是通過TableData接口來讀取數據源的,而上述所有的數據來源都實現了該接口,因此用戶只要實現了TableData接口,也就可以用自定義類型的數據源了(程序數據集),FineReport報表引擎就能夠讀取定義的數據源作為報表數據源使用。
TableData接口主要有5個方法,如下://獲取TableData的總列數publicintgetColumnCount();
//獲取TableData中第columnIndex列的列名publicStringgetColumnName(intcolumnIndex);
//判斷是否存在第rowIndex行,這主要是用于處理超大數據時,完全遍歷所有數據獲取總行數相當困難,用這個方法來判斷第rowIndex行是否存在,存在則可讀取publicbooleanhasRow(introwIndex);//獲取TableData的總行數publicintgetRowCount();
//獲取TableData中第columnIndex列,第rowIndex行的數據
publicObjectgetValueAt(introwIndex,intcolumnIndex);使用程序數據集分為如下三個步驟:
在某些應用場景中,需要在程序中對數據進行處理后再作為報表的數據源使用,以下例子即為一個簡單的不帶參程序數據集ArrayTableData的使用過程,并以此簡要說明程序數據集的使用方法。
1.定義程序數據源
由之前的概述可知,程序數據集需要實現TableData接口,可以直接繼承該接口,實現其5個方法,也可以從AbstractTableData擴展,由于AbstractTableData已經實現了默
認的hasRow(introwIndex)方法。
該例中的程序數據集ArrayTableData就是直接從AbstractTableData擴展的,完整代碼如下:
packagecom.fr.data;
importcom.fr.data.AbstractTableData;
publicclassArrayTableDataDemoextendsAbstractTableData{//定義程序數據集的列名與數據保存位置privateString[]columnNames;privateObject[][]rowData;
//實現構建函數,在構建函數中準備數據publicArrayTableDataDemo(){
String[]columnNames={\,\};
Object[][]datas={{\,newInteger(15)},{\,newInteger(22)},{\,newInteger(99)}};
this.columnNames=columnNames;this.rowData=datas;}
//實現TableData的其他四個方法,由于AbstractTableData已經實現了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下面。此時該程序數據源便定義好了。
2.配置程序數據源2.1新建報表
在報表數據集中新建程序數據源,選擇我們定義好的程序數據集,如下圖名字可以自定義,如student
3.使用程序數據集
配置好程序數據源后便可以使用定義的student程序數據集了,與其他類型的數據集使用方法是一致的,可以通過拖拽方法實現單元格數據列綁定。如下圖
帶參程序數據集
在實際應用中,可能需要根據表名動態(tài)地改變數據源,譬如在程序數據集中,通過傳
進的表名參數,到數據庫取出對應的表作為數據源。由于FineReport是通過TableData接口來讀取數據源的,而上述所有的數據來源都實現了該接口,因此用戶只要實現了
TableData接口,也就可以用自定義類型的數據源了(程序數據集),FineReport報表引擎就能夠讀取定義的數據源作為報表數據源使用。以下就對這種狀況舉例說明。
TableData接口主要有5個方法,如下://獲取TableData的總列數publicintgetColumnCount();
//獲取TableData中第columnIndex列的列名publicStringgetColumnName(intcolumnIndex);
//判斷是否存在第rowIndex行,這主要是用于處理超大數據時,完全遍歷所有數據獲取總行數相當困難,用這個方法來判斷第rowIndex行是否存在,存在則可讀取publicbooleanhasRow(introwIndex);//獲取TableData的總行數publicintgetRowCount();
//獲取TableData中第columnIndex列,第rowIndex行的數據publicObjectgetValueAt(introwIndex,intcolumnIndex);使用程序數據集分為如下三個步驟:?定義程序數據源?配置程序數據源?使用程序數據集
1.定義程序數據源
首先在構建函數中定義好所用的程序數據集表結構,通過參數獲得表名;其次在初始化函數中準備數據并放入定義的表中;完整代碼如下: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{//列名數組,保存程序數據集所有列名privateString[]columnNames=null;//定義程序數據集的列數量privateintcolumnNum=10;//保存查詢表的實際列數量privateintcolNum=0;//保存查詢得到列值
privateArrayListvalueList=null;
//構造函數,定義表結構,該表有10個數據列,列名為column#0,column#1,。。。。。。column#9
publicParamTableDataDemo(){//定義tableName參數
this.parameters=newParameter[]{newParameter(\)};//定義程序數據集列名
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;}
}說明:
使用函數STRINGCAT(Para,Para,Para…..)時,根據函數名取得運算該函數的類STRINGCAT,并將參數傳入類中的args對象數組中,執(zhí)行該類的run函數。
而在run函數中即實現了將傳入的參數以字符串的形式連接起來。并返回最終形成的字符串。
2.編譯自定義函數
將編譯后的STRINGCAT.CLASS放到FineReport的安裝目錄WEB-INF下面的classes目錄下,由于STRINGCAT.JAVA屬于包com.fr.demo,所以STRINGCAT.CLASS需要放到classes\\com\\fr\\demo目錄下。
3.注冊自定義函數
生成該函數的類后需要在設計器中進行注冊,才可以使用該函數。開啟服務器|函數管理器,選擇剛剛定義好了STRINGCAT類,如下圖
函數名稱可以自定義,如這邊定義為Stringcat;同時可以添加該函數的使用說明,如上圖所示的描述4.使用自定義函數
注冊好自定義函數后,制作報表時便可直接使用了,使用方法與內置的函數是一致的。4.1新建報表
4.2定義兩個報表參數para1、para2,類型分別為字符串型與整形,默認值分別為空字符
串與0
在空白報表的任意單元格里寫入公式:=Stringcat($para1,$para2)(注意:寫入公式的時候在參數名前加$,說明這是使用的參數)
點擊預覽會彈出填寫參數的對話框,寫入參數值如下
確定后可以看到結果
說明STRINGCAT公式可以正常使用啦。
SubSection函數之Oracle查詢參數個數限制
如有一個參數查詢語句:SELECT*FROMStscoreWHEREStdnoIN(${studentno})
實際狀況中studenno可能是根據其他條件查詢出來的結果列表,可能超過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參數的個數超過了1000個,數據庫端將報ORA-01795的錯誤,如下圖
如何解決該問題呢?此時,假使將studentno參數分割成多段,如以500為單位進行分割,將上述11001個參數值分為3部分,形成3條查詢條件,便可避免該問題。
即變?yōu)镾ELECT*FROMStscoreWHEREStdnoIN(10001,10002,…,10500)orStdnoIN(10501,10502,…,11000)orStdnoIN(11001)
FineReport并沒有實現該功能的內置函數,對于這種狀況,我們可以自定義一個SubSection分組函數
該函數的使用規(guī)則為:SubSection(para)
參數para為字符串形式,該函數的作用即將字符串參數以500為單位進行分割,并返回分割后形成的數組。完整代碼如下:packagecom.fr.demo;
importcom.fr.report.script.NormalFunction;importcom.fr.report.script.core.FArray;
publicclassSubSectionextendsNormalFunction{publicObjectrun(Object[]args){//獲取第一個對象,即取得傳入的參數Objectpara=args[0];Stringparastr=para.toString();//由于是復選參數,因此要去掉前后的\和\if(parastr.startsWith(\parastr=parastr.substring(1,parastr.length()-1);}//將字符串轉為\分割的數組Stringtest[]=parastr.split(\
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 中洲控股財務風險評價研究
- 面向危化品運輸列車的TRDP網卡研發(fā)與應用
- 鄉(xiāng)村診所采購合同范例
- 黨員教育培訓合同范例
- 中石油合作合同范例
- 2008正式員工合同范例
- 分租協議合同范例
- 中山美容院加盟合同范例
- 農村占地賠償合同范例
- 二手機器設備銷售合同范例
- 流浪犬收容管理服務方案
- 全國高中青年數學教師優(yōu)質課大賽一等獎《導數在研究函數中的應用》課件
- 礦山巖石力學教案
- 【海馬汽車企業(yè)營運能力問題及解決策略(論文10000字)】
- 永安電力股份有限公司三臺縣凱河110千伏輸變電新建工程環(huán)評報告
- 口腔頜面外科基礎知識與基本操作-口腔頜面外科手術基本操作(口腔頜面外科課件)
- 學院(校)食堂餐飲企業(yè)承包經營退出管理制度
- 急危重癥護理學3
- API520-安全閥計算PART1(中文版)
- 本科畢設論文--企業(yè)vpn的接入規(guī)劃與設計
- 藥學綜合知識與技能智慧樹知到答案章節(jié)測試2023年云南農業(yè)職業(yè)技術學院
評論
0/150
提交評論