前些日子做了一个WEB报表工具类库,功能是在Word中定制表格。下文是设计文档。这个工具不大,而且有重新发明轮子的嫌疑,唉!不过既然已经做出来了,总不能扔掉吧。如有兴趣可以下载试试看。共同进步!
下载地址:http://icecloud.51.net/soft/ireport.rar
iReporter包设计文档
冰云 2004.1.5
版权所有 (C) 冰云
1 目标功能
目前项目中的报表等方面都是直接通过IE打印。将数据转换成一个长字符串,然后经过JavaScript分割并填充到表格中。这种方法效率低并且难以进行格式定制。
有的客户希望能够通过Word来打印,并且能够定制表头等方面。在每页都要显示固定的表头。并且支持多个表格打印在同一文件中。
系统需要一个通用的模块来完成这项任务。
本模块就是为了这一目标来设计。
2 用例说明
A 可通过一个模版来定制一份报表
B 用户输入若干List数据,可以将每个List转换成一个表格
C 可定制页面头脚
D 可定制多个表格的头,并且表头固定于每一页
E 多个表格之间要进行分页
F 模版中可以定义表格样式
G 可以通过一个URL生成一份报表
3 关键技术
A Doc文件的生成:
DOC文件格式是微软专利,用Java很难直接生成doc文件。经过讨论与试验,发现IE可以将任意一个后缀名为doc的HTML文档当作Word来打开。因此,采用生成HTML的方式来取代word生成。待生成doc文件格式不是难题的时候,可以通过修改实现来完成。
B 固定表头
经过试验,在Word中固定表头可以通过<THEAD>标签来完成。而将<Caption>标签放入<THEAD>,可以实现每页都显示表名在顶部。
C 表间分页
表间分页在Word中是通过一个样式来指定的。<P style=”page-break:always”>
D 对任意List生成表格
对任意List生成表格,要求List中的对象必须是标准的JavaBean对象,即只有get,set方法的对象。生成表格将依照模版中对该JavaBean的属性名称的引用而成。如getName(),则在模版中写#name#。这项功能通过jakarta的commons-beanutils包来实现。
E XML模版
定制模版采用XML文件,其格式参见下文。XML解析通过DOM4J来实现。这个包的特点是灵活易用,速度比JDOM要快。
4 接口设计
本包主要由Report,ReportBuilder和TemplateParser三个接口组成。其中Report是最终返回给用户的结果。ReportBuilderFactory是建立ReportBuilder的工厂。ReportFacade是提供给调用者的代理方法。本包主要异常为ReportException,是Unchecked Exception。
5 使用方式
使用实例请参见DemoServlet.java
A 通过模版建立文档报表
PrintWriter out = response.getWriter(); // 建立新的DocumentBuilder,工厂方法,现在仅支持Word参数 ReportBuilder builder = ReportBuilderFactory.getBuilder("Word"); // 为Template建立InputStream InputStream is = new FileInputStream(new File("d:\\template.xml")); // 将is给builder builder.setTemplate(is); // 建造List List list = new ArrayList(); // 构造数据,其中的数据必须是JavaBean形式 ... list.add(JavaBean) ... // simpletable应改与模版中的表格名称一致,如id="simpletable" builder.addData(list1, "simpletable"); builder.addData(list2, "styledtable"); // 构造并返回内容,默认将采用ISO-8859-1编码 Report doc = builder.buildReport(); // 输出或保存 doc.save(new File("d:\\a.doc"), "ISO-8859-1"); doc.print(out); |
B 通过URL建立文档
// 建立新的DocumentBuilder,工厂方法,现在仅支持Word参数 ReportBuilder builder = ReportBuilderFactory.getBuilder("Word"); // 构造report Report report = builder.buildReport(new URL("http://www.hjsm.net")); // 输出 report.print(System.out); |
6 设计类图
com.zotn.util.report.wordimpl是上述接口的Word/XHTML实现。其主要是运用DOM4J解析模版,将数据与模版拼装,生成最终XHTML代码的过程。
Tree用于构建一个树形结构,保存模版生成的节点信息。XMLTree是其实现类
TreeNode,保存每个模版节点,XMLTreeNode是其实现类
NodeVisitor,遍历每个节点的Visitor,每个功能对应一个NodeVisitor
GenericXMLParser,是TemplateParser的实现类,用于分析模版
DataHolder,用于保存原始输入数据
ReportHandler,实现了DataHandler,用于处理输出结果并构造Report
WordTableReportBuilder,ReportBuilder的实现类
下图是实现的简图。
7 已知缺陷
A 当前版本无法处理动态页码的问题。
B 不支持其他格式的输出
C 对于URL的解析,无法处理相对路径的图片,样式表等。
8 第三方库
Dom4J; 用于xml解析
Jakarta Commons Logging; 用于记录日志
Jakarta Commons Lang; 用于字符串共用方法
Jakarta Commons BeanUtils; 用于处理JavaBean
Jakarta Commons Collections; BeanUtils需要
Jakarta ORO; 处理正则表达式
9 相关软件
在主提供能已经完成的后,我偶然注意到了JasperReport这个开源项目。它是一个专业报表库,可将数据转换为HTML,XML,PDF,XLS等格式报表。也是通过定义一个模版来定制格式。因此,很不幸,我重新发明了轮子,而且还是个不圆的轮子。
模版文件
<?xml version='1.0' encoding='ISO-8859-1'?>
<!-- 默认采用ISO-8859-1编码 -->
<!-- ROOT元素,一般不需要变 -->
<word>
<!-- 页面头,内容可以写任意HTML,但尖括号应用<>代替 -->
<header><![CDATA[
<P align="center">页头</P>
]]></header>
<!-- 第一个表格,表格别名用id表示 -->
<table id="simpletable">
<!-- 表格数据 -->
<tbody>
<!-- 每个TD单元格内,写 #属性名# ,name属性表示表头-->
<td name="名称">#name#</td>
<td name="颜色">#color#</td>
<td name="颜色">#price#</td>
</tbody>
</table>
<!-- 第二个表格,表格参数(与HTML相同)可作为属性或节点添加 -->
<table id="styledtable" width="600">
<!-- 表格的样式,如边框宽度等可当作节点 -->
<style>color:blue;border:1px solid black</style>
<!-- 复杂表头表格,TR表示行,TH表示单元表格 -->
<thead>
<!-- 固定表格头 -->
<caption style="color:red"><![CDATA[
<font size="+2">固定表格头</font>
]]></caption>
<tr><th colspan="2" style="color:green">属性</th><th>价值</th></tr>
<tr><th colspan="2">属性2</th><th>价值2</th></tr>
</thead>
<!-- 数据 -->
<tbody>
<td name="名称" style="color:red">#name#</td>
<td name="颜色" width="12">#color#</td>
<td name="价格" width="10%">#price#</td>
</tbody>
</table>
<!-- 页面脚 -->
<footer><![CDATA[
<p>页脚</P>
]]></footer>
</word>
相关推荐
### Java实现Web报表打印功能:基于iText组件的实践 #### 概述 在Web应用领域,打印功能一直是开发者面临的挑战之一。由于Web应用本质上属于瘦客户端架构,直接操作客户端设备(如打印机)存在限制。这促使业界...
在IT行业中,导出Excel和Word是常见的数据呈现与交互需求,尤其在数据分析、报表生成、文档管理和Web应用中。本篇文章将详细讲解C#、Java和PHP这三种编程语言如何实现Excel和Word的导出功能,同时关注样式设置和处理...
在Web开发领域,PHP是一种广泛应用的服务器端脚本语言,而PHPOffice类库则是PHP开发者处理各种办公文档(如Microsoft Office格式的Word、Excel和PowerPoint)的重要工具。PHPOffice类库为PHP开发者提供了一套完整的...
总结来说,"rResReportDemo"是一个为VC++和C#开发者设计的报表解决方案,它的核心价值在于提供了一个强大的工具,用于创建Word风格的报表,支持图像嵌入、预览和打印功能,而且调用简单,有助于提升开发效率。...
FastReport.Net是一款强大的报表设计和生成工具,专为.NET Framework平台设计。它允许开发者在Windows Forms、ASP.NET、WPF以及MVC等环境下创建复杂的报表。FastReport.Net扩展类库进一步增强了其功能,提供了更多的...
其主要特点是支持实时、动态的Web报表,丰富的API接口,以及对图表的强大支持。JavaReport能够根据实时数据生成报表,并且能够动态地创建各种图表,包括柱状图、饼图和折线图等,适应于需要实时统计的应用系统。 ...
### NPOI(开源的.NET读写Excel、WORD等文档的类库)的使用教程 #### 一、NPOI简介 NPOI是.NET平台下的一款强大的文档处理类库,它允许开发者在无需安装微软Office的情况下读写Office 97-2003格式的文件,包括.xls...
JavaReport是一款强大的Web报表开发工具,尤其适用于需要实时、动态统计报表的互联网应用。其主要特点包括: 1. **实时动态报表**:JavaReport能够展示实时数据,无论是数据还是图表都能动态生成,适应实时统计需求...
安装完成后,开发者可以在Visual Studio中使用水晶报表设计工具,或者在代码中引用水晶报表的类库。 总结,水晶报表10_5独立安装包为C#开发者提供了一个全面的报表解决方案,涵盖了从报表设计到数据绑定、参数处理...
在信息技术领域,数据的呈现方式至关重要,报表作为数据可视化的重要工具,能够帮助我们快速理解复杂的信息。本文将深入探讨iReport与JasperReports这两个强大的开源工具,它们是Java环境下生成各种格式报表的理想...
综上所述,Crystal Report打印涉及了数据的获取、报表设计、打印控制等多个方面,它是一个强大而灵活的工具,可以帮助开发者创建满足各种需求的报表,并进行有效的打印处理。`CrystalReportPrintLibrary`这样的类库...
DataDynamics.ActiveReports.ToolBoxClassLib.dll 文件是 ActiveReports 的工具箱类库组件,它包含了用于报表设计的控件和类,例如表格、图表、图像、文本框等元素。这些控件可以在报表设计器中直接使用,以创建各种...
3. **水晶报表.NET SDK**:软件开发工具包,提供了丰富的API和类库,使得.NET开发者能够轻松地在代码中控制报表的生成、分发和显示。开发者可以通过编程方式设置报表参数、数据源连接、导出格式等。 4. **数据连接...
5. **导出和打印**:水晶报表支持多种导出格式,如PDF、Excel、Word等,同时也可以直接打印报表。 6. **交互式功能**:在Asp.Net Web应用中,用户可以与报表进行交互,如钻取详情、过滤数据、排序等。 7. **部署和...
使用这个库,开发者可以编写出与Office文件交互的应用程序,例如报表生成器、数据分析工具或者自动化办公系统。 总的来说,C# Office类库是C#开发中不可或缺的一部分,它极大地扩展了C#在办公自动化和数据处理领域...
1. **水晶报表简介**:水晶报表是一款强大的报表设计工具,广泛应用于商业智能领域,能够从各种数据源中提取数据,创建定制化的报表,满足企业对数据分析和信息展示的需求。 2. **数据源管理**:手册会详细讲解如何...
2. **.NET Framework**:.NET框架是微软提供的一个开发平台,它包含了大量的类库和工具,用于构建各种类型的Windows应用程序,包括Web应用程序和桌面应用程序。C#与.NET框架的结合为报表开发提供了强大的后盾。 3. ...
在C#编程环境中,打印操作是一项常见的任务,特别是在企业级应用中,如批量打印报表、证书等。这个“C#打印操作实例--批量打印学生证实例源码【201903】”是一个示例项目,旨在帮助开发者了解如何在C#中实现批量打印...