JXls实现基于excel模板生成报表

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/neweastsun/article/details/86600457

JXls实现基于excel模板生成报表

jxls是非常小巧方便生成excel报表的工具库。jxls在excel模板中使用特定标记,定义输出格式和数据布局。在很多应用中有报表功能需要生成excel。

java有很多开源或商业库可以创建excel文件(如,APACHE POI, JAVA EXCEL API)。这些库在一定程度上很低级,即使需要创建简单excel文件,也需要写很多java代码。通常需要针对每个单元格设置格式或数据,对于那种复杂的报表布局和格式化数据,代码会非常复杂且难以调试和维护。另外,并不是所有excel特性都被支持及通过API进行操作(例如:宏或图像),对于不支持的特性,建议的解决方案是在Excel模板中手动创建对象,然后用数据填充模板。

Jxls将这种方法提升到了一个更高的层次。在使用Jxls时,只需在Excel模板中定义所有的报表格式和数据布局,并运行Jxls引擎,为其提供要填充模板的数据。在大多数情况下,您只需要编写并调用具有适当配置Jxls引擎程序。

快速指南

下面通过一个简单示例进行说明。

定义pojo

假设有java集合,包括Employee对象,用于输出至Excel中,Employee类定义如下:

public class Employee {
    private String name;
    private Date birthDate;
    private BigDecimal payment;
    private BigDecimal bonus;
    // ... constructors
    // ... getters/setters
}

实现步骤如下:

  1. 增加必要的依赖库
  2. 使用特定的标记创建excel模板文件
  3. 使用jxls库的api处理模板并使用employee数据进行填充

下面详细说明每一步骤。

增加依赖库

最简单的方式是使用maven或gradle。需要使用jxls的两个模块及底层实现:

<dependency>
    <groupId>org.jxls</groupId>
    <artifactId>jxls</artifactId>
    <version>2.4.7</version>
</dependency>

除了依赖jxls模块的core模块,还需要增加依赖用于实现jxls转换引擎的实现,用于执行所有底层java对excel的操作。jxls核心模块不依赖任何特定java-excle库,而是基于与特定excel库无关的一组接口。当前jxls支持两种实现:APACHE POI, JAVA EXCEL API。

基于poi转换,需要使用下面依赖模块:

<dependency>
    <groupId>org.jxls</groupId>
    <artifactId>jxls-poi</artifactId>
    <version>1.0.16</version>
</dependency>

使用java excel api转换,需要相应的依赖模块:

<dependency>
    <groupId>org.jxls</groupId>
    <artifactId>jxls-jexcel</artifactId>
    <version>1.0.7</version>
</dependency>

当然,具体poi库或jexcel库也需要引入。

创建excel模板

模板是使用特定标记指定如何输出数据的excel文件。jxls提供了内置的标记处理器用于解析excel模板并提取控制指令。必要时也可以自定义的标记。

jxls默认使用Apache jexl表达式,用于在模板中引用对象的属性和方法。对象必须在jxls 的上下文中用key进行关联,如需要输出employee名称,使用${employee.name}。表达式最基本的语法是使用${},假设上下文中有使用employee作为key的对象。

示例excel模板文件如下:
在这里插入图片描述

上面模板供使用4行。在A1单元格包括批注内容为:jx:area(lastCell="D4"),其定义模板的根区域为A1:A4。Each命令用于迭代employees 集合,并填充每个集合元素值(和标记中var属性值保持一致)。each命令的主体区域为A4:D4(有lastCell属性定义),该区域将随着上下文中每个Employee对象进行复制并处理。

该示例使用XlsCommentAreaBuilder类构建模板中Jxls区域。使用该类可以通过模板批注定义区域。如果你喜欢用java代码实现同样功能,你需要删除模板中的批注。

Jxls API处理excel模板

下面看如何使用Jxls API处理excel 模板,代码很简单:

...
    logger.info("Running Object Collection demo");
    List<Employee> employees = generateSampleEmployeeData();
    try(InputStream is = ObjectCollectionDemo.class.getResourceAsStream("object_collection_template.xls")) {
        try (OutputStream os = new FileOutputStream("target/object_collection_output.xls")) {
            Context context = new Context();
            context.putVar("employees", employees);
            JxlsHelper.getInstance().processTemplate(is, os, context);
        }
    }
...

首先从classpath路径下加载object_collection_template.xlsx模板文件,然后定义输出报表文件 target/object_collection_output.xlsx。实际处理仅一行代码:

JxlsHelper.getInstance().processTemplate(is, os, context);

JxlsHelper类默认假设你想使用数据覆盖模板sheet。也你选择在另一个sheet中生成数据:

JxlsHelper.getInstance().processTemplateAtCell(is, os, context, "Result!A1");

在输出区域将从Result sheet中A1单元格开始。
最终报表输出如下图:

在这里插入图片描述

总结

本文介绍了Jxls库,可以轻松实现基于excel模板生成报表。更多功能读者可以查看官网文档。

猜你喜欢

转载自blog.csdn.net/neweastsun/article/details/86600457