一、EasyExcel 是什么?
EasyExcel 是阿里巴巴开源的一个 Java Excel 处理工具,它基于 Apache POI 进行封装,提供了更简洁的 API,使得开发者可以更方便地读取和写入 Excel 文件。
EasyExcel 的主要特点包括:
1.简单易用:EasyExcel 提供了简洁的 API,使得开发者可以快速上手,无需深入了解 Apache POI 的复杂 API。
2.性能优化:EasyExcel 对 Apache POI 进行了优化,减少了内存的使用,提高了读写 Excel 文件的性能。
3.功能丰富:EasyExcel 支持 Excel 的各种格式,包括单元格样式、公式、图片、图表等。
4.支持多种 Excel 格式:EasyExcel 支持 .xls 和 .xlsx 格式的 Excel 文件。
5.支持流式读写:EasyExcel 支持流式读写 Excel 文件,可以处理非常大的 Excel 文件。
EasyExcel 的核心注解用于定义如何将 Java 对象映射到 Excel 文件的单元格。
以下是一些常用的注解:
1.@ExcelProperty
:用于指定 Java 对象的属性与 Excel 文件中的列的映射关系。你可以通过 value
属性指定列的标题,通过 index
属性指定列的索引,converter 自定义转换器。
2.@ExcelIgnore
:用于忽略 Java 对象的某个属性,使其不被写入到 Excel 文件中。
3.@ExcelIgnoreUnannotated
:用于忽略没有使用 EasyExcel 注解的 Java 对象的属性。
4.@ExcelFormat
:用于指定日期或数字的格式。
5.@ExcelCollection
:用于指定 Java 对象的集合属性与 Excel 文件中的行的映射关系。
作用于类上面就是全局,属性上面就是当列
6.@HeadRowHeight(value = 30) // 头部行高
7.@ContentRowHeight(value = 25) // 内容行高
8.@HeadFontStyle(fontName = "宋体", fontHeightInPoints = 11)
二、使用EasyExcel
1、导出excel表格
(1)pom.xml导入easyexcel依赖
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>easyexcel</artifactId>
<version>3.2.1</version>
</dependency>
(2)新建实体类
@Data
@AllArgsConstructor
@NoArgsConstructor
public class UserDO {
@ExcelProperty(value = "用户编号",index = 0)
@ColumnWidth(20)
private Long id;
@ExcelProperty(value = "用户名",index = 1)
@ColumnWidth(20)
private String username;
@ExcelProperty(value = "性别", converter = GenderConverter.class,index = 2)
@ColumnWidth(10)
private Integer gender;
}
(3)新建性别转换器
/**
* Excel 性别转换器
*
*/
public class GenderConverter implements Converter<Integer> {
@Override
public Class<?> supportJavaTypeKey() {
return Integer.class;
}
@Override
public CellDataTypeEnum supportExcelTypeKey() {
return CellDataTypeEnum.STRING;
}
@Override
public Integer convertToJavaData(ReadConverterContext<?> context) {
return (context.getReadCellData().getStringValue()).equals("男性")?1:2;
}
@Override
public WriteCellData<?> convertToExcelData(WriteConverterContext<Integer> context) {
return new WriteCellData<>(context.getValue()==1?"男性":"女性");
}
}
(4)新建数据处理类
public class ExcelExportService {
public void exportExcel(String filePath) {
// 准备数据
List<UserDO> userList = prepareData();
// 创建ExcelWriter对象
ExcelWriter excelWriter = EasyExcel.write(filePath, UserDO.class).build();
// 创建WriteSheet对象
WriteSheet writeSheet = EasyExcel.writerSheet("用户信息").build();
// 将数据写入Excel
excelWriter.write(userList, writeSheet);
// 关闭ExcelWriter对象
excelWriter.finish();
}
private List<UserDO> prepareData() {
// 创建测试数据
List<UserDO> userList = new ArrayList<>();
userList.add(new UserDO(1l,"张三",1));
userList.add(new UserDO(2l,"李四", 1));
userList.add(new UserDO(3l,"王五", 2));
return userList;
}
public static void main(String[] args) throws CloneNotSupportedException {
ExcelExportService excelExportService = new ExcelExportService();
excelExportService.exportExcel("user.xlsx");
}
}
导出成功
2、导入excel表格
(1)新建excel监听类
public class ExcelListener extends AnalysisEventListener<UserDO> {
//创建list集合封装最终的数据
public static List<UserDO> list = new ArrayList<>();
//一行一行去读取excle内容,把每行的内容封装到实体类对象中
//注:读取是从第二行开始读取,第一行默认为表头,不进行读取。
@Override
public void invoke(UserDO userDO, AnalysisContext analysisContext) {
if (userDO.getUsername()!=null) {
// 文件重复部分不再插入
if (!list.contains(userDO)) {
list.add(userDO);
}
}
}
//读取excel表头信息,headMap即为表头信息
@Override
public void invokeHeadMap(Map<Integer, String> headMap, AnalysisContext context) {
System.out.println("表头信息:"+headMap);
}
//读取完成后执行
@Override
public void doAfterAllAnalysed(AnalysisContext analysisContext) {
}
}
(2)在数据处理类添加获取excel表格方法
public void getExcel(String filePath) {
String fileName = filePath;
// 这里 需要指定读用哪个class去读,然后读取第一个sheet 文件流会自动关闭
//read方法的三个参数:第一个:文件名;第二个:实体类的Class对象;第三个:监听器的对象
EasyExcel.read(fileName, UserDO.class, new ExcelListener()).sheet("用户信息").doRead();
System.out.println(ExcelListener.list);
}
(3)启动并打印
public static void main(String[] args) throws CloneNotSupportedException {
ExcelExportService excelExportService = new ExcelExportService();
// excelExportService.exportExcel("user.xlsx");
excelExportService.getExcel("user.xlsx");
}
控制台信息