当前位置:   article > 正文

EasyExcel实现Excel文件导入导出功能_easyexcel 时间格式化

easyexcel 时间格式化

一、EasyExcel简介

Java领域解析、生成Excel比较有名的框架有Apache poi、jxl等。但他们都存在一个严重的问题就是非常的耗内存。如果你的系统并发量不大的话可能还行,但是一旦并发上来后一定会OOM或者JVM频繁的full gc。

EasyExcel是阿里巴巴开源的一个excel处理框架,以使用简单、节省内存著称。EasyExcel能大大减少占用内存的主要原因是在解析Excel时没有将文件数据一次性全部加载到内存中,而是从磁盘上一行行读取数据,逐个解析。

EasyExcel采用一行一行的解析模式,并将一行的解析结果以观察者的模式通知处理(AnalysisEventListener)

二、EasyExcel的具体使用

1、EasyExcel相关依赖

  1.    <dependency>
  2. <groupId>com.alibaba</groupId>
  3. <artifactId>easyexcel</artifactId>
  4. <version>3.1.1</version>
  5. </dependency>

2、写Excel

2.1、最简单的写(方式一)

创建实体类

  1. @NoArgsConstructor
  2. @AllArgsConstructor
  3. @Data
  4. @Builder
  5. public class User {
  6. @ExcelProperty(value = "用户编号")
  7. private Integer userId;
  8. @ExcelProperty(value = "姓名")
  9. private String userName;
  10. @ExcelProperty(value = "性别")
  11. private String gender;
  12. @ExcelProperty(value = "工资")
  13. private Double salary;
  14. @ExcelProperty(value = "入职时间")
  15. @DateTimeFormat(value = "yyyy年MM月dd日 HH时mm分ss秒")
  16. private Date hireDate;
  17. }

写入

  1. @PostMapping("/WriteExcel1")
  2. @ApiOperation(value="写excel")
  3. public void WriteExcel() {
  4. String filename = "D:\\excel\\write\\user.xlsx";
  5. // 向Excel中写入数据 也可以通过 head(Class<?>) 指定数据模板
  6. EasyExcel.write(filename, User.class)
  7. .sheet("用户信息")
  8. .doWrite(getUserData());
  9. }

当然我们需要创建数据

  1. private List<User> getUserData() {
  2. List<User> users = new ArrayList<>();
  3. for (int i = 1; i <= 10; i++) {
  4. User user = User.builder()
  5. .userId(i)
  6. .userName("admin" + i)
  7. .gender(i % 2 == 0 ? "男" : "女")
  8. .salary(i * 1000.00)
  9. .hireDate(new Date())
  10. .build();
  11. users.add(user);
  12. }
  13. return users;
  14. }

效果:

2.2、最简单的写(方式二)
  1. @PostMapping("/WriteExcel2")
  2. @ApiOperation(value="写excel")
  3. public void WriteExcel2() {
  4. String filename = "D:\\excel\\write\\user2.xlsx";
  5. // 创建ExcelWriter对象
  6. ExcelWriter excelWriter = EasyExcel.write(filename, User.class).build();
  7. // 创建Sheet对象
  8. WriteSheet writeSheet = EasyExcel.writerSheet("用户信息").build();
  9. // 向Excel中写入数据
  10. excelWriter.write(getUserData(), writeSheet);
  11. // 关闭流
  12. excelWriter.finish();
  13. }

效果:

2.3、排除模型中的属性字段
  1. @PostMapping("/WriteExcel3")
  2. @ApiOperation(value="写excel")
  3. public void WriteExcel3() {
  4. String filename = "D:\\excel\\write\\user3.xlsx";
  5. // 设置排除的属性 也可以在数据模型的字段上加@ExcelIgnore注解排除
  6. Set<String> excludeField = new HashSet<>();
  7. excludeField.add("hireDate");
  8. excludeField.add("salary");
  9. // 写Excel
  10. EasyExcel.write(filename, User.class)
  11. .excludeColumnFiledNames(excludeField)
  12. .sheet("用户信息")
  13. .doWrite(getUserData());
  14. }

效果:

