easy-excel 是基于 Apache POI 框架的一款扩展封装库,让我们在开发中更快速的完成导入导出的需求。 尽管很多人会提出 poi 能干这事儿为什么还要封装一层呢?
easy-excel 很大程度上简化了代码、让使用者更轻松的 读、写 Excel 文档,也不用去关心格式兼容等问题,很多时候我们在代码中会写很多的 for 循环,各种 getXXXIndex 来获取行或列让代码变的更臃肿。多个项目之间打一枪换一个地方,代码 Copy 来 Copy 去十分凌乱, 如果你也在开发中遇到类似的问题,那么 easy-excel 是你值得一试的工具。
支持:
<dependency>
<groupId>io.github.itguanggroupId>
<artifactId>easy-excelartifactId>
<version>1.0.2-RELEASEversion>
dependency>
compile group: 'io.github.itguang', name: 'easy-excel', version: '1.0.2-RELEASE'
下面是我们的 Java 模型类,用于存储 Excel 的行数据。
第一步: 为我们的 pojo 添加 @ExcelColumn
注解,后面会给出各个参数的意思。
@Data
@AllArgsConstructor
public class Product {
@ExcelColumn(columnName = "id", index = 10)
private Integer id;
@ExcelColumn(columnName = "价格", index = 20, centToYuan = true, suffix = " 元", columnNameCellStyleHandler =
YellowBgCellStyleHandler.class)
private Long price;
@ExcelColumn(columnName = "创建日期", index = 60, columnNameCellStyleHandler = GreyBgCellStyleHandler.class)
private OffsetDateTime created;
@ExcelColumn(columnName = "名称", index = 40)
private String name;
@ExcelColumn(columnName = "是否是新品", index = 41, trueToStr = "新品", falseToStr = "非新品")
private Boolean isNew;
@ExcelColumn(columnName = "订单状态", index = 50, enumKey = "name", prefix = "状态: ", cellStyleHandler =
RedFontCellStyleHandler.class)
private StateEnum stateEnum;
@ExcelColumn(columnName = "状态变更日期", index = 55)
private LocalDateTime updateTime;
@ExcelColumn(columnName = "备注", index = 70)
private String other;
}
第二步: 调用 ExcelWriter
类进行导出操作, write() 方法 会返回一个 Workbook
对象
@Test
public void testExport() throws IOException {
Workbook workbook = ExcelWriter.create(ExcelType.XLS)
.sheetName("商品数据")
.sheetHeader("--2月份商品数据--")
.write(products, Product.class);
File file = new File(productFile);
OutputStream outputStream = new FileOutputStream(file);
workbook.write(outputStream);
outputStream.close();
}
导出表格:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-yX6GH0eK-1587636665081)(https://s2.ax1x.com/2020/02/28/3DWpTO.png)]
假设我们现在有这样一张 excel 表格:
第一步: 给需要接收excel数据的 pojo 实体类添加注解: @ExcelColumn
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Employee {
@ExcelColumn(index = 10, columnName = "ID")
private Integer id;
@ExcelColumn(index = 20, columnName = "名称")
private String name;
@ExcelColumn(index = 30, columnName = "工资", yuanToCent = true, suffix = " 元")
private Long salary;
@ExcelColumn(index = 40, columnName = "性别",enumKey = "name")
private Gender gender;
@ExcelColumn(index = 50, columnName = "生日")
private OffsetDateTime birthday;
}
需要注意的是,导入操作,接受的实体类必须有无参构造器,否则不能出入成功
第二步: 调用 ExcelReader
类的方法
@Test
public void test_import_xlsx() throws FileNotFoundException {
InputStream fileInputStream = new FileInputStream(employeeFile_Xlsx);
List<Employee> employees = ExcelReader
.read(fileInputStream, ExcelType.XLSX)
.columnNameRowNum(1)
.toPojo(Employee.class);
Assert.assertNotNull(employees);
}
@ExcelColumn
注解提供了常用的 转换操作,包括列名定义,列排序,Boolean值转换,前缀后缀,日期格式化,分转元,元转分 等等.
对于更加复杂的转换,提供了转换器接口:
对于需要自定义样式的需求,分别提供了 对于 columnName
和 rowData
的样式处理器:
参数 | 解释 |
---|---|
columnName | xcel 每一列的名称 |
index | 排序(仅对导出有效),支持不连续的整数 |
datePattern | 日期格式,默认: yyyy/MM/dd,只支持 OffsetDateTime和 LocalDateTime |
required | 是否必须 |
enumKey | 枚举导入使用的key,序列化枚举使用 |
trueToStr | true 转换字符串(仅对导出有效) |
strToTrue | 字符串转 true(仅对导入有效) |
falseToStr | false 转换(仅对导出有效) |
strToFalse | 字符串 转 false(仅对导入有效) |
prefix | 前缀 |
suffix | 后缀 |
centToYuan | 是否启用 分转元(仅对导出有效) ,支持 Integer 和 Long 类型 |
yuanToCent | 是否启用 元转分(仅对导入有效),支持 Integer 和 Long 类型 |
writeConverter | 导出转换器 |
readConverter | 导入转换器 |
cellStyleHandler | rowData 样式处理器 |
columnNameCellStyleHandler | columnName 样式处理器 |
查看 wiki
本项目采用 github action CI 自动构建,每当 master 分支有变动时就会触发构建,运行所有单元测试。
目前的 jacoco 测试报告:
导入导出的核心代码基本覆盖到
Apache2.0