JasperReports的HTML和PDF输出

8
我希望使用JSP创建一个动态报告网页,主要包括以下部分:
  1. 筛选器:用户可以指定筛选条件并按下筛选按钮。
  2. HTML输出:筛选结果会显示在此处。它是一个较大的HTML页面(如果一页太大,则可能有多个页面)。它可能包含到系统其他部分的链接。
  3. PDF输出:用户应该能够保存报告的PDF版本以进行打印或归档。
为了避免自己实现所有功能,我想使用Java报告库,因此我使用JasperReports创建了我的报告。PDF输出非常好,但报告的HTML导出不适合我的目的。
JasperReport的HTML导出功能会生成一个带有许多硬编码和相当随意配置选项的HTML文件。例如,它默认创建一个白色背景的表格(<table style="... bgcolor="white" ... ">),可以使用IS_WHITE_PAGE_BACKGROUND选项关闭,但是cellpadding="0" cellspacing="0" border="0"table标记中被硬编码。另外,与其使用跨度类,HTML文件包含了<span style="font-family: sansserif; color: #000000; font-size: 10.0px;">来表示所有字段,这很奇怪(并且使CSS样式设置变得困难)。
当然我可以使用JSP实现html输出,但这意味着我必须设计两次输出(一次在jrxml中用于JasperReports,一次在JSP中),并且我必须重新实现报告功能(例如小计计算,总计算,分组...),这违反了DRY原则。
那么如何最好地实现呢?是否可能使用JasperReports创建更好的HTML导出?
1个回答

11

将JasperReports生成的HTML输出变得美观并不容易。以下是一则旧引言,解释了其中的原因:

 

…像HTML或XLS这样的文档格式,不支持文本和图形元素的绝对定位。此类文档的内容以网格或表结构排列。当然,有人可能会认为在HTML中绝对定位元素是可能的,这要感谢CSS,但可以确定的是,CSS标准功能远未在所有浏览器中实现,或者相同的HTML文档在各处看起来都不同。

    

这就是为什么^JasperReports内置的导出程序会使用特殊算法来安排某个文档页面上存在的元素,从而以某种网格的形式排列导出为HTML、XLS或CSV等文件。当报告设计非常复杂或集聚时,从绝对定位转换为网格或表布局会产生非常复杂的表格,其中包含许多未使用的行和列,以适应元素之间的空白空间或其特殊对齐方式。

来源

正如所提到的,这是一则旧引言,但就我所知它仍然准确无误。

你可以控制HTML导出器的事项非常有限:

net.sf.jasperreports.export.html.frames.as.nested.tables
net.sf.jasperreports.export.html.remove.emtpy.space.between.rows
net.sf.jasperreports.export.html.size.unit
net.sf.jasperreports.export.html.using.images.to.align
net.sf.jasperreports.export.html.white.page.background
net.sf.jasperreports.export.html.wrap.break.word
net.sf.jasperreports.export.{format}.exclude.origin.{suffix}.{arbitrary_name}
net.sf.jasperreports.export.{format}.exclude.origin.keep.first.{suffix}.{arbitrary_name}

这里有文档

我一直避免使用HTML,只使用PDF、Excel和CSV,除非客户要求HTML。如果必须使用HTML,则可以定义样式表与网站配合,并使用jQuery删除所有内联样式,使您的样式表接管控制。示例如下:

$(document).ready(function() {
   $('span').removeAttr('style');
});

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接