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

1:简介: jxls是一个简单的、轻量级的excel导出库,使用特定的标记在excel模板文件中来定义输出格式和布局。java中成熟的excel导出工具有poi、jxl,但他们都是使用java代码的方式来导出excel,编码效率很低且不方便维护。 还可以使用一些工具很轻松的实现模板导出。这些工具现在还在维护,而且做得比较好的国内的有easyPOI,国外的就是这个JXLS了。 项目中有很多... / 模版文件流(利用这个方法获取到的流是已经关闭的,后面WorkbookFactory.create(is)时报异常-流关闭)// 将数据添加到模版中生成新的excel文件。// transformer转到Excel。// 因此换成了绝对路径获取模板的方法。* 将内容填充到excel模版生成文件。适用于将查询的结果集直接根据模板导出excel。// workbook转换成流。/** 将查询的po对象集合导出 */-- 配置模板导出工具包 -->//查询导出的实体集合。 以下内容 只有excel模板的创建,没有代码的实现代码, spring 使用 jxls 的使用 可自行百度,jxls api 使用所需 数据结构 可下面内容查找 注意: excel 有三个部分内容(标题,固定列,动态列) // 列名数据 "dynamic_column": [ "label": "xxx系统", "data_name": "system_no_01" JXLS是基于Jakarta POI API的Excel报表生成工具,可以生成精美的Excel格式报表。它采用标签的方式,类似JSP标签,写一个Excel模板,然后生成报表,非常灵活,简单!         JXLS软件首页:http://jxls.sourceforge.net/,SVN源码地址:svn://svn.code.sf.net/p/jxls/code。         使用JXL 什么是jxls JXLS 是基于 Jakarta POI API 的 Excel 报表生成工具,可以生成精美的 Excel 格式报表。它采用标签的方式,类似 JSP 标签,写一个 Excel 模板,然后生成报表,非常灵活,简单! 为什么用jxls Java 有一些用于创建 Excel 文件的库,例如 Apache POI。这些库很棒,但是级别很低,因为它们要求开发人员甚至创建一个简单的 Excel 文件也要编写很多 Java 代码。通常,必须手动设置电子表格 jslx对模板Excel进行导出 jxls是在国外比较受欢迎导出工具,就和国内的easypoi类似,这两者并不冲突,就看个人喜好。我在导出Excel文档时,个人比较喜欢使用jxls,废话不多说,那就直接开干吧 第一步:导入maven坐标 <dependency> <groupId>org.jxls</groupId> <artifactId>jxls</artifactId> 最近一直在研究jxls导出问题,目前用的版本是2.4.3,标签都是写在批注中,很方便;最近做的项目需要用到导出多个sheet,导出方法很简单,但是始终会多出一个模板sheet,于是去官网找了例子查看,也都是带有一个Template的sheet,没有说明怎样去掉;找了api,方法jxlsHelper.setDeleteTemplateSheet(true)没有起作用;方法transformer.de... 前几天写导出使用了jxls,网上找了找资料就写了(https://blog.csdn.net/yali_aini/article/details/85804466),后来经理给我说,这个版本太老了,我看了看,果然 我用的那个是 14年更新的,说让我用最新的,我就找到了  jxls 的官网:http://jxls.sourceforge.net/getting_started.html,然后跟着教程...