jxls是非常小巧方便生成excel报表的工具库。jxls在excel模板中使用特定标记,定义输出格式和数据布局。在很多应用中有报表功能需要生成excel。
java有很多开源或商业库可以创建excel文件(如,APACHE POI, JAVA EXCEL API)。这些库在一定程度上很低级,即使需要创建简单excel文件,也需要写很多java代码。通常需要针对每个单元格设置格式或数据,对于那种复杂的报表布局和格式化数据,代码会非常复杂且难以调试和维护。另外,并不是所有excel特性都被支持及通过API进行操作(例如:宏或图像),对于不支持的特性,建议的解决方案是在Excel模板中手动创建对象,然后用数据填充模板。
Jxls将这种方法提升到了一个更高的层次。在使用Jxls时,只需在Excel模板中定义所有的报表格式和数据布局,并运行Jxls引擎,为其提供要填充模板的数据。在大多数情况下,您只需要编写并调用具有适当配置Jxls引擎程序。
下面通过一个简单示例进行说明。
假设有java集合,包括Employee对象,用于输出至Excel中,Employee类定义如下:
public class Employee {
private String name;
private Date birthDate;
private BigDecimal payment;
private BigDecimal bonus;
// ... constructors
// ... getters/setters
}
实现步骤如下:
下面详细说明每一步骤。
最简单的方式是使用maven或gradle。需要使用jxls的两个模块及底层实现:
org.jxls
jxls
2.4.7
除了依赖jxls模块的core模块,还需要增加依赖用于实现jxls转换引擎的实现,用于执行所有底层java对excel的操作。jxls核心模块不依赖任何特定java-excle库,而是基于与特定excel库无关的一组接口。当前jxls支持两种实现:APACHE POI, JAVA EXCEL API。
基于poi转换,需要使用下面依赖模块:
org.jxls
jxls-poi
1.0.16
使用java excel api转换,需要相应的依赖模块:
org.jxls
jxls-jexcel
1.0.7
当然,具体poi库或jexcel库也需要引入。
模板是使用特定标记指定如何输出数据的excel文件。jxls提供了内置的标记处理器用于解析excel模板并提取控制指令。必要时也可以自定义的标记。
jxls默认使用Apache jexl表达式,用于在模板中引用对象的属性和方法。对象必须在jxls 的上下文中用key进行关联,如需要输出employee名称,使用${employee.name}
。表达式最基本的语法是使用${
和}
,假设上下文中有使用employee作为key的对象。
上面模板供使用4行。在A1单元格包括批注内容为:jx:area(lastCell="D4")
,其定义模板的根区域为A1:A4
。Each命令用于迭代employees 集合,并填充每个集合元素值(和标记中var属性值保持一致)。each命令的主体区域为A4:D4
(有lastCell属性定义),该区域将随着上下文中每个Employee对象进行复制并处理。
该示例使用XlsCommentAreaBuilder类构建模板中Jxls区域。使用该类可以通过模板批注定义区域。如果你喜欢用java代码实现同样功能,你需要删除模板中的批注。
下面看如何使用Jxls API处理excel 模板,代码很简单:
...
logger.info("Running Object Collection demo");
List 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模板生成报表。更多功能读者可以查看官网文档。