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