报表引擎:结构生成与结构转换

   传统上报表引擎主要完成两项工作:结构描述和结构转换。一般报表设计人员通过可视化设计工具完成对报表结构的描述,然后报表引擎根据这些描述生成不同格式的报表文件,如PDF格式,XLS格式等。这一图景中报表设计工具扮演着关键角色,因为它不仅仅是向用户提供一个直观的界面,更重要的是配置过程本身就是一种分步骤的结构构造过程。理想的情况是用户指定报表中具体有哪些单元格,表格具体有哪些列,而在运行期报表引擎负责向单元格中填充数据。但是对于设计期只能进行动态描述,无法预先确定所有结构元素的报表(例如交叉表的列只能在执行时确定),这种报表模型就会出现问题。一般处理方式都是在报表引擎中内置所有可能的动态报表模型。无论设计工具多么复杂,其内置的原理如果是基于静态结构模型,就无法建立一种抽象机制,这样我们就只能通过重复劳动来应对众多结构类似但是略有不同的报表。
   Witrix平台的报表引擎是对程序友好的,它引入了编译期结构运算,在报表编译时可以通过程序吸收大部分结构差异性。在Witrix平台中,报表制作分为三个阶段:设计期 -> 编译期 -> 运行期。报表引擎负责完成三种工作:结构描述,结构生成和结构转换。具体实现动态结构生成的过程其实非常简单。目前所有的Witrix配置文件都通过基础配置引擎进行解析,它定义了统一的dynamic和extends元机制。
   <report dynamic="true">
定义了dynamic="true"的报表定义文件首先作为tpl模板文件来运行,其运行结果再作为报表格式解析。在这种模型下,报表引擎并没有内置如何把动态结构拼接出来的知识,这些知识存在于编译期,而tpl标签的抽象能力使得我们可以把复杂的报表结构生成过程抽象成简单的标签调用形式。
xml 代码
 
  1. <report dynamic="true">  
  2.    <body>  
  3.      <table>  
  4.       <thead>  
  5.          <c:forEach var="_h" items="${cols}">  
  6.           ....  
  7.      </table>  
  8.    </body>  
  9. </report>  
  10.   
  11.   
  12. <report dynamic="true">  
  13.    <body>  
  14.       <rpt:GenCrossTable tableMeta="${tableMeta}" loopVar="tableData" />  
  15.    </body>  
  16. </report>  


   在编译期通过tpl封装可以解决大部分结构生成问题,在运行期报表引擎主要负责的结构问题就简化为数据行展开和单元格合并等确定操作。
   Witrix报表引擎的另一个特点是运行期结构生成过程和结构转换过程同时进行,因此不需要在内存中构造一个完整的报表数据对象,大大减轻了内存压力。Witrix报表引擎输出的文件格式目前有html, XML格式的Word文件和XML格式的Excel文件等。每一种输出格式相当于定义了一种渲染模型,它们都是对报表模型的一种展现方式。从某种程度上说这些模型的结构都是等价的,但是完成模型转换所需要的操作往往不是局域化的。例如在html的table中某一单元格具体对应哪一列是受到其他单元格的rowspan和colspan属性影响的, 在Excel中则需要明确指定列的index属性。为了简化运行期逻辑,内置的报表模型必须提供一些冗余结构,从而兼容多种渲染模型。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值