0

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

我使用 jxls,但我有一个动态查询,并且输出列的数量不时变化,因此数据库结果集转换为:

List<Object[]>

. 为了生成 excel 报告,将以下代码添加到 excel Temple:

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

但是如果我有一个包含超过 1000 个元素的列表,它会给出超时异常。

你怎么看?问题是什么?jxls 是一个糟糕的选择吗?

问候

4

1 回答 1

2

如果你使用 Jxls,你应该使用最近发布的 Jxls-2。如果您需要创建动态列,Jxls-2 具有更好的性能和更灵活的功能。检查Jxls 演示项目中的动态列示例,该示例显示了如何使用Jxls-2生成动态列的示例。

该示例使用XML 配置来构建Jxls 命令,但您也可以使用 Java API 或 Excel 标记来构建它们。

XML 配置如下所示

<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代码读取模板并构建XlsArea进行处理

    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);

转换的结果是一个表格,其中填充了表格标题、列和行的动态数据值。

于 2015-06-24T23:42:53.480 回答