Jasper Report或BIRT

我想在javaee应用程序中使用模板基础报告框架,如jxls,Jasper Report或BIRT,因为它允许我只修改满足客户要求的模板,而无需重新编译Java源代码。

我使用jxls,但我有一个dynamic的查询和输出列的数量随时间变化,所以数据库结果集转换为:

List<Object[]> 

。 为了生成excel报告,将下面的代码添加到excel中:

 <jx:forEach items="${rows}" var="row"> <jx:forEach items="${row}" var="cell"> ${cell} </jx:forEach> </jx:forEach> 

但是,如果我有超过1000个元素的列表,它会产生超时exception。

你怎么看? 问题是什么? jxls是不好的select?

问候

如果你和Jxls一起使用,你应该使用最近发布的Jxls-2。 如果您需要创builddynamic列,Jxls-2具有更好的性能,并且更加灵活。 检查Jxls Demo项目中的Dynamic Columns示例 ,其中显示了如何使用Jxls-2生成dynamic列的示例 。

该示例使用XMLconfiguration来构buildJxls命令,但您也可以使用Java API或Excel标记构build它们。

XMLconfiguration看起来像这样

 <xls> <area ref="Template!A1:B4"> <each items="headers" var="header" ref="Template!A3:A3" dir="RIGHT"> <area ref="Template!A3:A3"/> </each> <each items="rows" var="row" ref="Template!A4:A4"> <area ref="Template!A4:A4"> <each items="row" var="cell" ref="Template!A4:A4" dir="RIGHT"> <area ref="Template!A4:A4"/> </each> </area> </each> </area> </xls> 

在这种情况下, 模板Excel文件非常简单,只包含2个单元格的标记(用于标题和数据):

 ${header} ${cell} 

java代码读取模板并构buildXlsArea进行处理

  InputStream is = DynamicColumnsDemo.class.getResourceAsStream(TEMPLATE); OutputStream os = new FileOutputStream(OUTPUT); Transformer transformer = TransformerFactory.createTransformer(is, os); InputStream configInputStream = DynamicColumnsDemo.class.getResourceAsStream(DYNAMIC_COLUMNS_DEMO_XML_CONFIG); AreaBuilder areaBuilder = new XmlAreaBuilder(configInputStream, transformer); List<Area> xlsAreaList = areaBuilder.build(); Area xlsArea = xlsAreaList.get(0); 

接下来,它将所需的数据设置到上下文中,并将转换应用于源区域

  // creating context Context context = transformer.createInitialContext(); context.putVar("headers", headers); context.putVar("rows", rows); // applying transformation logger.info("Applying area " + xlsArea.getAreaRef() + " at cell " + new CellRef("Result!A1")); xlsArea.applyAt(new CellRef("Result!A1"), context); 

该转换的结果是一个填充表头,列和行的dynamic数据值的表格。