JAVA 按Excel模板导出Excel文件之 Jxls
最近要做一个Excel文件导出的功能,多方对比下选用Jxls实现,按Excel模板,填充数据,导出文件。Jxls上手相对来说复杂,对于新手可能还有点抽象,所以打算写几篇文章记录下上手过程,后续也会把比较常用的场景,把对应的实现配置分享上来,希望前人栽树后人乘凉,哈哈。
导出Excel一般有Apache POI、JExcelAPI、EasyExcel、Jxls四种方案来实现。
Apache POI、JExcelAPI都是在代码中动态生成 Excel 内容的,需要在代码里调用API实现创建工作簿(Workbook)、工作表(Sheet)、单元格(Cell)等对象,并在代码中设置它们的属性,如单元格的数值、样式、格式等。JExcelAPI是封装了 Apache POI,API更简单易用点。这两种都是比较“死”的实现,说实话真的应对不了“老板”多变的“心”(需求)啊,说不定没写完A001,数据模板已经变成A95887了,代码里面调整太折磨了,当然还是看自己具体的场景来选方案。
Apache POI示例:
// 创建工作簿
Workbook workbook = new XSSFWorkbook();
// 创建工作表
Sheet sheet = workbook.createSheet("Sheet1");
// 创建行,并设置行号(索引从0开始)
Row row = sheet.createRow(0);
// 创建单元格,并设置单元格内容
Cell cell1 = row.createCell(0);
cell1.setCellValue("Hello Apache POI");
Cell cell2 = row.createCell(1);
cell2.setCellValue("YesYesYes666");
// 设置单元格样式(可选)
CellStyle style = workbook.createCellStyle();
Font font = workbook.createFont();
font.setBold(true);
style.setFont(font);
cell1.setCellStyle(style);
cell2.setCellStyle(style);
// 保存 Excel 文件
try (FileOutputStream outputStream = new FileOutputStream("文件导出.xlsx")) {
workbook.write(outputStream);
System.out.println("Excel 文件生成成功!");
} catch (IOException e) {
e.printStackTrace();
}
JExcelAPI示例:
try {
// 创建工作簿
WritableWorkbook workbook = Workbook.createWorkbook(new File("output.xls"));
// 创建工作表
WritableSheet sheet = workbook.createSheet("Sheet1", 0);
// 创建并添加单元格
Label label1 = new Label(0, 0, "Hello JExcelAPI");
WritableCellFormat cellFormat = new WritableCellFormat(new WritableFont(WritableFont.ARIAL, 12, WritableFont.BOLD));
label1.setCellFormat(cellFormat);
sheet.addCell(label1);
Label label2 = new Label(1, 0, "World");
label2.setCellFormat(cellFormat);
sheet.addCell(label2);
// 写入数据并关闭工作簿
workbook.write();
workbook.close();
System.out.println("Excel 文件生成成功!");
} catch (Exception e) {
e.printStackTrace();
}
EasyExcel、Jxls这两种则是可以基于Excel文件模板来实现的。
EasyExcel是阿里开源的(https://easyexcel.opensource.alibaba.com/docs/current/),目前看最新版本是3.3.3,说明文档提到的jxl内存溢出的问题后续文章会提到解决方案,在本文就先不说明。
主要介绍下EasyExcel通过模板生成Excel的方案,直接把官方说明文档的例子“拿来”~。
/**
* 最简单的填充
*
* @since 2.1.1
*/
@Test
public void simpleFill() {
// 模板注意 用{} 来表示你要用的变量 如果本来就有"{","}" 特殊字符 用"\{","\}"代替
String templateFileName =
TestFileUtil.getPath() + "demo" + File.separator + "fill" + File.separator + "simple.xlsx";
// 方案1 根据对象填充
String fileName = TestFileUtil.getPath() + "simpleFill" + System.currentTimeMillis() + ".xlsx";
// 这里 会填充到第一个sheet, 然后文件流会自动关闭
FillData fillData = new FillData();
fillData.setName("张三");
fillData.setNumber(5.2);
EasyExcel.write(fileName).withTemplate(templateFileName).sheet().doFill(fillData);
// 方案2 根据Map填充
fileName = TestFileUtil.getPath() + "simpleFill" + System.currentTimeMillis() + ".xlsx";
// 这里 会填充到第一个sheet, 然后文件流会自动关闭
Map<String, Object> map = MapUtils.newHashMap();
map.put("name", "张三");
map.put("number", 5.2);
EasyExcel.write(fileName).withTemplate(templateFileName).sheet().doFill(map);
}
使用EasyExcel可以满足简单场景下的Excel文件导出,而且是国内开源,中文文档还是很友好的,满足场景的也可以选择这个方案,而且还招成员,感兴趣的可以试试!
那么对于Jxls(https://jxls.sourceforge.net/)来说,优势在于Jxls可以通过Excel模板的填充数据(包括模板格式、样式、内容等),还支持各种如多Sheet页生成、数据循环回填、if判断、动态网格、照片、甚至数据源配置等。永恒java8当然后续选择v2.14.0版本来实现啦。
Jxls可以选择基于Apache POI或Java Excel API实现Excel操作。选择哪一种需要将对应的依赖全部加上才可以正确执行,不然会报错初始化失败、找不到类、找不到方法等错误。本文选择Apache POI。
导入依赖:
<dependency>
<groupId>org.jxls</groupId>
<artifactId>jxls</artifactId>
<version>2.14.0</version>
</dependency>
<dependency>
<groupId>org.jxls</groupId>
<artifactId>jxls-poi</artifactId>
<version>2.14.0</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>4.1.2</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>4.1.2</version>
</dependency>
org.jxls:jxls:2.14.0: jxls是jxls库的核心模块,提供了Excel模板引擎和数据填充功能。它允许您在Excel模板中定义布局,样式和数据填充规则,并通过jxls引擎来处理模板并生成最终的Excel报表。
org.jxls:jxls-poi:2.14.0: xls-poi是jxls与Apache POI集成的模块。它提供了jxls与POI库交互的功能,使得jxls能够与POI一起使用来生成和操作Excel文件。jxls-poi模块实现了jxls引擎与POI API之间的桥梁,使得jxls能够利用POI的功能来生成Excel报表。
org.apache.poi:poi:4.1.2: Apache POI是一个用于操作Microsoft Office文档的Java库,包括对Excel等文件格式的读写功能。poi模块是POI库的核心模块,提供了基本的Excel文件操作功能,如创建、读取、修改和保存Excel文件等。
org.apache.poi:poi-ooxml:4.1.2: poi-ooxml模块是POI库中用于处理OOXML格式(即Office Open XML格式)文件的模块。OOXML是一种基于XML的文件格式,用于存储Microsoft Office文档(如.xlsx格式的Excel文件)。poi-ooxml模块扩展了poi模块,使POI库能够处理OOXML格式的Excel文件。
模版文件:
Context context = new Context();
JxlsHelper.getInstance().processTemplate(in,out, context);
模板是通过批注来配置数据的,通过context传入值。
可以通过这个显示设置是否显示批注:
默认需要在A1位置(第一个单元格)批注模板配置的范围(jx:area),不然会报错:
jx:area(lastCell=”A2”)表示模板配置的跟区域定义为 A1:A2。
取值占位符默认为 ${} ,这个也可以通过重写方法改变。
${name}表示从context中取key为name的值赋值给单元格。
${message}表示从context中取key为message的值赋值给单元格。
更多内容请关注后续更新~