首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >jxls、Jasper报告或BIRT

jxls、Jasper报告或BIRT
EN

Stack Overflow用户
提问于 2015-05-10 13:39:40
回答 1查看 856关注 0票数 0

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

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

代码语言:javascript
复制
List<Object[]>

。为了生成excel报表,在excel库中添加了以下代码:

代码语言:javascript
复制
<jx:forEach items="${rows}" var="row">
    <jx:forEach items="${row}" var="cell">  ${cell} </jx:forEach>
</jx:forEach>

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

你认为如何?有什么问题吗?jxls是不是一个好的选择?

问候

EN

回答 1

Stack Overflow用户

发布于 2015-06-25 07:42:53

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

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

XML config如下所示

代码语言:javascript
复制
<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>

本例中的template Excel file非常简单,只在两个单元格中包含一个标记(用于标题和用于数据):

代码语言:javascript
复制
${header}

${cell}

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

代码语言:javascript
复制
    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);

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

代码语言:javascript
复制
    // 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);

转换的结果是一个用表头、列和行的动态数据值填充的表。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30148115

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档