2.4、向表格中导出指定属性
  1. @PostMapping("/WriteExcel4")
  2. @ApiOperation(value="写excel")
  3. public void WriteExcel4() {
  4. String filename = "D:\\excel\\write\\user4.xlsx";
  5. // 设置要导出的字段
  6. Set<String> includeFields = new HashSet<>();
  7. includeFields.add("userName");
  8. includeFields.add("hireDate");
  9. // 写Excel
  10. EasyExcel.write(filename, User.class)
  11. .includeColumnFiledNames(includeFields)
  12. .sheet("用户信息")
  13. .doWrite(getUserData());
  14. }

效果:

2.5、插入指定的列

将Java对象中指定的属性, 插入到Eexcel表格中的指定列(在Excel表格中进行列排序), 使用index属性指定列顺序

  1. @NoArgsConstructor
  2. @AllArgsConstructor
  3. @Data
  4. @Builder
  5. public class User {
  6. @ExcelProperty(value = "用户编号",index = 0)
  7. private Integer userId;
  8. @ExcelProperty(value = "姓名",index = 1)
  9. private String userName;
  10. @ExcelProperty(value = "性别",index = 2)
  11. private String gender;
  12. @ExcelProperty(value = "工资",index = 4)
  13. private Double salary;
  14. @ExcelProperty(value = "入职时间",index = 3)
  15. @DateTimeFormat(value = "yyyy年MM月dd日 HH时mm分ss秒")
  16. private Date hireDate;
  17. }
  1. @PostMapping("/WriteExcel5")
  2. @ApiOperation(value="写excel")
  3. public void WriteExcel5() {
  4. String filename = "D:\\excel\\write\\user5.xlsx";
  5. // 向Excel中写入数据
  6. EasyExcel.write(filename, User.class)
  7. .sheet("用户信息")
  8. .doWrite(getUserData());
  9. }

效果:

2.6、复杂头数据写入

@ExcelProperty注解的value属性是一个数组类型, 设置多个head时会自动合并

  1. @NoArgsConstructor
  2. @AllArgsConstructor
  3. @Data
  4. @Builder
  5. public class ComplexHeadUser {
  6. @ExcelProperty(value = {"group1", "用户编号"}, index = 0)
  7. private Integer userId;
  8. @ExcelProperty(value = {"group1", "姓名"}, index = 1)
  9. private String userName;
  10. @ExcelProperty(value = {"group2", "入职时间"}, index = 2)
  11. private Date hireDate;
  12. }
  1. @PostMapping("/WriteExcel6")
  2. @ApiOperation(value="写excel")
  3. public void WriteExcel6() {
  4. String filename = "D:\\excel\\write\\user6.xlsx";
  5. List<ComplexHeadUser> users = new ArrayList<>();
  6. for (int i = 1; i <= 10; i++) {
  7. ComplexHeadUser user = ComplexHeadUser.builder()
  8. .userId(i)
  9. .userName("大哥" + i)
  10. .hireDate(new Date())
  11. .build();
  12. users.add(user);
  13. }
  14. // 向Excel中写入数据
  15. EasyExcel.write(filename, ComplexHeadUser.class)
  16. .sheet("用户信息")
  17. .doWrite(users);
  18. }

效果:

2.7、重复写到Excel的同一个Sheet中
  1. @PostMapping("/WriteExcel7")
  2. @ApiOperation(value="写excel")
  3. public void WriteExcel7() {
  4. String filename = "D:\\excel\\write\\user7.xlsx";
  5. // 创建ExcelWriter对象
  6. ExcelWriter excelWriter = EasyExcel.write(filename, User.class).build();
  7. // 创建Sheet对象
  8. WriteSheet writeSheet = EasyExcel.writerSheet("用户信息").build();
  9. // 向Excel的同一个Sheet重复写入数据
  10. for (int i = 0; i < 2; i++) {
  11. excelWriter.write(getUserData(), writeSheet);
  12. }
  13. // 关闭流
  14. excelWriter.finish();
  15. }

效果:

2.8 写到Excel的不同Sheet中
  1. @PostMapping("/WriteExcel8")
  2. @ApiOperation(value="写excel")
  3. public void WriteExcel8() {
  4. String filename = "D:\\excel\\write\\user8.xlsx";
  5. // 创建ExcelWriter对象
  6. ExcelWriter excelWriter = EasyExcel.write(filename, User.class).build();
  7. // 向Excel的同一个Sheet重复写入数据
  8. for (int i = 0; i < 2; i++) {
  9. // 创建Sheet对象
  10. WriteSheet writeSheet = EasyExcel.writerSheet("用户信息" + i).build();
  11. excelWriter.write(getUserData(), writeSheet);
  12. }
  13. // 关闭流
  14. excelWriter.finish();
  15. }

