Posted on 2007-09-02 09:45
canonical 閱讀(1677)
評(píng)論(1) 編輯 收藏 所屬分類:
Witrix開發(fā)平臺(tái)
傳統(tǒng)上報(bào)表引擎主要完成兩項(xiàng)工作:結(jié)構(gòu)描述和結(jié)構(gòu)轉(zhuǎn)換。一般報(bào)表設(shè)計(jì)人員通過(guò)可視化設(shè)計(jì)工具完成對(duì)報(bào)表結(jié)構(gòu)的描述,然后報(bào)表引擎根據(jù)這些描述生成不同格式的報(bào)表文件,如PDF格式,XLS格式等。這一圖景中報(bào)表設(shè)計(jì)工具扮演著關(guān)鍵角色,因?yàn)樗粌H僅是向用戶提供一個(gè)直觀的界面,更重要的是配置過(guò)程本身就是一種分步驟的結(jié)構(gòu)構(gòu)造過(guò)程。理想的情況是用戶指定報(bào)表中具體有哪些單元格,表格具體有哪些列,而在運(yùn)行期報(bào)表引擎負(fù)責(zé)向單元格中填充數(shù)據(jù)。但是對(duì)于設(shè)計(jì)期只能進(jìn)行動(dòng)態(tài)描述,無(wú)法預(yù)先確定所有結(jié)構(gòu)元素的報(bào)表(例如交叉表的列只能在執(zhí)行時(shí)確定),這種報(bào)表模型就會(huì)出現(xiàn)問(wèn)題。一般處理方式都是在報(bào)表引擎中內(nèi)置所有可能的動(dòng)態(tài)報(bào)表模型。無(wú)論設(shè)計(jì)工具多么復(fù)雜,其內(nèi)置的原理如果是基于靜態(tài)結(jié)構(gòu)模型,就無(wú)法建立一種抽象機(jī)制,這樣我們就只能通過(guò)重復(fù)勞動(dòng)來(lái)應(yīng)對(duì)眾多結(jié)構(gòu)類似但是略有不同的報(bào)表。
Witrix平臺(tái)的報(bào)表引擎是對(duì)程序友好的,它引入了編譯期結(jié)構(gòu)運(yùn)算,在報(bào)表編譯時(shí)可以通過(guò)程序吸收大部分結(jié)構(gòu)差異性。在Witrix平臺(tái)中,報(bào)表制作分為三個(gè)階段:設(shè)計(jì)期 -> 編譯期 -> 運(yùn)行期。報(bào)表引擎負(fù)責(zé)完成三種工作:結(jié)構(gòu)描述,結(jié)構(gòu)生成和結(jié)構(gòu)轉(zhuǎn)換。具體實(shí)現(xiàn)動(dòng)態(tài)結(jié)構(gòu)生成的過(guò)程其實(shí)非常簡(jiǎn)單。目前所有的Witrix配置文件都通過(guò)基礎(chǔ)配置引擎進(jìn)行解析,它定義了統(tǒng)一的dynamic和extends元機(jī)制。
<report dynamic="true">
定義了dynamic="true"的報(bào)表定義文件首先作為tpl模板文件來(lái)運(yùn)行,其運(yùn)行結(jié)果再作為報(bào)表格式解析。在這種模型下,報(bào)表引擎并沒(méi)有內(nèi)置如何把動(dòng)態(tài)結(jié)構(gòu)拼接出來(lái)的知識(shí),這些知識(shí)存在于編譯期,而tpl標(biāo)簽的抽象能力使得我們可以把復(fù)雜的報(bào)表結(jié)構(gòu)生成過(guò)程抽象成簡(jiǎn)單的標(biāo)簽調(diào)用形式。
<report dynamic="true">
<body>
<table>
<thead>
<c:forEach var="_h" items="${cols}">
....
</table>
</body>
</report>
==>
<report dynamic="true">
<body>
<rpt:GenCrossTable tableMeta="${tableMeta}" loopVar="tableData" />
</body>
</report>
在編譯期通過(guò)tpl封裝可以解決大部分結(jié)構(gòu)生成問(wèn)題,在運(yùn)行期報(bào)表引擎主要負(fù)責(zé)的結(jié)構(gòu)問(wèn)題就簡(jiǎn)化為數(shù)據(jù)行展開和單元格合并等確定操作。
Witrix報(bào)表引擎的另一個(gè)特點(diǎn)是運(yùn)行期結(jié)構(gòu)生成過(guò)程和結(jié)構(gòu)轉(zhuǎn)換過(guò)程同時(shí)進(jìn)行,因此不需要在內(nèi)存中構(gòu)造一個(gè)完整的報(bào)表數(shù)據(jù)對(duì)象,大大減輕了內(nèi)存壓力。Witrix報(bào)表引擎輸出的文件格式目前有html, XML格式的Word文件和XML格式的Excel文件等。每一種輸出格式相當(dāng)于定義了一種渲染模型,它們都是對(duì)報(bào)表模型的一種展現(xiàn)方式。從某種程度上說(shuō)這些模型的結(jié)構(gòu)都是等價(jià)的,但是完成模型轉(zhuǎn)換所需要的操作往往不是局域化的。例如在html的table中某一單元格具體對(duì)應(yīng)哪一列是受到其他單元格的rowspan和colspan屬性影響的, 在Excel中則需要明確指定列的index屬性。為了簡(jiǎn)化運(yùn)行期邏輯,內(nèi)置的報(bào)表模型必須提供一些冗余結(jié)構(gòu),從而兼容多種渲染模型。