JXLS 入门指南

本贴最后更新于 1319 天前,其中的信息可能已经时移世改

推荐阅读:
jxls2.3-简明教程
JXLS 2.4.0 系列教程(三)——嵌套循环是怎么做到的

以下为官网的翻译版本

1. 入门指南

让我们假设我们有一个 employee 对象的 Java 集合,我们想将其输出到 Excel 中。employee 类可能看起来像这样

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

为了使用 Jxls 将这个对象集合输出到 Excel 中,我们需要做以下工作

  • 在你的项目中添加所需的 Jxls 库
  • 使用特殊标记创建一个 Excel 模板
  • 使用 Jxls API 来处理准备好的模板,并将 employee 数据填入其中

让我们详细看看这些步骤中的每一步。

2. 将 Jxls 库添加到项目中

向项目添加 Jxls 库的最简单方法是使用 Maven,并在项目构建配置文件中指定所需库。

Jxls jars 在中央 Maven 仓库中可用。

我们需要向核心 Jxls 模块添加以下依赖关系

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

或者你可以从 Sourceforge 网站下载 Jxls 发行版,并使用该发行版中的 jars。

除了对核心 Jxls 模块的依赖,我们还需要增加对 Jxls 转换引擎的依赖,它将执行所有底层的 Java 到 Excel 的操作。

正如 Transformers section 所解释的(见 main concepts))。Jxls 的核心模块不依赖于任何特定的 Java-Excel 库,它只通过预定义的接口与 Excel 一起工作。目前,Jxls 在基于著名的 Apache POI 和 Java Excel API 库的独立模块中提供了这个接口的两个实现。

要使用基于 Apache POI API 的转化器实现,请添加以下依赖关系

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

要使用基于 Java Excel API 的转化器实现,请添加以下依赖项

<dependency>
    <groupId>org.jxls</groupId>
    <artifactId>jxls-jexcel</artifactId>
    <version>${jxlsJexcelVersion}</version>
</dependency>

3. 创建 Excel 模板

模板是一个 excel 文件,它使用一个特殊的标记来指定 Jxls 应该如何输出数据。

Jxls 提供了一些内置的标记处理器,可以用来解析 excel 模板并提取控制命令。

如果需要,还可以创建一个自定义的标记处理器。因此,可以为 excel 模板定义自己的标记,并以适当的方式解析,以创建 Jxls 命令结构。

让我们来看看内置的 Jxls 标记处理器。

默认情况下,Jxls 支持 Apache JEXL 作为一种表达式语言,可以在 excel 模板中使用,以引用 java 对象的属性和方法。该对象必须在 Jxls 上下文中的某个键下可用。为了在单元格中输出 employee 的 name,我们可以在单元格 ${employee.name} 中放入以下文字。基本上我们只是用 ${and} 来包围 Jexl 表达式。我们假设在上下文中,employee 键下有一个 Employee 对象。

属性符号是可配置的,所以你可以决定使用例如 [[employee.name]] 作为一个属性符号。关于如何做的更多细节,请参阅表达式语言。

输出 employee 对象列表的例子的最终模板可以在这里下载,看起来是这样的

Template

在第 4 行的模板单元中,我们使用上述的 JEXL 表达式来引用 employee 对象的属性。

A1 单元格包含一个 excel 注释,其内容如下 jx:area(lastCell="D4")。它定义了我们模板的根区域为 A1:D4

A4 单元格的注释定义了 Jxls Each-Command(遍历命令),注释文本如下 jx:each(items="employees" var="employees" lastCell="D4")Each-Command 将遍历 Jxls 上下文中 Employees 键下的对象集合,并将每个单独的集合项放入 Employees 键下的上下文(由 var 属性定义)。Each-Command 的主体区域是 A4:D4(由 lastCell 属性定义),它将与上下文中的每个新 Employee 对象一起被克隆和处理。

这个例子假设使用 XlsCommentAreaBuilder 类来构建模板中的 Jxls 区域。通过使用这个类,你可以在 Excel 单元格注释中定义 Jxls 命令。如果你喜欢在 Java 代码中定义命令,那么模板将是相同的,只是你必须删除单元格中的注释。

4. 使用 Jxls API 来处理模板

这里你可以看到如何使用 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.xls 加载模板。而目标 excel 文件将被写入 target/object_collection_output.xls

所有的主要处理都在一行中进行

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

默认情况下,JxlsHelper 假设你想用数据覆盖模板表。

但是你也可以选择通过使用以下方法在另一个工作表中生成数据

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

这里的区域将被处理在结果表的 A1 单元格。

最后的 report 可以在这里下载,看起来是这样的

Output

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...