效果:

2.9、日期/数字类型格式化

在实体类加上这两个注解即可

  1. @NumberFormat(value = "###.#") // 数字格式化,保留1位小数
  2. @DateTimeFormat(value = "yyyy年MM月dd日 HH时mm分ss秒") // 日期格式化
2.10、写入图片到Excel
  1. @NoArgsConstructor
  2. @AllArgsConstructor
  3. @Data
  4. @Builder
  5. @ContentRowHeight(value = 100) // 内容行高
  6. @ColumnWidth(value = 20) // 列宽
  7. public class ImageData {
  8. //使用抽象文件表示一个图片
  9. @ExcelProperty(value = "File类型")
  10. private File file;
  11. // 使用输入流保存一个图片
  12. @ExcelProperty(value = "InputStream类型")
  13. private InputStream inputStream;
  14. // 当使用String类型保存一个图片的时候需要使用StringImageConverter转换器
  15. @ExcelProperty(value = "String类型", converter = StringImageConverter.class)
  16. private String str;
  17. // 使用二进制数据保存为一个图片
  18. @ExcelProperty(value = "二进制数据(字节)")
  19. private byte[] byteArr;
  20. // 使用网络链接保存为一个图片
  21. @ExcelProperty(value = "网络图片")
  22. private URL url;
  23. // lombok 会生成getter/setter方法
  24. }
  1. @PostMapping("/WriteExcel9")
  2. @ApiOperation(value="写excel")
  3. public void WriteImageToExcel() throws IOException {
  4. String filename = "D:\\excel\\write\\user9.xlsx";
  5. // 图片位置
  6. String imagePath = "D:\\excel\\me.jpg";
  7. // 网络图片
  8. URL url = new URL("https://cn.bing.com/th?id=OHR.TanzaniaBeeEater_ZH-CN3246625733_1920x1080.jpg&rf=LaDigue_1920x1080.jpg&pid=hp");
  9. // 将图片读取到二进制数据中
  10. byte[] bytes = new byte[(int) new File(imagePath).length()];
  11. InputStream inputStream = new FileInputStream(imagePath);
  12. inputStream.read(bytes, 0, bytes.length);
  13. List<ImageData> imageDataList = new ArrayList<>();
  14. // 创建数据模板
  15. ImageData imageData = ImageData.builder()
  16. .file(new File(imagePath))
  17. .inputStream(new FileInputStream(imagePath))
  18. .str(imagePath)
  19. .byteArr(bytes)
  20. .url(url)
  21. .build();
  22. // 添加要写入的图片模型
  23. imageDataList.add(imageData);
  24. // 写数据
  25. EasyExcel.write(filename, ImageData.class)
  26. .sheet("帅哥")
  27. .doWrite(imageDataList);
  28. }

效果:

2.11 设置写入Excel的列宽和行高
  1. @NoArgsConstructor
  2. @AllArgsConstructor
  3. @Data
  4. @Builder
  5. @HeadRowHeight(value = 30) // 头部行高
  6. @ContentRowHeight(value = 25) // 内容行高
  7. @ColumnWidth(value = 20) // 列宽
  8. public class WidthAndHeightData {
  9. @ExcelProperty(value = "字符串标题")
  10. private String string;
  11. @ExcelProperty(value = "日期标题")
  12. private Date date;
  13. @ExcelProperty(value = "数字标题")
  14. @ColumnWidth(value = 25)
  15. private Double doubleData;
  16. }
  1. @PostMapping("/WriteExcel10")
  2. @ApiOperation(value="写excel")
  3. public void Write10() {
  4. String filename = "D:\\excel\\write\\user10.xlsx";
  5. // 构建数据
  6. List<WidthAndHeightData> dataList = new ArrayList<>();
  7. WidthAndHeightData data = WidthAndHeightData.builder()
  8. .string("字符串")
  9. .date(new Date())
  10. .doubleData(888.88)
  11. .build();
  12. dataList.add(data);
  13. // 向Excel中写入数据
  14. EasyExcel.write(filename, WidthAndHeightData.class)
  15. .sheet("行高和列宽测试")
  16. .doWrite(dataList);
  17. }

