1、介绍
Jxls 是一个小型 Java 库,可以轻松生成 Excel 报告。Jxls 在 Excel 模板中使用特殊标记来定义输出格式和数据布局。
Java 有一些用于创建 Excel 文件的库,例如Apache POI。这些库都很好,但都是一些较底层的库,因为它们要求开发人员编写大量 Java 代码,甚至创建一个简单的 Excel 文件。
通常,人们必须手动设置电子表格的每个单元格格式和数据。根据报表布局和数据格式的复杂性,Java 代码可能变得相当复杂并且难以调试和维护。此外,并非所有 Excel 功能都受支持并且可以使用库 API 进行操作(例如,对宏、图表等的支持有限)。
对于不支持的功能,建议的解决方法是在 Excel 模板中手动创建对象,然后使用数据填充模板。Jxls提供了这种功能。使用 Jxls 时,只需在 Excel 模板文件中定义所需的报告格式和数据布局,然后运行 Jxls 引擎以使用数据填充模板。开发人员只需编写一点Java代码即可触发Jxls引擎对模板的处理。
2、入门示例
jxls底层是依赖poi。
引入对应的库:
<dependency>
<groupId>org.jxls</groupId>
<artifactId>jxls</artifactId>
<version>2.10.0</version>
</dependency>
<dependency>
<groupId>org.jxls</groupId>
<artifactId>jxls-poi</artifactId>
<version>2.10.0</version>
</dependency>
创建DTO:
Employee.java
package com.example.demo;
import lombok.Data;
import java.math.BigDecimal;
import java.util.Date;
@Data
public class Employee {
private String name;
private Date birthDate;
private BigDecimal payment;
private BigDecimal bonus;
}
制作模板:
注意:
jx:area(lastCell="D5")
:要模板的设置区域
jx:each(items="employees" var="employee" lastCell="D5")
:设置填充数据时的表达式命令
测试代码:
package com.example.demo;
import lombok.extern.slf4j.Slf4j;
import org.jxls.common.Context;
import org.jxls.util.JxlsHelper;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.math.BigDecimal;
import java.util.Date;
import java.util.LinkedList;
import java.util.List;
@Slf4j
public class JxlsDemoMain {
public static void main(String[] args) {
log.info("start...");
List<Employee> employeeList = generateEmployeeData();
try(InputStream is =JxlsDemoMain.class.getResourceAsStream("/templates/demo.xls");
OutputStream os = new FileOutputStream("demo-001.xls")){
Context context = new Context();
context.putVar("employees",employeeList);
JxlsHelper.getInstance().processTemplateAtCell(is,os,context,"Result!A1");
}catch (Exception e){
e.printStackTrace();
log.error(e.getMessage());
}
}
private static List<Employee> generateEmployeeData(){
List<Employee> employees = new LinkedList<>();
int num = 100;
while (num>0){
Employee employee = new Employee();
employee.setName("kexuexiong"+num);
employee.setBonus(BigDecimal.valueOf(1000));
employee.setPayment(BigDecimal.valueOf(1000));
employee.setBirthDate(new Date());
employees.add(employee);
num--;
}
return employees;
}
}
输出结果: