Skip to main content
 首页 » 编程设计

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

2022年07月19日154unruledboy

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模板生成报表。更多功能读者可以查看官网文档。


本文参考链接:https://blog.csdn.net/neweastsun/article/details/86600457