效果:

2.12、通过注解形式设置写入Excel样式
  1. @NoArgsConstructor
  2. @AllArgsConstructor
  3. @Data
  4. @Builder
  5. @HeadRowHeight(value = 30) // 头部行高
  6. @ContentRowHeight(value = 25) // 内容行高
  7. @ColumnWidth(value = 20) // 列宽
  8. // 头背景设置成红色 IndexedColors.RED.getIndex()
  9. @HeadStyle(fillPatternType = FillPatternTypeEnum.SOLID_FOREGROUND, fillForegroundColor = 10)
  10. // 头字体设置成20, 字体默认宋体
  11. @HeadFontStyle(fontName = "宋体", fontHeightInPoints = 20)
  12. // 内容的背景设置成绿色 IndexedColors.GREEN.getIndex()
  13. @ContentStyle(fillPatternType = FillPatternTypeEnum.SOLID_FOREGROUND, fillForegroundColor = 17)
  14. // 内容字体设置成20, 字体默认宋体
  15. @ContentFontStyle(fontName = "宋体", fontHeightInPoints = 20)
  16. public class DemoStyleData {
  17. // 字符串的头背景设置成粉红 IndexedColors.PINK.getIndex()
  18. @HeadStyle(fillPatternType = FillPatternTypeEnum.SOLID_FOREGROUND, fillForegroundColor = 14)
  19. // 字符串的头字体设置成20
  20. @HeadFontStyle(fontHeightInPoints = 30)
  21. // 字符串的内容背景设置成天蓝 IndexedColors.SKY_BLUE.getIndex()
  22. @ContentStyle(fillPatternType = FillPatternTypeEnum.SOLID_FOREGROUND, fillForegroundColor = 40)
  23. // 字符串的内容字体设置成20,默认宋体
  24. @ContentFontStyle(fontName = "宋体", fontHeightInPoints = 20)
  25. @ExcelProperty(value = "字符串标题")
  26. private String string;
  27. @ExcelProperty(value = "日期标题")
  28. private Date date;
  29. @ExcelProperty(value = "数字标题")
  30. private Double doubleData;
  31. }
  1. @PostMapping("/WriteExcel11")
  2. @ApiOperation(value="写excel")
  3. public void Write11() {
  4. String filename = "D:\\excel\\write\\user11.xlsx";
  5. // 构建数据
  6. List<DemoStyleData> dataList = new ArrayList<>();
  7. DemoStyleData data = DemoStyleData.builder()
  8. .string("字符串")
  9. .date(new Date())
  10. .doubleData(888.88)
  11. .build();
  12. dataList.add(data);
  13. // 向Excel中写入数据
  14. EasyExcel.write(filename, DemoStyleData.class)
  15. .sheet("样式设置测试")
  16. .doWrite(dataList);
  17. }

效果:

2.13、合并单元格
  1. @NoArgsConstructor
  2. @AllArgsConstructor
  3. @Data
  4. @Builder
  5. @HeadRowHeight(value = 25) // 头部行高
  6. @ContentRowHeight(value = 20) // 内容行高
  7. @ColumnWidth(value = 20) // 列宽
  8. /**
  9. * @OnceAbsoluteMerge 指定从哪一行/列开始,哪一行/列结束,进行单元格合并
  10. * firstRowIndex 起始行索引,从0开始
  11. * lastRowIndex 结束行索引
  12. * firstColumnIndex 起始列索引,从0开始
  13. * lastColumnIndex 结束列索引
  14. */
  15. // 例如: 第2-3行,2-3列进行合并
  16. @OnceAbsoluteMerge(firstRowIndex = 1, lastRowIndex = 2, firstColumnIndex = 1, lastColumnIndex = 2)
  17. public class DemoMergeData {
  18. // 每隔两行合并一次(竖着合并单元格)
  19. // @ContentLoopMerge(eachRow = 2)
  20. @ExcelProperty(value = "字符串标题")
  21. private String string;
  22. @ExcelProperty(value = "日期标题")
  23. private Date date;
  24. @ExcelProperty(value = "数字标题")
  25. private Double doubleData;
  26. }
  1. @PostMapping("/WriteExcel12")
  2. @ApiOperation(value="写excel")
  3. public void Write12() {
  4. String filename = "D:\\excel\\write\\user12.xlsx";
  5. // 构建数据
  6. List<DemoMergeData> dataList = new ArrayList<>();
  7. DemoMergeData data = DemoMergeData.builder()
  8. .string("字符串")
  9. .date(new Date())
  10. .doubleData(888.88)
  11. .build();
  12. dataList.add(data);
  13. // 向Excel中写入数据
  14. EasyExcel.write(filename, DemoMergeData.class)
  15. .sheet("单元格合并测试")
  16. .doWrite(dataList);
  17. }

