專利名稱:一種自定義報(bào)表的生成管理方法及系統(tǒng)的制作方法
技術(shù)領(lǐng)域:
本發(fā)明涉及計(jì)算機(jī)領(lǐng)域,更具體地說,涉及一種自定義報(bào)表的生成管理方法及系統(tǒng)。
背景技術(shù):
目前國內(nèi)各行業(yè)的各種應(yīng)用系統(tǒng)對二次開發(fā)的要求越來越高。其中很多系統(tǒng)都明確指出 了軟件系統(tǒng)要有自定義報(bào)表系統(tǒng),可由用戶自行設(shè)計(jì)、定義報(bào)表。 一些軟件產(chǎn)品中也實(shí)現(xiàn)了 自定義報(bào)表模塊,但卻不是完全意義上的自定義報(bào)表,只是提供了一些標(biāo)準(zhǔn)的報(bào)表樣式,操 作員可在提供的報(bào)表樣式上選擇一些系統(tǒng)提供的數(shù)據(jù)項(xiàng),用來生成報(bào)表。這種報(bào)表有幾個(gè)缺 陷擴(kuò)展性差,如果需要的數(shù)據(jù)項(xiàng)報(bào)表模塊未提供或如果所需的數(shù)據(jù)展示樣式有所改變,而 系統(tǒng)提供的已有樣式不支持,就無法生成所需報(bào)表;也不能支持完全的自定義査詢條件定義 。另有一些軟件產(chǎn)品,如iR印ort,Birt等,這些報(bào)表工具提供了自定義的報(bào)表設(shè)計(jì)器,可以 在報(bào)表里使用SQL査詢、Java Bean。但這些報(bào)表工具只是一個(gè)報(bào)表生成工具,運(yùn)行時(shí)要靠外 部程序來調(diào)用并提供參數(shù)或數(shù)據(jù)才能生成報(bào)表文件,本身并不是一個(gè)報(bào)表運(yùn)行平臺,不能進(jìn) 行報(bào)表發(fā)布,生成自定義査詢條件。
發(fā)明內(nèi)容
本發(fā)明要解決的技術(shù)問題在于,針對現(xiàn)有技術(shù)的上述擴(kuò)展性差、不支持自定義査詢條件 的缺陷,提供一種擴(kuò)展性好、支持自定義査詢條件的一種自定義報(bào)表的生成管理方法及系統(tǒng)
本發(fā)明解決其技術(shù)問題所采用的技術(shù)方案是構(gòu)造一種自定義報(bào)表生成管理方法,用于 瀏覽器/服務(wù)器結(jié)構(gòu),包括如下步驟
A) 在瀏覽器上調(diào)用服務(wù)器上運(yùn)用程序,顯示服務(wù)器上所有報(bào)表清單的報(bào)表頁面, 選擇其中一個(gè)報(bào)表;
B) 服務(wù)器生成所選報(bào)表,傳送到所述瀏覽器。 在本發(fā)明所述的自定義報(bào)表生成管理方法中,還包括在所述服務(wù)器上建立報(bào)表文件,其
包括
M)使用Excel生成多個(gè)存儲在服務(wù)器內(nèi)的報(bào)表文件。在本發(fā)明所述的自定義報(bào)表生成管理方法中,所述步驟M)中進(jìn)一步包括如下步驟 Ml)使用Excel得到報(bào)表模板,生成模板文件;
M2)將所述模板文件分區(qū)段,并定義所述模板文件中的每個(gè)區(qū)段,生成樣式文件 M3)定義上述各區(qū)段中的數(shù)據(jù),生成定義文件;
M4)將上述文件傳送到服務(wù)器的報(bào)表目錄中指定位置,得到一個(gè)報(bào)表文件。 在本發(fā)明所述的自定義報(bào)表生成管理方法中,所述步驟M2)中所述定義區(qū)段包括定義 該區(qū)段中放置的數(shù)據(jù)項(xiàng)、所述數(shù)據(jù)項(xiàng)的位置以及所述數(shù)據(jù)的顯示格式。
在本發(fā)明所述的自定義報(bào)表生成管理方法中,所述步驟M3)中所述定義所述區(qū)段中的數(shù) 據(jù)包括數(shù)據(jù)的來源、數(shù)據(jù)査詢方式、數(shù)據(jù)査詢條件、數(shù)據(jù)計(jì)算以及數(shù)據(jù)填充。
在本發(fā)明所述的自定義報(bào)表生成管理方法中,所述步驟M4)進(jìn)一步包括如下步驟 M41)將所述模板文件、樣式文件和定義文件傳送到所述服務(wù)器指定目錄中; M42)刷新報(bào)表頁面,得到上述文件所生成的報(bào)表之清單。 在本發(fā)明所述的自定義報(bào)表生成管理方法中,所述步驟B)進(jìn)一步包括 Bl)產(chǎn)生該報(bào)表査詢條件輸入頁面;
B2)依據(jù)所述査詢條件輸入頁面的內(nèi)容,査詢數(shù)據(jù),生成報(bào)表; B3)輸出生成的報(bào)表到所述瀏覽器。
本發(fā)明還揭示了一種自定義報(bào)表生成管理系統(tǒng),用于瀏覽器/服務(wù)器架構(gòu),所述服務(wù)器
上包括
報(bào)表運(yùn)行引擎用于解析報(bào)表定義文件,査詢報(bào)表需要的數(shù)據(jù)以及生成報(bào)表; 報(bào)表管理平臺用于發(fā)布、管理各類報(bào)表;
報(bào)表運(yùn)行平臺用于顯示在所述管理平臺上發(fā)布的報(bào)表清單,當(dāng)所述報(bào)表清單中 的一個(gè)被選中時(shí),調(diào)用所述運(yùn)行引擎,査找、生成報(bào)表,并輸出。
在本發(fā)明所述的系統(tǒng)中,所述報(bào)表運(yùn)行引擎進(jìn)一步包括用于在所述報(bào)表清單中一個(gè)報(bào)表 被選拔中時(shí)產(chǎn)生査詢條件輸入頁面的査詢條件輸入頁面產(chǎn)生單元。
在本發(fā)明所述的系統(tǒng)中,所述報(bào)表管理平臺包括用于存放所述報(bào)表定義文件的報(bào)表定 義文件存放目錄、用于存放所述報(bào)表模板文件和樣式文件的報(bào)表模板文件和樣式文件存放目 錄、用于存放于報(bào)表綁定數(shù)據(jù)源的自定義數(shù)據(jù)源綁定報(bào)表存放目錄、用于存放申明文件的自 定義函數(shù)申明文件存放目錄以及用于存放所述査詢頁面的自定義査詢條件頁面存放目錄。
實(shí)施本發(fā)明的自定義報(bào)表的生成管理方法及系統(tǒng),具有以下有益效果由于每個(gè)報(bào)表文件的模板中包括模板文件、樣式文件和定義文件,因此,生成報(bào)表時(shí)報(bào)表的格式和報(bào)表的數(shù) 據(jù)是分開生成后在組合的。故其擴(kuò)展性較好、支持自定義査詢條件。
圖l是本發(fā)明自定義報(bào)表的生成管理方法及系統(tǒng)實(shí)施例中報(bào)表的生成流程圖;
圖2是所述實(shí)施例中報(bào)表清單生成流程圖3是所述實(shí)施例中系統(tǒng)結(jié)構(gòu)示意圖4是所述實(shí)施例中報(bào)表管理平臺中目錄結(jié)構(gòu)示意圖。
具體實(shí)施例方式
下面將結(jié)合附圖對本發(fā)明實(shí)施例作進(jìn)一步說明。
如圖1所示,在本發(fā)明自定義報(bào)表的生成管理方法及系統(tǒng)實(shí)施例中,其報(bào)表生成方法包
括如下步驟
步驟Sll顯示報(bào)表清單,并選中其中一個(gè)在本步驟中,在瀏覽器上調(diào)用服務(wù)器上運(yùn)用 程序,顯示服務(wù)器上所有報(bào)表清單的報(bào)表頁面,并選中其中一個(gè)報(bào)表。
步驟S12產(chǎn)生報(bào)表査詢輸入頁面服務(wù)器收到瀏覽器提交的被選中報(bào)表后,在上述瀏覽 器上產(chǎn)生一個(gè)報(bào)表査詢輸入頁面,該査詢輸入頁面的作用是用來進(jìn)一步定義該報(bào)表的數(shù)據(jù)來 源、數(shù)據(jù)格式等與報(bào)表中數(shù)據(jù)相關(guān)的事項(xiàng)。
步驟S13依據(jù)所述査詢輸入頁面內(nèi)容,査詢數(shù)據(jù),生成報(bào)表由于報(bào)表的模式和報(bào)表中 的數(shù)據(jù)都已被定義,所以,在本步驟中,就是將上述各部分組織起來,生成報(bào)表。
步驟S14輸出所生成的報(bào)表在本步驟中,將上述生成的報(bào)表傳送到所述瀏覽器上顯示 出來。
上面的步驟可以描述如下點(diǎn)擊一個(gè)報(bào)表,按照配置的輸入?yún)?shù)生成輸入査詢條件的頁
面,輸入指定的査詢條件并提交,報(bào)表引擎査詢數(shù)據(jù),生成報(bào)表文件并以Html格式輸出到瀏 覽器顯示出來。也可輸出為Excel文件。根據(jù)定義中的輸入?yún)?shù)生成輸入査詢條件的頁面; 輸入査詢條件,提交査詢;從提交的表單中獲得査詢參數(shù)的輸入值;將査詢條件送給各個(gè)數(shù) 據(jù)源執(zhí)行査詢;將査詢返回的結(jié)果放在數(shù)據(jù)對象集合中;對數(shù)據(jù)對象集合中的數(shù)據(jù)進(jìn)行再計(jì) 算、統(tǒng)計(jì)等處理;生成ExcelR印ort對象,將數(shù)據(jù)對象集合中的數(shù)據(jù)輸出到ExcelR印ort對象 ,生成報(bào)表文件。
在圖1中,我們直接調(diào)用了報(bào)表清單,但是,該報(bào)表清單同樣是需要在事先構(gòu)建的。圖2示出了報(bào)表清單的構(gòu)造流程,在圖2中,包括如下步驟
步驟S21使用Excel得到報(bào)表模板,生成模板文件在本步驟中,按照需求,用Excel畫 報(bào)表模板。生成一個(gè)Excel格式的模板文件(xls文件)。
步驟S22生成上述報(bào)表模板的樣式文件將模板按以上方式分好各個(gè)區(qū)段,定好每個(gè)區(qū) 段中要放置的數(shù)據(jù)項(xiàng)。以及數(shù)據(jù)項(xiàng)的位置,顯示格式等。將這些配置信息記錄在樣式文件中 。生成一個(gè)樣式文件(xml文件)。
步驟S23生成上述報(bào)表模板的定義文件設(shè)計(jì)報(bào)表的數(shù)據(jù)來源,如何査詢,査詢條件。 原始査詢數(shù)據(jù)是否需要再計(jì)算處理。數(shù)據(jù)填充(與樣式文件中定義的數(shù)據(jù)項(xiàng)相匹配)。將這 些配置信息記錄在報(bào)表定義文件中。生成一個(gè)定義文件(xml文件)。
步驟S24存儲上述文件到指定目錄,得到報(bào)表文件在本步驟中,將上述三個(gè)文件上傳 到服務(wù)器指定目錄中,即可得到報(bào)表文件。
步驟S25刷新報(bào)表頁面,得到報(bào)表清單在報(bào)表頁面里刷新列表,就可以看到新提交的 報(bào)表。
事先多次重復(fù)上述步驟S21到S25,即可配置多個(gè)報(bào)表模板,當(dāng)然,如果臨時(shí)需要增加一 個(gè)報(bào)表模板,也可以單獨(dú)執(zhí)行上述步驟S21到S25。
在本實(shí)施例中,樣式文件中定義了報(bào)表的輸入?yún)?shù),數(shù)據(jù)源,數(shù)據(jù)計(jì)算方法,數(shù)據(jù)輸出 等;而定義文件是一個(gè)標(biāo)準(zhǔn)格式的XML文件,其格式符合XML文件格式的要求。以UTF-8作為 編碼格式。
本實(shí)施例中還揭示了一種自定義報(bào)表生成管理系統(tǒng),該系統(tǒng)用于瀏覽器/服務(wù)器架構(gòu), 所述服務(wù)器上包括用于解析報(bào)表定義文件,査詢報(bào)表需要的數(shù)據(jù)以及生成報(bào)表的報(bào)表運(yùn)行 引擎l、用于發(fā)布、管理各類報(bào)表的報(bào)表管理平臺3和用于顯示在所述管理平臺上發(fā)布的報(bào)表 清單、當(dāng)所述報(bào)表清單中的一個(gè)被選中時(shí),調(diào)用所述報(bào)表運(yùn)行引擎l去査找、生成、輸出報(bào) 表的報(bào)表運(yùn)行平臺2。上述報(bào)表運(yùn)行引擎l、報(bào)表運(yùn)行平臺2和報(bào)表管理平臺3之間的結(jié)構(gòu)如圖 3所示。其中,所述報(bào)表運(yùn)行引擎l進(jìn)一步包括用于在所述報(bào)表清單中一個(gè)報(bào)表被選拔中時(shí)產(chǎn) 生査詢條件輸入頁面的査詢條件輸入頁面產(chǎn)生單元。
如上所述,報(bào)表管理平臺3用于發(fā)布管理各類報(bào)表,其實(shí)質(zhì)上是對這些報(bào)表的目錄進(jìn)行 管理,如圖4所示,報(bào)表管理平臺3中得目錄包括用于存放所述報(bào)表定義文件的報(bào)表定義文 件存放目錄31 、用于存放所述報(bào)表模板文件和樣式文件的報(bào)表模板文件和樣式文件存放目錄 32、用于存放于報(bào)表綁定數(shù)據(jù)源的自定義數(shù)據(jù)源綁定報(bào)表存放目錄33、用于存放申明文件的 自定義函數(shù)申明文件存放目錄34以及用于存放所述査詢頁面的自定義査詢條件頁面存放目錄35。
如前所述,在本實(shí)施例中,系統(tǒng)啟動,加載自定義函數(shù)聲明文件,加載字典表定義、數(shù) 據(jù)源定義等;當(dāng)一個(gè)自定義報(bào)表名稱被選中時(shí),系統(tǒng)啟動自定義報(bào)表引擎(Engine)處理, 其過程如下首先根據(jù)報(bào)表定義文件構(gòu)造一個(gè)報(bào)表定義對象(R印c)rtDefine對象),然后根 據(jù)該定義對象構(gòu)造一個(gè)自定義報(bào)表處理引擎(Engine)類實(shí)例;從
R印ortDefine. inputParameters中可得知為該報(bào)表定義的自定義査詢條件,為每一個(gè)査詢條 件生成對應(yīng)的査詢條件輸入控件。最后生成輸入各個(gè)査詢條件的頁面。輸入完査詢條件后提 交時(shí),系統(tǒng)按照査詢條件中定義的檢驗(yàn)方法對輸入值進(jìn)行校驗(yàn),校驗(yàn)成功才可以提交査詢。 提交査詢之后,系統(tǒng)處理提交的査詢條件,將所有的參數(shù)輸入值放入Engine. inputData中; 并逐個(gè)處理R印ortDefine中的數(shù)據(jù)源定義對于SQL數(shù)據(jù)源,處理SQL中的嵌入式表達(dá)式,得 到目標(biāo)SQL語句,執(zhí)行査詢,得到査詢結(jié)果,將査詢結(jié)果DataSet放入Engine. data中;對于 Java數(shù)據(jù)源,通過調(diào)用自定義函數(shù),執(zhí)行一個(gè)Java方法。將該方法返回的數(shù)據(jù)對象放入 Engine, data中;對于DSF數(shù)據(jù)源,首先構(gòu)造一個(gè)DSF對象,然后在該對象上執(zhí)行査詢,將返 回的DataSet對象放入Engine. data中。在處理完上述數(shù)據(jù)源定義后根據(jù)R印ortDef ine中 .calData部分的定義,Engine, data中存放的數(shù)據(jù)對象進(jìn)行再計(jì)算,比方說產(chǎn)生一些統(tǒng)計(jì)數(shù) 據(jù)等??尚薷囊延袑ο笾械臄?shù)據(jù),也可產(chǎn)生新數(shù)據(jù)。新輸入一般存入一個(gè)新的map中。當(dāng)上 述數(shù)據(jù)再計(jì)算完成后,根據(jù)報(bào)表樣式文件構(gòu)造一個(gè)ExcelEngine對象,然后按照 R印ortDefine. segmentDatafile中對各區(qū)段的數(shù)據(jù)項(xiàng)定義輸出數(shù)據(jù)至UExcelEngine對象;如 果綁定整個(gè)區(qū)段到一個(gè)數(shù)據(jù)對象上的,將數(shù)據(jù)對象從Engine. data中取出來,直接提交給 ExcelEngine對象,生成報(bào)表的相應(yīng)部分;如果區(qū)段數(shù)據(jù)項(xiàng)為逐個(gè)配置的,首先構(gòu)造一個(gè)新 的map,調(diào)用自定義函數(shù)和嵌入式表達(dá)式處理引擎,對數(shù)據(jù)項(xiàng)配置公式進(jìn)行計(jì)算,將數(shù)據(jù)項(xiàng) 名稱和計(jì)算結(jié)果放入map,該區(qū)段的全部數(shù)據(jù)項(xiàng)都處理完后,將整個(gè)map提交給ExcelEngine 對象,生成報(bào)表的相應(yīng)部分。至此,報(bào)表生成完畢。
如果需要按Html樣式將報(bào)表內(nèi)容顯示在客戶瀏覽器上,那么調(diào)用ExcelEngine的e鄧ort 方法,得到Html格式的報(bào)表內(nèi)容,然后將Html內(nèi)容寫入到response,最終顯示在客戶瀏覽器 上。 一般來說,報(bào)表內(nèi)容應(yīng)顯示在獨(dú)立的frame里;如果需要生成Excel文件供客戶下載到本 機(jī),那么調(diào)用ExcelEngine的export方法,得到byte[]格式的Excel文件內(nèi)容,然后將數(shù)據(jù)直 接寫入response,客戶瀏覽器就會提示下載或打開Excel文件;如果需要在服務(wù)器端生成 Excel文件,可調(diào)用ExcelEngine.write方法,將報(bào)表內(nèi)容寫入到Excel格式的文件中。至此 ,報(bào)表輸出到客戶端。上面說過,定義文件是一個(gè)標(biāo)準(zhǔn)格式的XML文件,其格式符合XML文件格式的要求。以 UTF-8作為編碼格式。本實(shí)施例中的定義文件如下 普通明細(xì)表—SQL數(shù)據(jù)源—操作員清單.xml 〈?xml version=〃l.0〃 encoding=〃UTF-8〃 ?〉 〈r印ortdef ine〉 〈r印ort-def ine name = 〃操作員清單" type = 〃grid〃
stylefile薩e = 〃DataSet普通明細(xì)表—操作員清單—style, xml〃 /〉
〈input-parameters〉 〈item
no = 〃1〃
name = "s—gdj"
displaytext = 〃所屬供電局
datatype = 〃c〃
allowignore = "false"
min = 〃〃
max = "" /〉 /input-parameters)
〈datasource〉 〈sql name = 〃czy〃
sql = 'select a.氺,b. s—itemvalue as s—gdj—text, c. s—mc as s—js—text
from czy a,pub—dictitem b,js c
where a. s—gdj = b. s—itemid and b. n—typeid = 7
and a. s—jsbh = c. s—jsbhorder by a. s—czybh'
Zdatasource〉
〈caldata〉 〈/caldata〉
segment-data〉 〈title bind = 〃false〃 〉
〈item name = 〃title〃 formula = ,getlnput (e,〃s—gdj. text〃), / 〈item name = 〃printdate〃 formula = ' today()' /〉 〈/title〉
〈body bind = 〃true〃 type = 〃dataset〃 source = 〃czy〃 /
/segment-data〉
〈remark〉xml文本中,小于-< 大于-> 雙引號-" 單引號
'〈/remark〉
〈/reportdefine〉
該文件就是一個(gè)標(biāo)準(zhǔn)格式的XML文件,格式符合XML文件格式的要求。以UTF-8作為編碼 格式。
注意在定義節(jié)點(diǎn)屬性時(shí),屬性內(nèi)容必須符合XML文件的格式要求。其中的幾個(gè)特殊字 符應(yīng)使用轉(zhuǎn)義符。小于(〈)-< 大于(>)-> 雙引號(")-"單引號(')-
fe鄰os;
〈和 > 符號必須使用轉(zhuǎn)義符。
如果屬性定義是以雙引號開頭的,那么屬性內(nèi)容里可使用單引號,但雙引號必須使用轉(zhuǎn) 義符。
如果屬性定義是以單引號開頭的,那么屬性內(nèi)容里可使用雙引號,但單引號必須使用轉(zhuǎn) 義符。
在本實(shí)施例的定義文件中,根節(jié)點(diǎn)的名稱為〈r印ortdefine〉, 〈r印ortdefine〉的第一個(gè) 子結(jié)點(diǎn)是〈r印ort-define〉,該節(jié)點(diǎn)是對整個(gè)報(bào)表的定義,有以下屬性 〈report-define name = 〃操作員清單" type = 〃grid〃
stylefile薩e = 〃DataSet普通明細(xì)表—操作員清單—style, xml〃 /> 在上面描述的屬性中,name :報(bào)表名稱,String,運(yùn)行時(shí)如果輸出Excel文件,則 Excel文件名就是這個(gè)名字。
type : 報(bào)表類另J, Sting, 可選值card/grid/group card -卡片報(bào)表,單記錄, 一個(gè)表體 grid -明細(xì)報(bào)表, 一個(gè)表頭、表尾,多個(gè)明細(xì)區(qū)
group -分組報(bào)表, 一個(gè)表頭、表尾,多個(gè)分組。每個(gè)分組里可以有一個(gè)分組頭、分 組尾,多個(gè)明細(xì)區(qū)。
stylefilename :該報(bào)表所使用的樣式文件名,String,注意只有文件名 ,沒有路徑,路徑定義在全局參數(shù)里。
在本實(shí)施例的定義文件中,輸入?yún)?shù)定義在〈input-parameters〉段里。這些參數(shù)可以是 簡單輸入?yún)?shù)、映射到數(shù)據(jù)源字段上的輸入?yún)?shù)、復(fù)雜輸入?yún)?shù)以及自定義査詢條件頁面。 如果報(bào)表不需要輸入?yún)?shù),〈input-parameters〉段可以沒有子結(jié)點(diǎn)。 當(dāng)這些參數(shù)是簡單輸入?yún)?shù)時(shí),其代碼如下 〈input-parameters〉 〈item no = 〃1〃 name = "s—gdj"show = "true" datatype = 〃c〃 allowignore = "false" min = 〃〃 max ="" initralue = "0001,, /〉 〈/input-parameters〉 每一個(gè)輸入?yún)?shù)是一個(gè)Item項(xiàng)。其中
no :該輸入?yún)?shù)的序號,int, >=1,不能省略 name :該輸入?yún)?shù)的名稱,String,不能省略 displaytext :該輸入?yún)?shù)的標(biāo)簽。String,該標(biāo)簽運(yùn)行時(shí)顯示在輸入控件的左邊 。如果設(shè)置了mapping屬性,可使用字段的中文名做標(biāo)簽,可省略。
show :是否顯示該輸入?yún)?shù)。Boolean。默認(rèn)為true。如果設(shè)置為false,則程序 運(yùn)行時(shí)只輸出一個(gè)名為name的〈hidden〉對象,但不顯示該輸入?yún)?shù)??稍诔绦蛑性O(shè)置值。 show = false時(shí),其他mapping屬性,render屬性都不再起作用。
datatype :該輸入?yún)?shù)的數(shù)據(jù)類型,String,可選值為c/n/d,即字符型/數(shù)字 型/日期時(shí)間型。默認(rèn)為字符型。參數(shù)為簡單輸入?yún)?shù)時(shí),不可省略。
allowignore :該輸入?yún)?shù)是否可忽略,Boolean, " true" /" false",默認(rèn)為" true"。如果該參數(shù)定義為false,則運(yùn)行時(shí)必須輸入該參數(shù)査詢才可提交。
min :允許輸入的最小值,String。數(shù)據(jù)類型為數(shù)字型或日期型時(shí)起作用。如果不為 空,則輸入完該參數(shù)提交査詢時(shí)會進(jìn)行最小值檢査。如果不需要檢査,則為空。
max :允許輸入的最大值,String。數(shù)據(jù)類型為數(shù)字型或日期型時(shí)起作用。如果不為 空,則輸入完該參數(shù)提交査詢時(shí)會進(jìn)行最大值檢査。如果不需要檢査,則為空。
initvalue :初始值。String,可為空。運(yùn)行時(shí)該值會顯示在輸入控件中作為默認(rèn) 值。Initvalue可使用嵌入式表達(dá)式。如initvalue =
'[%=getSessionAttr(〃GDJBH—String〃)%]'運(yùn)行時(shí)將會以當(dāng)前登錄操作員所在的供電局編號 作為初始值。關(guān)于嵌入式表達(dá)式,將在后續(xù)章節(jié)介紹。
以上定義了一個(gè)最基本的輸入?yún)?shù)。運(yùn)行時(shí)査詢頁面會顯示一個(gè)文本框用來手動輸入供 電局編號。并且不能為空。如果需要使用其他方式輸入?yún)?shù),如使用下拉框來顯示可選供電局,或者使用 dtpicker來顯示一個(gè)日期,那么可使用映射到數(shù)據(jù)源上的某個(gè)字段的配置信息來生成輸入?yún)?數(shù)(關(guān)于數(shù)據(jù)源的含義請參閱相關(guān)文檔),其代碼如下 〈item no= 〃1〃 name = "s—gdj" display text = 〃所屬供電局" mapping = 〃unireport—inputparameter.s—gdj〃 allowignore = 〃false〃 initvalue = "0001" />
其中,mapping :映射到某個(gè)數(shù)據(jù)源對象的某個(gè)字段上。String。格式為數(shù)據(jù)源對 象名稱.字段名稱。比如說,系統(tǒng)數(shù)據(jù)源unir印ort—inputparameter中定義了一個(gè)名為 s—gdj的字段,那么運(yùn)行時(shí)就會生成一個(gè)不可編輯的下拉框,然后以字典表"供電局"中的 項(xiàng)目來填充該下拉框。
映射到數(shù)據(jù)源字段上的輸入?yún)?shù)可表現(xiàn)為文本框,可編輯的下拉框,不可編輯的下 拉框,checkbox, DTPicker,按鈕等各種樣式。并且可以設(shè)置最大值最小值等條件。
對某些特別復(fù)雜的輸入?yún)?shù),如輸入供電局時(shí),希望輸入控件為一個(gè)〈hidden〉記錄供電 局編號,然后再顯示一個(gè)不可編輯的文本框顯示供電局名稱,然后旁邊再顯示一個(gè)選擇按鈕 。按下選擇按鈕彈出一個(gè)選擇供電局的窗口,選擇了一個(gè)供電局之后,將選擇供電局的編號 記錄在〈hidden〉中,將選擇供電局的名稱顯示在文本框中。這種復(fù)雜的情況,可使用 render方法渲染出一個(gè)特殊的輸入控件。其代碼如下 〈item no= 〃1〃 name = "s—gdj" show = 〃true〃 displaytext = 〃供電局〃 render = "Render—Gdj (' s—gd j')" initvalue = ' 00011園區(qū)供電局' />
其中,render :定義渲染方法。String。這里渲染方法是指程序運(yùn)行時(shí)在標(biāo)簽右邊先生成一個(gè)名為div—s—gdj的層,內(nèi)容為空,然后在頁面的body—onload事件里再調(diào)用JS腳 本中相應(yīng)的渲染對象生成div—s—gdj的內(nèi)容。如上生成文本框和按鈕,并響應(yīng)按鈕按下事件
如上,事先在一個(gè)名為userfunction. js文件中定義了Render—Gdj這渲染對象。代碼如
下
var Render—Gdj = Class, create (); Render—Gdj. prototype-{
id:〃〃,
text: 〃〃,
initialize:f皿ction(id) { this, id = id; this, text = id + 〃.text〃;
toString:function 0 { return 〃〈i叩ut type=, hidden' id=, 〃 + this, id + 〃' name=, 〃 + this, id
〃'〉〃 +
〃〈i叩ut type = 'text' id=, 〃 + this, text + 〃' name二'〃 + this, text + class=' input—80width' readonly〉〃 +
〃〈i叩ut type二' button' value二' V title二'選擇供電局'class二' button' style='width:15'onclick='javascript:render—〃 + this, id + 〃.onclick 0 ;'〉"
onclick:f皿ctioiiO { var ret = pub—select—record(
〃請選擇一個(gè)供電局",
〃供電局編號I 10 I cT供電局名稱I 20 I c〃,
"select s—itemid, s—itemvalue from pub—dictitem where n—typeid = 7 order by s—itemid〃);
if (ret == null) return;$ (this. id), value = ret[O]; $(this.text).value = ret[l];
render:function(div){ if(div == null || div == undefined){
$(〃div—〃 + this. id). i匿r匿L = this. toString(); }else{
$(div).imierHTMl = this. toString();
setValue:function(value){ if(value == null || value == return; var ss = value, split ('T); $ (this, id). value = ss[O]; if(ss.length > 1) { $(this, text).value = ss[l];
運(yùn)行時(shí),査詢條件頁面會生成一個(gè)名為render—s—gdj的JS對象,然后調(diào)用 render—s—gdj. render ()方法生成div—s—gdj的內(nèi)容。通過使用渲染對象,可生成任何復(fù)雜的 査詢條件輸入框。
對于特別復(fù)雜的査詢條件。如果無法使用以上方法生成,那操作員也可自定義査詢條 件的頁面,保存為html文件或jsp文件。然后將文件上傳到指定目錄中,并在 〈input-parameters〉節(jié)點(diǎn)里添加屬性searchpage指明該報(bào)表使用一個(gè)自定義的査詢頁面。 如
〈input-parameters searchpage二" /unireport—searchpage/operator—list, jsp
指定了自定義的査詢頁面后,無需再配置各個(gè)輸入?yún)?shù)。自定義配置文件一般存放在一個(gè)虛擬目錄中。
此外,每個(gè)報(bào)表都要定義數(shù)據(jù)源。 一個(gè)報(bào)表中可以有一個(gè)或多個(gè)數(shù)據(jù)源。系統(tǒng)運(yùn)行時(shí) ,根據(jù)數(shù)據(jù)參數(shù),進(jìn)行查詢,獲取數(shù)據(jù)。獲取的數(shù)據(jù)存儲在數(shù)據(jù)對象集合中。在本實(shí)施例中 ,數(shù)據(jù)源定義在〈datasource〉段里。如以下數(shù)據(jù)源定義 〈datasource〉 〈sql name = "dlsd"
sql = 〃select n—zxygz, dat印art (Hour, d—cjsj) as n—hour from dlsd where s—bbh = , [%=getInput (,, s—bbh,, )%], and d—cjsj 〉= , [%=getInput (,, d—rq,, )%] and d—cjsj 〈 , [%=getInput (,, d—rql" )%], order by d—cjsj" /〉 〈sql
name = 〃ssl〃
sql = "select n—ua, n—ub, n—uc, dat印art (Hour, d—cjsj) as n—hour from ssl where s—bbh = , [%=getInput (,, s—bbh,, )%], and d—cjsj 〉= , [%=getInput (,, d—rq,: )%], and d—cjsj 〈 , [%=getInput (,, d—rql" )%], order by d—cjsj" /〉 〈/datasource〉
每個(gè)數(shù)據(jù)源定義在一個(gè)子結(jié)點(diǎn)中。每個(gè)數(shù)據(jù)源都有一個(gè)name屬性,定義該數(shù)據(jù)源的名 稱。之后程序訪問數(shù)據(jù)源對象里的數(shù)據(jù)也是按照名稱來訪問。不同數(shù)據(jù)源應(yīng)配置不同的名稱 。系統(tǒng)支持三種數(shù)據(jù)源SQL數(shù)據(jù)源通過定義一個(gè)査詢數(shù)據(jù)的SQL語句,到數(shù)據(jù)庫中執(zhí)行査 詢,將査詢結(jié)果作為數(shù)據(jù)源內(nèi)容。SQL語句中支持嵌入式表達(dá)式。Java數(shù)據(jù)源通過訪問一 個(gè)Java方法,獲得所需的數(shù)據(jù)。該Java方法可以是本地類的方法,也可以是一個(gè)遠(yuǎn)程EJB方 法調(diào)用。DSF數(shù)據(jù)源通過訪問DSF(DataSourceDefine)對象,獲取所需數(shù)據(jù)。査詢數(shù)據(jù)源, 返回字段都已定義在DSF對象中,査詢時(shí)只需提交査詢條件即可??烧J(rèn)為是SQL數(shù)據(jù)源的高級 版,即將基礎(chǔ)表數(shù)據(jù)中編碼字段進(jìn)行轉(zhuǎn)換后返回。并且可對字段值進(jìn)行格式化處理。在一個(gè) 報(bào)表中可以同時(shí)配置多個(gè)多種數(shù)據(jù)源。
當(dāng)數(shù)據(jù)源執(zhí)行完査詢后返回的數(shù)據(jù)對象有以下幾種
BEAN-單個(gè)的Java Bean,實(shí)際就是一個(gè)Java類實(shí)例。通過訪問指定的方法獲得數(shù)據(jù)。 MAP- Java Map對象。通過Key可從Map中獲得數(shù)據(jù)。
ARRAY - Java Array對象,即數(shù)組。里面的數(shù)據(jù)只能按順序(索引)訪問。LIST- Java List對象。同Array類似,里面的數(shù)據(jù)只能按順序(索引)訪問。 DATASET—ROW- Java DataSet對象。即數(shù)據(jù)集對象對象,但只使用DataSet中的當(dāng)前記錄。
LIST—BEAN - Java List〈Bean〉對象,Bean對象的集合。
MAP—BEAN - Java MapX寸象,Map〈BeanName, BeanOb ject〉。 一次調(diào)用返回多個(gè)Bean。返 回后,將以數(shù)據(jù)源名字.BeanName為名字將BeanObject放入返回?cái)?shù)據(jù)對象集合中。 一般不需 要定義返回值類型為MAP—BEAN的Java數(shù)據(jù)源方法??啥x多個(gè)數(shù)據(jù)源,每個(gè)數(shù)據(jù)源的Java調(diào) 用方法返回單個(gè)Bean。
LIST—MAP - Java List〈Map〉對象。List中的每個(gè)元素是一個(gè)Map。 DATASET -數(shù)據(jù)集對象。(自定義),類似于ResaultSet。其中可包含多條記錄。 GROUP—MAP - Java Map〈Beanl, List〈Bean2》對象。 一般用來給分組報(bào)表提供數(shù)據(jù)。 Beanl用來提供分組的數(shù)據(jù),List〈Bean〉用來給該分組的明細(xì)區(qū)提供數(shù)據(jù)。
上述BEAN、 MAP、 ARRAY、 LIST、 DATASET—ROW對象可當(dāng)作是單條記錄,只包含一個(gè)實(shí)體 的多個(gè)屬性數(shù)據(jù)??捎脕硖畛鋱?bào)表中的各個(gè)區(qū)段。
上述LIST—BEAN、 LIST—MAP、 DATASET包含多條記錄,可以用來填充明細(xì)區(qū)。 上述GROUP—MAP既包含分組數(shù)據(jù),也包含分組明細(xì)數(shù)據(jù),用來給分組報(bào)表提供數(shù)據(jù)。 上述MAP—BEAN包含多個(gè)互不相干的Bean。
SQL數(shù)據(jù)源和DSF數(shù)據(jù)源只返回DATASET數(shù)據(jù)對象,Java數(shù)據(jù)源可返回任何一種數(shù)據(jù)對象
以sql作為子結(jié)點(diǎn)名稱定義的數(shù)據(jù)源是SQL數(shù)據(jù)源,其代碼如下 〈sql name = "dlscT
sql = 〃select n—zxygz,datepart(Hour, d—cjsj) as n—hour from dlsd where s—bbh = ' [%=getInput(" s—bbh" )%]' and d—cjsj >= ' [%=getInput(" d—rq" )%]' and d—cjsj 〈 ' [%=getInput(" d—rql" )%]' order by d—cjsj" /> 其中
Name :該數(shù)據(jù)源的名稱。String 。
Sql :査詢數(shù)據(jù)的SQL, String,支持嵌入式表達(dá)式。以上的例子中為了瀏覽 清楚,將SQL中的轉(zhuǎn)義符改回原始值,實(shí)際配置時(shí)應(yīng)注意。 SQL數(shù)據(jù)源返回的結(jié)果是一個(gè)記錄集(DataSet)對象。以java作為子結(jié)點(diǎn)名稱定義的數(shù)據(jù)源是java數(shù)據(jù)源,Java數(shù)據(jù)源是指在運(yùn)行時(shí)刻訪問一 個(gè)java方法得到的數(shù)據(jù)源。其代碼如下 〈Java name = 〃czy〃
method = , getCZYList (getlnput(〃s—gdj〃)), return = 〃list—bean〃 /〉 其中
Name :數(shù)據(jù)源名稱,String
Method :方法名稱,String。支持自定義函數(shù)。 Return :返回?cái)?shù)據(jù)類型,String,可選值包括 bean, m即,array, list, dataset—row, list—bean, map—bean, list—m即,dataset, group—map;
在上述內(nèi)容中,method方法可以使用自定義函數(shù)。自定義函數(shù)的聲明文件應(yīng)在web服務(wù) 器啟動時(shí)加載。
如以上的方法getCZYList (getlnput (〃s—gdj〃))中,使用了一個(gè)自定義函數(shù) getCZYList (getlnput (e, 〃s—gdj〃)),該函數(shù)的聲明如下
public static ArrayList getCZYList(String gdj)throws UniException{
聲明了該方法以后,就可以在自定義函數(shù)中使用了。 方法執(zhí)行完畢后返回的數(shù)據(jù)先存放在返回?cái)?shù)據(jù)集合中。 以dsf作為子結(jié)點(diǎn)名稱定義的數(shù)據(jù)源是DSF數(shù)據(jù)源,其代碼如下 〈dsf name = 〃czy〃 alias = "xt—czy" preset—where = "s—isadmin ='0'" preset—orderby = "s—czybh" /> 其中
Name :該數(shù)據(jù)源的名稱。String 。
Alias :數(shù)據(jù)源的別名,String。 Preset—where :預(yù)置的査詢條件。String??墒÷浴?Preset—orderby :預(yù)置的排序條件,String??墒÷?。DSF數(shù)據(jù)源可看做是SQL數(shù)據(jù)源的升級,它也是返回一個(gè)DataSet對象。但DSF數(shù)據(jù)源是通過在在DSF對象上進(jìn)行査詢,返回事先定義好的字段。并且按照DSF中定義的轉(zhuǎn)碼方式對原始數(shù)據(jù)進(jìn)行Value-Text的轉(zhuǎn)換及一些數(shù)據(jù)格式化的處理。査詢時(shí)會將Presetwhere和運(yùn)行時(shí)輸入的査詢條件結(jié)合在一起進(jìn)行査詢(兩個(gè)査詢條件之間是And關(guān)系)。如上例,査詢結(jié)果中只會得到不是管理員的操作員。并且默認(rèn)的排序條件是按操作員編號進(jìn)行排序。
在本實(shí)施例的定義文件中,數(shù)據(jù)再計(jì)算過程定義在〈caldata〉段里??蔀榭铡@纭碿aldata〉mymap = new HashMap ();
mymap. put(〃usercount〃, getDataSet(〃czy〃).count (〃氺〃));mymap. put("avg—age", getDataSet("czy"). avg("age"));pubData(e, 〃totaldata〃, mymap);〈/caldata〉
系統(tǒng)對各個(gè)數(shù)據(jù)源進(jìn)行處理完后,將返回的數(shù)據(jù)對象放在數(shù)據(jù)對象集合中。對數(shù)據(jù)對
象集合中的數(shù)據(jù)可以進(jìn)行再計(jì)算。再計(jì)算一般包含對數(shù)據(jù)虛擬列的計(jì)算(如DataSet);對數(shù)據(jù)進(jìn)行統(tǒng)計(jì)(如計(jì)數(shù)、求和、求最大值最小值平均值等),產(chǎn)生的統(tǒng)計(jì)結(jié)果數(shù)據(jù)可存儲到新的數(shù)據(jù)對象(如新產(chǎn)生一個(gè)Map)。
再計(jì)算過程都是通過自定義函數(shù)來實(shí)現(xiàn)的。通過在〈caldata〉節(jié)點(diǎn)之間配置自定義函數(shù)來實(shí)現(xiàn)。自定義函數(shù)可以是多條,每條語句末尾為分號(;),語法要符合Java語言的語法規(guī)則。多條語句之間順序執(zhí)行。
在上述例子中,首先生成一個(gè)HashMap對象mymap,然后給該map中添加了兩個(gè)數(shù)據(jù)項(xiàng):usercount 數(shù)據(jù)集czy的記錄數(shù)求和,avg—age 數(shù)據(jù)集czy對全部人員年齡求平均值。最后將這個(gè)map添加到數(shù)據(jù)對象集合中。在輸出程序也可以使用該數(shù)據(jù)對象。
數(shù)據(jù)再計(jì)算完畢后,就進(jìn)行數(shù)據(jù)輸出步驟,在本實(shí)施例的定義文件中,數(shù)據(jù)輸出定義在〈segment-data〉段里。如下〈segment-data〉〈titlebind = 〃false〃 >
〈item name = "title" formula = ' getlnput("s—gdj. text")' />〈item name = "printdate" formula = 'today()' />〈/title>〈bodybind = 〃true〃type = 〃list—bean〃source = "czy" /〉〈/segment-data〉
在本實(shí)施例中,數(shù)據(jù)輸出指的是將數(shù)據(jù)按區(qū)段提交給ExcelEngine對象,由ExcelEngine對象生成報(bào)表區(qū)段,并填充數(shù)據(jù),最后生成報(bào)表。
在〈segment-data〉段里定義了報(bào)表的每個(gè)區(qū)段中的每個(gè)數(shù)據(jù)項(xiàng)綁定到數(shù)據(jù)對象集合中的哪個(gè)數(shù)據(jù)對象上??蓪⒁粋€(gè)區(qū)段綁定在一個(gè)數(shù)據(jù)對象上,也可以配置一個(gè)區(qū)段中的各個(gè)數(shù)據(jù)項(xiàng)綁定在不同的數(shù)據(jù)對象的不同字段(或?qū)傩?上?!磗egment-data〉段的各個(gè)子結(jié)點(diǎn)名稱應(yīng)以報(bào)表區(qū)段名稱為節(jié)點(diǎn)名稱。其中
Bind: 該區(qū)段是否綁定在一個(gè)數(shù)據(jù)對象上。Boolean,不可省略。如果bind ="false",表示該區(qū)段中的數(shù)據(jù)項(xiàng)需要逐個(gè)配置。每個(gè)數(shù)據(jù)項(xiàng)的配置在〈item〉子結(jié)點(diǎn)中。Item子結(jié)點(diǎn)Name :數(shù)據(jù)項(xiàng)名稱,String。
Formula :數(shù)據(jù)輸出公式,String。使用自定義函數(shù)。其中,Item的Name需要與報(bào)表樣式文件中定義的數(shù)據(jù)項(xiàng)名稱相匹配。如以上報(bào)表,樣式文件中表頭段的數(shù)據(jù)項(xiàng)定義為〈r印ort-title-def ine〉〈item name=〃title〃 row=〃2〃 col二〃b〃 display二〃true〃 format二〃o/olSs操作員清單〃format—data—type二〃c〃 length=〃0〃 datatype c〃 /〉
〈item name=〃printdate〃 row=〃3〃 col=〃e〃 display=〃true〃 format二〃〃leiigth=〃0〃 datatype d〃 /〉〈/r印ort-title-def ine〉其中定義了兩個(gè)數(shù)據(jù)項(xiàng)title禾口printdate。如果bind = "true",就不需要再逐個(gè)配置數(shù)據(jù)項(xiàng)了 。
Type: 數(shù)據(jù)X寸象類另U, String, 可選值bean, map, array, list,dataset—row, list—bean,list—map, dataset
Source:數(shù)據(jù)對象名稱,String,可使用數(shù)據(jù)對象集合中的任何對象。會直接把數(shù)據(jù)對象交給ExcelEngine對象去填充區(qū)段中的單元格。但要保證數(shù)據(jù)對象中的各數(shù)據(jù)名稱和報(bào)表樣式文件中定義的數(shù)據(jù)項(xiàng)名稱相匹配(按名稱訪問數(shù)據(jù)項(xiàng)時(shí))或順序相匹配(按順序訪問數(shù)據(jù)項(xiàng)時(shí))。
在本實(shí)施例中,如果報(bào)表被定義為一個(gè)分組報(bào)表(〈r印ort-define type=" group" >),那么還需要定義分組數(shù)據(jù)輸出段。如果報(bào)表是其他類型,則不需要該段代碼〈group-dat3datasource = 〃dataset〃dsgroup= 〃yh〃dsbody = 〃gdjl〃filterfield = 〃s—bbh〃 /〉其中
datasource :數(shù)據(jù)源類別,String,可選值dataset/map。表示使用哪種數(shù)據(jù)源。datasource = "dataset"時(shí),需定義以下屬性-
dsgroup :分組部分?jǐn)?shù)據(jù)集(DataSet)對象名稱,Stringdsbody :分組明細(xì)部分?jǐn)?shù)據(jù)集對象名稱,Stringfilterfield :過濾字段名稱,String
datasource = "map"是,需定義以下屬性Map :分組數(shù)據(jù)對象(Map)名稱,String??墒褂脙煞N方式為分組報(bào)表提供數(shù)據(jù)。其一使用兩個(gè)數(shù)據(jù)集對象。dsgroup和dsbody。運(yùn)行時(shí)按順序讀取dsgroup中的數(shù)據(jù)作為分組數(shù)據(jù)項(xiàng),然后按filterfield字段到dsbody過濾,得到當(dāng)前分組記錄對應(yīng)的明細(xì)數(shù)據(jù)項(xiàng),再生成該分組的明細(xì)數(shù)據(jù)。其二是使用一個(gè)Map對象,〈groupBean, List〈Bean》,groupBean提供分組部分?jǐn)?shù)據(jù),List〈Bean〉部分提供該分組的明細(xì)數(shù)據(jù)。
注意報(bào)表定義為分組報(bào)表時(shí),報(bào)表的表頭表尾部分還需要按區(qū)段定義,分組部分定義在〈group-data〉中。
此外,在本實(shí)施例中,系統(tǒng)也可使用自定義函數(shù)。自定義函數(shù)可以單獨(dú)使用,也可以放在嵌入表達(dá)式中。比如initvalue =
'[%=getSessionAttr(〃GDJBH—String〃)%]|[%=getSessionAttr(〃GDJMC—String〃)%]'中,getSessionAttr(〃GDJBH—String〃)就是個(gè)自定義函數(shù)放在嵌入式表達(dá)式中的例子。又如sql = 〃select n—zxygz,datepart(Hour, d—cjsj) as n—hour from dlsd where s—bbh='[%=getInput(" s—bbh" )%]' and d—cjsj >= ' [%=getInput(" d—rq" )%]' and d—cjsj〈'[%=getlnput(" d—rql" )%]' order by d—cjsj〃也是嵌入式表達(dá)式的例子。
嵌入式表達(dá)式是指該內(nèi)容本身是一段文本,其中嵌入有[%.......%]這樣的標(biāo)簽,標(biāo)簽
里是嵌入式表達(dá)式,運(yùn)行時(shí)系統(tǒng)可解釋執(zhí)行嵌入表達(dá)式,用計(jì)算結(jié)果替換標(biāo)簽。將最終結(jié)果文本提供給程序使用。標(biāo)簽[% y。]中的內(nèi)容應(yīng)是一個(gè)有效的Java語句,可包含自定義函數(shù),系統(tǒng)函數(shù),各種運(yùn)算符。但最終計(jì)算結(jié)果應(yīng)返回一個(gè)字符串。標(biāo)簽里的語句應(yīng)以=(等號)開始。并且內(nèi)部表示一個(gè)字符串變量時(shí),應(yīng)以雙引號(")作為字符串兩端的邊界。又如〈item name = 〃title〃 formula = ' getlnput (〃s—gdj. text〃)' />, 就是^^個(gè)直接使用的例子的自定義函數(shù)
自定義報(bào)表中訪問所在應(yīng)用系統(tǒng)函數(shù)、變量,都是通過自定義函數(shù)進(jìn)行的。系統(tǒng)運(yùn)行時(shí),通過引擎調(diào)用自定義函數(shù),進(jìn)行數(shù)據(jù)計(jì)算,返回計(jì)算結(jié)果輸出到報(bào)表中。因此系統(tǒng)所有和數(shù)據(jù)訪問計(jì)算相關(guān)的功能都是通過自定義函數(shù)實(shí)現(xiàn)的。自定義函數(shù)也是系統(tǒng)的一大特色。系統(tǒng)安裝時(shí),已提供了一部分自定義函數(shù)。在實(shí)際運(yùn)行中,如果已提供的還不夠,可自己再開發(fā)相應(yīng)的Java程序,開發(fā)完后打包成Jar文件,發(fā)布在應(yīng)用服務(wù)器的相應(yīng)lib目錄中,然后將函數(shù)的聲明添加到自定義函數(shù)聲明文件中,就可以使用新加的自定義函數(shù)了 。自定義函數(shù)實(shí)際上使用了BSH包來計(jì)算自定義函數(shù)或表達(dá)式。在本實(shí)施所述的自定義報(bào)表產(chǎn)生管理系統(tǒng)中,管理平臺實(shí)際上就是管理報(bào)表定義文件的目錄結(jié)構(gòu),文件上傳下載與刪除。其中,其數(shù)據(jù)文件目錄結(jié)構(gòu)如下Unir印ort :數(shù)據(jù)文件根目錄
-define :報(bào)表定義文件存放目錄。存放報(bào)表定義文件(xml格式)
該目錄下可任意創(chuàng)建子目錄名,目錄名就作為報(bào)表的分類名,目錄級數(shù)沒有限制。報(bào)表定義文件擴(kuò)展名為.xml。
-dsf :自定義數(shù)據(jù)源綁定報(bào)表存放目錄。目錄下是全部數(shù)據(jù)源
綁定報(bào)表的定義。該目錄下可任意創(chuàng)建子目錄名,目錄名就作為報(bào)表的分類名,目錄級數(shù)沒有限制。每個(gè)報(bào)表定義一個(gè)空文件。文件名為"報(bào)表顯示名稱 對應(yīng)數(shù)據(jù)源別名.txt",擴(kuò)展名任意,無擴(kuò)展名也可。
-model :報(bào)表模板文件和樣式文件存放目錄。模板文件(xls格
式),樣式文件(xml格式)
-userfunction :自定義函數(shù)聲明文件存放目錄。聲明文件是文本文
件(txt格式)-unir印ort—searchpage :自定義査詢條件頁面存放目錄。運(yùn)行時(shí)將該目錄映射為web服務(wù)器下的一個(gè)虛擬目錄。如果web服務(wù)器不支持映射虛擬目錄,也可將該目錄直接放在webapps下。
在本實(shí)施例中,結(jié)構(gòu)與文件目錄結(jié)構(gòu)及報(bào)表文件名相同,這樣簡化了報(bào)表的分類與發(fā)布管理。創(chuàng)建新的分類時(shí),只需在指定目錄下創(chuàng)建新目錄即可,而發(fā)布新報(bào)表也只需要將報(bào)表文件上傳到指定目錄即可。
在本實(shí)施例中,運(yùn)行平臺實(shí)際上就是系統(tǒng)的操作界面。操作員登錄后,可看到已發(fā)布的各個(gè)報(bào)表,點(diǎn)擊一個(gè)報(bào)表名稱,系統(tǒng)根據(jù)該報(bào)表中定義的輸入?yún)?shù)生成査詢條件輸入頁面。操作員輸入査詢條件后提交即可看到報(bào)表內(nèi)容。在本實(shí)施例中,系統(tǒng)啟動時(shí),加載自定義函數(shù)聲明文件,加載字典表定義、數(shù)據(jù)源定義等。系統(tǒng)運(yùn)行時(shí),操作員點(diǎn)擊一個(gè)自定義報(bào)表名稱,啟動自定義報(bào)表引擎(Engine)處理過程首先根據(jù)報(bào)表定義文件構(gòu)造一個(gè)報(bào)表定義對象(R印ortDefine對象),然后根據(jù)該定義對象構(gòu)造一個(gè)自定義報(bào)表處理引擎(Engine)類實(shí)例;從R印ortDef ine. inputParameters中可得知為該報(bào)表定義的自定義査詢條件,為每一個(gè)査詢條件生成對應(yīng)的査詢條件輸入控件。最后生成輸入各個(gè)査詢條件的頁面。輸入完査詢條件后提交時(shí),系統(tǒng)按照査詢條件中定義的檢驗(yàn)方法對輸入值進(jìn)行校驗(yàn),校驗(yàn)成功才可以提交査詢。之后,報(bào)表引擎處理提交的査詢條件,將所有的參數(shù)輸入值放入Engine. inputData中,并逐個(gè)處理R印ortDefine中的數(shù)據(jù)源定義。處理完數(shù)據(jù)源定義后,根據(jù)R印ortDefine中.calData部分的定義,對Engine. data中存放的數(shù)據(jù)對象進(jìn)行再計(jì)算,比方說產(chǎn)生一些統(tǒng)計(jì)數(shù)據(jù)等??尚薷囊延袑ο笾械臄?shù)據(jù),也可產(chǎn)生新數(shù)據(jù)。新輸入一般存入一個(gè)新的map中。之后,根據(jù)報(bào)表樣式文件構(gòu)造一個(gè)ExcelEngine對象,然后按照R印ortDefine. segmentDatafile中對各區(qū)段的數(shù)據(jù)項(xiàng)定義輸出數(shù)據(jù)至UExcelEngine對象。其中,對于SQL數(shù)據(jù)源,處理SQL中的嵌入式表達(dá)式,得到目標(biāo)SQL語句,執(zhí)行査詢,得到査詢結(jié)果,將査詢結(jié)果DataSet放入Engine. data中;對于Java數(shù)據(jù)源,通過調(diào)用自定義函數(shù),執(zhí)行一個(gè)Java方法。將該方法返回的數(shù)據(jù)對象放入Engine. data中;對于DSF數(shù)據(jù)源,首先構(gòu)造一個(gè)DSF對象,然后在該對象上執(zhí)行査詢,將返回的DataSet對象放入Engine. data中。而當(dāng)綁定整個(gè)區(qū)段到一個(gè)數(shù)據(jù)對象上的,將數(shù)據(jù)對象從Engine. data中取出來,直接提交給ExcelEngine對象,生成報(bào)表的相應(yīng)部分。當(dāng)區(qū)段數(shù)據(jù)項(xiàng)為逐個(gè)配置的,首先構(gòu)造一個(gè)新的map,調(diào)用自定義函數(shù)和嵌入式表達(dá)式處理引擎,對數(shù)據(jù)項(xiàng)配置公式進(jìn)行計(jì)算,將數(shù)據(jù)項(xiàng)名稱和計(jì)算結(jié)果放入map,該區(qū)段的全部數(shù)據(jù)項(xiàng)都處理完后,將整個(gè)map提交給ExcelEngine對象,生成報(bào)表的相應(yīng)部分。在輸出報(bào)表時(shí),如果需要按Html樣式將報(bào)表內(nèi)容顯示在客戶瀏覽器上,那么調(diào)用 ExcelEngine的export方法,得到Html格式的報(bào)表內(nèi)容,然后將Html內(nèi)容寫入至l」response, 最終顯示在客戶瀏覽器上。 一般來說,報(bào)表內(nèi)容應(yīng)顯示在獨(dú)立的frame里;如果需要生成 Excel文件供客戶下載到本機(jī),那么調(diào)用ExcelEngine的export方法,得到byte[]格式的 Excel文件內(nèi)容,然后將數(shù)據(jù)直接寫入response,客戶瀏覽器就會提示下載或打開Excel文件 ;如果需要在服務(wù)器端生成Excel文件,可調(diào)用ExcelEngine. write方法,將報(bào)表內(nèi)容寫入到 Excel格式的文件中。
以上所述實(shí)施例僅表達(dá)了本發(fā)明的幾種實(shí)施方式,其描述較為具體和詳細(xì),但并不能因 此而理解為對本發(fā)明專利范圍的限制。應(yīng)當(dāng)指出的是,對于本領(lǐng)域的普通技術(shù)人員來說,在 不脫離本發(fā)明構(gòu)思的前提下,還可以做出若干變形和改進(jìn),這些都屬于本發(fā)明的保護(hù)范圍。 因此,本發(fā)明專利的保護(hù)范圍應(yīng)以所附權(quán)利要求為準(zhǔn)。
權(quán)利要求
1.一種自定義報(bào)表生成管理方法,用于瀏覽器/服務(wù)器結(jié)構(gòu),其特征在于,包括如下步驟A)在瀏覽器上調(diào)用服務(wù)器上運(yùn)用程序,顯示服務(wù)器上所有報(bào)表清單的報(bào)表頁面,選擇其中一個(gè)報(bào)表;B)服務(wù)器生成所選報(bào)表,傳送到所述瀏覽器。
2 根據(jù)權(quán)利要求l所述的自定義報(bào)表生成管理方法,其特征在于,還 包括在所述服務(wù)器上建立報(bào)表文件,其包括M)使用Excel生成多個(gè)存儲在服務(wù)器內(nèi)的報(bào)表文件。
3 根據(jù)權(quán)利要求2所述的自定義報(bào)表生成管理方法,其特征在于,所 述步驟M)中進(jìn)一步包括如下步驟Ml)使用Excel得到報(bào)表模板,生成模板文件;M2)將所述模板文件分區(qū)段,并定義所述模板文件中的每個(gè)區(qū)段,生成樣式文件 M3)定義上述各區(qū)段中的數(shù)據(jù),生成定義文件;M4)將上述文件傳送到服務(wù)器的報(bào)表目錄中指定位置,得到一個(gè)報(bào)表文件。
4 根據(jù)權(quán)利要求3所述的自定義報(bào)表生成管理方法,其特征在于,所 述步驟M2)中所述定義區(qū)段包括定義該區(qū)段中放置的數(shù)據(jù)項(xiàng)、所述數(shù)據(jù)項(xiàng)的位置以及所述 數(shù)據(jù)的顯示格式。
5 根據(jù)權(quán)利要求4所述的自定義報(bào)表生成管理方法,其特征在于,所 述步驟M3)中所述定義所述區(qū)段中的數(shù)據(jù)包括數(shù)據(jù)的來源、數(shù)據(jù)査詢方式、數(shù)據(jù)査詢條件 、數(shù)據(jù)計(jì)算以及數(shù)據(jù)填充。
6 根據(jù)權(quán)利要求5所述的自定義報(bào)表生成管理方法,其特征在于,所 述步驟M4)進(jìn)一步包括如下步驟M41)將所述模板文件、樣式文件和定義文件傳送到所述服務(wù)器指定目錄中;M42)刷新報(bào)表頁面,得到上述文件所生成的報(bào)表之清單。
7.根據(jù)權(quán)利要求l所述的自定義報(bào)表生成管理方法,其特征在于,所 述步驟B)進(jìn)一步包括Bl)產(chǎn)生該報(bào)表査詢條件輸入頁面;B2)依據(jù)所述査詢條件輸入頁面的內(nèi)容,査詢數(shù)據(jù),生成報(bào)表; B3)輸出生成的報(bào)表到所述瀏覽器。
8. 一種自定義報(bào)表生成管理系統(tǒng),用于瀏覽器/服務(wù)器架構(gòu),其特征 在于,所述服務(wù)器上包括報(bào)表運(yùn)行引擎用于解析報(bào)表定義文件,査詢報(bào)表需要的數(shù)據(jù)以及生成報(bào)表; 報(bào)表管理平臺用于發(fā)布、管理各類報(bào)表;報(bào)表運(yùn)行平臺用于顯示在所述管理平臺上發(fā)布的報(bào)表清單,當(dāng)所述報(bào)表清單中 的一個(gè)被選中時(shí),調(diào)用所述運(yùn)行引擎,査找、生成報(bào)表,并輸出。
9.根據(jù)權(quán)利要求8所述的自定義報(bào)表生成管理系統(tǒng),其特征在于,所 述報(bào)表運(yùn)行引擎進(jìn)一步包括用于在所述報(bào)表清單中一個(gè)報(bào)表被選拔中時(shí)產(chǎn)生査詢條件輸入頁 面的査詢條件輸入頁面產(chǎn)生單元。
10.根據(jù)權(quán)利要求9所述的自定義報(bào)表生成管理系統(tǒng),其特征在于, 所述報(bào)表管理平臺包括用于存放所述報(bào)表定義文件的報(bào)表定義文件存放目錄、用于存放所 述報(bào)表模板文件和樣式文件的報(bào)表模板文件和樣式文件存放目錄、用于存放于報(bào)表綁定數(shù)據(jù) 源的自定義數(shù)據(jù)源綁定報(bào)表存放目錄、用于存放申明文件的自定義函數(shù)申明文件存放目錄以 及用于存放所述査詢頁面的自定義査詢條件頁面存放目錄。
全文摘要
本發(fā)明涉及一種自定義報(bào)表生成管理方法,用于瀏覽器/服務(wù)器結(jié)構(gòu),包括如下步驟在瀏覽器上調(diào)用服務(wù)器上運(yùn)用程序,顯示服務(wù)器上所有報(bào)表清單的報(bào)表頁面,選擇其中一個(gè)報(bào)表;服務(wù)器生成所選報(bào)表,傳送到所述瀏覽器。本發(fā)明還涉及一種自定義報(bào)表生成管理系統(tǒng)。實(shí)施本發(fā)明的自定義報(bào)表的生成管理方法及系統(tǒng),具有以下有益效果由于每個(gè)報(bào)表文件的模板中包括模板文件、樣式文件和定義文件,因此,生成報(bào)表時(shí)報(bào)表的格式和報(bào)表的數(shù)據(jù)是分開生成后在組合的。故其擴(kuò)展性較好、支持自定義查詢條件。
文檔編號G06F17/24GK101650712SQ200910305760
公開日2010年2月17日 申請日期2009年8月18日 優(yōu)先權(quán)日2009年8月18日
發(fā)明者鄧志峰 申請人:深圳市科陸電子科技股份有限公司