效果:

@ContentLoopMerge

@OnceAbsoluteMerge

3、读Excel

3.1、读API的拆分

在读取Excel表格数据时, 将读取的每行记录映射成一条LinkedHashMap记录, 而没有映射成实体类

  1. @PostMapping("/ReadExcel1")
  2. @ApiOperation(value="读excel")
  3. public void Read() {
  4. String filename = "D:\\excel\\read\\read.xlsx";
  5. // 创建ExcelReaderBuilder对象
  6. ExcelReaderBuilder readerBuilder = EasyExcel.read();
  7. // 获取文件对象
  8. readerBuilder.file(filename);
  9. // 指定映射的数据模板
  10. // readerBuilder.head(DemoData.class);
  11. // 指定sheet
  12. readerBuilder.sheet(0);
  13. // 自动关闭输入流
  14. readerBuilder.autoCloseStream(true);
  15. // 设置Excel文件格式
  16. readerBuilder.excelType(ExcelTypeEnum.XLSX);
  17. // 注册监听器进行数据的解析
  18. readerBuilder.registerReadListener(new AnalysisEventListener() {
  19. // 每解析一行数据,该方法会被调用一次
  20. @Override
  21. public void invoke(Object demoData, AnalysisContext analysisContext) {
  22. // 如果没有指定数据模板, 解析的数据会封装成 LinkedHashMap返回
  23. // demoData instanceof LinkedHashMap 返回 true
  24. System.out.println("解析数据为:" + demoData.toString());
  25. }
  26. // 全部解析完成被调用
  27. @Override
  28. public void doAfterAllAnalysed(AnalysisContext analysisContext) {
  29. System.out.println("解析完成...");
  30. // 可以将解析的数据保存到数据库
  31. }
  32. });
  33. readerBuilder.doReadAll();
3.2、最简单的读(方式一)
  1. @NoArgsConstructor
  2. @AllArgsConstructor
  3. @Data
  4. @Builder
  5. public class DemoData {
  6. // 根据Excel中指定列名或列的索引读取
  7. @ExcelProperty(value = "字符串标题", index = 0)
  8. private String name;
  9. @ExcelProperty(value = "日期标题", index = 1)
  10. private Date hireDate;
  11. @ExcelProperty(value = "数字标题", index = 2)
  12. private Double salary;
  13. }
  1.     @PostMapping("/ReadExcel2")
  2. @ApiOperation(value="读excel")
  3. public void testReadExcel() {
  4. // 读取的excel文件路径
  5. String filename = "D:\\excel\\read\\read.xlsx";
  6. // 读取excel
  7. EasyExcel.read(filename, DemoData.class, new AnalysisEventListener<DemoData>() {
  8. // 每解析一行数据,该方法会被调用一次
  9. @Override
  10. public void invoke(DemoData demoData, AnalysisContext analysisContext) {
  11. System.out.println("解析数据为:" + demoData.toString());
  12. }
  13. // 全部解析完成被调用
  14. @Override
  15. public void doAfterAllAnalysed(AnalysisContext analysisContext) {
  16. System.out.println("解析完成...");
  17. // 可以将解析的数据保存到数据库
  18. }
  19. }).sheet().doRead();
  20. }

效果:

3.3、最简单的读(方式二)
  1. @PostMapping("/ReadExcel3")
  2. @ApiOperation(value="读excel")
  3. public void testReadExcel2() {
  4. // 读取的excel文件路径
  5. String filename = "D:\\excel\\read\\read.xlsx";
  6. // 创建一个数据格式来装读取到的数据
  7. Class<DemoData> head = DemoData.class;
  8. // 创建ExcelReader对象
  9. ExcelReader excelReader = EasyExcel.read(filename, head, new AnalysisEventListener<DemoData>() {
  10. // 每解析一行数据,该方法会被调用一次
  11. @Override
  12. public void invoke(DemoData demoData, AnalysisContext analysisContext) {
  13. System.out.println("解析数据为:" + demoData.toString());
  14. }
  15. // 全部解析完成被调用
  16. @Override
  17. public void doAfterAllAnalysed(AnalysisContext analysisContext) {
  18. System.out.println("解析完成...");
  19. // 可以将解析的数据保存到数据库
  20. }
  21. }).build();
  22. // 创建sheet对象,并读取Excel的第一个sheet(下标从0开始), 也可以根据sheet名称获取
  23. ReadSheet sheet = EasyExcel.readSheet(0).build();
  24. // 读取sheet表格数据, 参数是可变参数,可以读取多个sheet
  25. excelReader.read(sheet);
  26. // 需要自己关闭流操作,在读取文件时会创建临时文件,如果不关闭,会损耗磁盘,严重的磁盘爆掉
  27. excelReader.finish();
  28. }

效果:

3.4、格式化Excel中的数据格式

要读取的源数据, 日期格式是yyyy年MM月dd日 HH时mm分ss秒, 数字带小数点

  1. // 格式化日期类型数据
  2. @DateTimeFormat(value = "yyyy年MM月dd日 HH时mm分ss秒")
  3. // 格式化数字类型数据,保留一位小数
  4. @NumberFormat(value = "###.#")
3.5、读取多个sheet表格
3.5.1 读所有sheet

方式一, 使用ExcelReaderBuilder#doReadAll方法

  1. public void readExcel() {
  2. // 读取的excel文件路径
  3. String filename = "D:\\excel\\read.xlsx";
  4. // 读取excel
  5. EasyExcel.read(filename, DemoData.class, new AnalysisEventListener<DemoData>() {
  6. // 每解析一行数据,该方法会被调用一次
  7. @Override
  8. public void invoke(DemoData demoData, AnalysisContext analysisContext) {
  9. System.out.println("解析数据为:" + demoData.toString());
  10. }
  11. // 全部解析完成被调用
  12. @Override
  13. public void doAfterAllAnalysed(AnalysisContext analysisContext) {
  14. System.out.println("解析完成...");
  15. // 可以将解析的数据保存到数据库
  16. }
  17. })
  18. .doReadAll(); // 读取全部sheet
  19. }

方式二, 使用ExcelReader#readAll方法

  1. public void readExcel2() {
  2. // 读取的excel文件路径
  3. String filename = "D:\\excel\\read.xlsx";
  4. // 创建一个数据格式来装读取到的数据
  5. Class<DemoData> head = DemoData.class;
  6. // 创建ExcelReader对象
  7. ExcelReader excelReader = EasyExcel.read(filename, head,
  8. new AnalysisEventListener<DemoData>() {
  9. // 每解析一行数据,该方法会被调用一次
  10. @Override
  11. public void invoke(DemoData demoData, AnalysisContext analysisContext) {
  12. System.out.println("解析数据为:" + demoData.toString());
  13. }
  14. // 全部解析完成被调用
  15. @Override
  16. public void doAfterAllAnalysed(AnalysisContext analysisContext) {
  17. System.out.println("解析完成...");
  18. // 可以将解析的数据保存到数据库
  19. }
  20. }).build();
  21. // 创建sheet对象,并读取Excel的第一个sheet(下标从0开始), 也可以根据sheet名称获取
  22. ReadSheet sheet = EasyExcel.readSheet(0).build();
  23. // 读取sheet表格数据 , 参数是可变参数,可以读取多个sheet
  24. // excelReader.read(sheet);
  25. excelReader.readAll(); // 读所有sheet
  26. // 需要自己关闭流操作,在读取文件时会创建临时文件,如果不关闭,会损耗磁盘,严重的磁盘爆掉
  27. excelReader.finish();
  28. }
3.5.2 读指定的多个sheet

不同sheet表格的数据模板可能不一样,这时候就需要分别构建不同的sheet对象,分别为其指定对于的数据模板

  1. public void readExcel3() {
  2. // 读取的excel文件路径
  3. String filename = "D:\\study\\excel\\read.xlsx";
  4. // 构建ExcelReader对象
  5. ExcelReader excelReader = EasyExcel.read(filename).build();
  6. // 构建sheet对象
  7. ReadSheet sheet0 = EasyExcel.readSheet(0)
  8. .head(DemoData.class) // 指定sheet0的数据模板
  9. .registerReadListener(new AnalysisEventListener<DemoData>() {
  10. // 每解析一行数据,该方法会被调用一次
  11. @Override
  12. public void invoke(DemoData demoData, AnalysisContext analysisContext) {
  13. System.out.println("解析数据为:" + demoData.toString());
  14. }
  15. // 全部解析完成被调用
  16. @Override
  17. public void doAfterAllAnalysed(AnalysisContext analysisContext) {
  18. System.out.println("解析完成...");
  19. // 可以将解析的数据保存到数据库
  20. }
  21. }).build();
  22. // 读取sheet,有几个就构建几个sheet进行读取
  23. excelReader.read(sheet0);
  24. // 需要自己关闭流操作,在读取文件时会创建临时文件,如果不关闭,会损耗磁盘,严重的磁盘爆掉
  25. excelReader.finish();
  26. }

4、填充Excel

4.1、简单填充
  1. @NoArgsConstructor
  2. @AllArgsConstructor
  3. @Data
  4. @Builder
  5. public class FillData {
  6. private String name;
  7. private double number;
  8. }
  1. @PostMapping("/FillExcel1")
  2. @ApiOperation(value="excel简单填充")
  3. public void testFillExcel() {
  4. // 根据哪个模板进行填充
  5. String template = "D:\\excel\\fill\\template1.xlsx";
  6. // 填充完成之后的excel
  7. String fillname = "D:\\excel\\fill\\fill1.xlsx";
  8. // 构建数据
  9. FillData fillData = FillData.builder()
  10. .name("张三")
  11. .number(666.888)
  12. .build();
  13. // 填充excel 单组数据填充
  14. EasyExcel.write(fillname).withTemplate(template).sheet(0).doFill(fillData);
  15. }

模板:

效果:

4.2、列表填充
  1. @PostMapping("/FillExcel2")
  2. @ApiOperation(value="excel列表填充")
  3. public void testFillExcel2() {
  4. // 根据哪个模板进行填充
  5. String template = "D:\\excel\\fill\\template2.xlsx";
  6. // 填充完成之后的excel
  7. String fillname = "D:\\excel\\fill\\fill2.xlsx";
  8. // 填充excel 多组数据重复填充
  9. EasyExcel.write(fillname)
  10. .withTemplate(template)
  11. .sheet(0)
  12. .doFill(getFillData());
  13. }

模板:

效果:

4.3 水平填充
  1. @PostMapping("/FillExcel3")
  2. @ApiOperation(value="excel水平填充")
  3. public void testFillExcel4() {
  4. // 根据哪个模板进行填充
  5. String template = "D:\\excel\\fill\\template3.xlsx";
  6. // 填充完成之后的excel
  7. String fillname = "D:\\excel\\fill\\fill3.xlsx";
  8. // 创建填充配置 水平填充
  9. FillConfig fillConfig = FillConfig.builder()
  10. // .forceNewRow(true)
  11. .direction(WriteDirectionEnum.HORIZONTAL).build();
  12. // 创建写对象
  13. ExcelWriter excelWriter = EasyExcel.write(fillname,
  14. FillData.class).withTemplate(template).build();
  15. // 创建Sheet对象
  16. WriteSheet sheet = EasyExcel.writerSheet(0).build();
  17. // 多组填充excel
  18. excelWriter.fill(getFillData(), fillConfig, sheet);
  19. // 关闭流
  20. excelWriter.finish();
  21. }

模板:

效果:

4.4、其他

还有组合填充、报表导出等,需要大家自己去了解。

三、总结

以上就是EaseExcel的简单使用方法,初学者学习起来也比较简单,容易上手,实际开发中也非常实用,也很全面,最主要的是简单、节省内存。

此文章仅为本人学习笔记,如有错误,请指正!

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/算法构造者2/article/detail/61056
推荐阅读
相关标签
  

闽ICP备14008679号