• springboot整合Excel填充数据


     

    填充一组数据

    准备模板

    封装数据

    1. import java.util.ArrayList;
    2. import java.util.List;
    3. /**
    4. * 使用实体类封装填充数据
    5. *
    6. * 实体中成员变量名称需要和Excel表各种{}包裹的变量名匹配
    7. */
    8. @Data
    9. public class FillData {
    10. private String name;
    11. private int age;
    12. // 生成多组数据代码
    13. public static List initFillData() {
    14. ArrayList fillDatas = new ArrayList();
    15. for (int i = 0; i < 10; i++) {
    16. FillData fillData = new FillData();
    17. fillData.setName("学生0" + i);
    18. fillData.setAge(10 + i);
    19. fillDatas.add(fillData);
    20. }
    21. return fillDatas;
    22. }
    23. }

     类填充形式

    1. @Test
    2. public void test1(){
    3. // 加载模板
    4. String templateFile="src/main/resources/excel/templte/fill_data_template1.xlsx";
    5. // 写入文件
    6. String targetFileName = "单组数据填充.xlsx";
    7. // 准备对象数据填充
    8. FillData fillData = new FillData();
    9. fillData.setName("学生1");
    10. fillData.setAge(10);
    11. // 生成工作簿对象
    12. ExcelWriterBuilder workBookWriter = EasyExcel.write(targetFileName,FillData.class).withTemplate(templateFile);
    13. // 获取工作表并填充
    14. workBookWriter.sheet().doFill(fillData);
    15. }

    Map形式填充 

    1. @Test
    2. public void test1(){
    3. // 加载模板
    4. String templateFile="src/main/resources/excel/templte/fill_data_template1.xlsx";
    5. // 写入文件
    6. String targetFileName = "单组数据填充.xlsx";
    7. // 生成工作簿对象
    8. ExcelWriterBuilder workBookWriter = EasyExcel.write(targetFileName,FillData.class).withTemplate(templateFile);
    9. // 使用Map数据填充
    10. HashMap mapFillData = new HashMap<>();
    11. mapFillData.put("name", "学生1");
    12. mapFillData.put("age", "11");
    13. // 获取第一个工作表填充并自动关闭流
    14. workBookWriter.sheet().doFill(mapFillData);
    15. }

    结果 

    填充多组数据

    准备模板

    注意模板里面与上面相比是多了.的

    封装数据

    与上面一样,省略。

    填充

    1. @Test
    2. public void test02(){
    3. // 加载模板
    4. String templateFile="src/main/resources/excel/templte/fill_data_template2.xlsx";
    5. // 写入文件
    6. String targetFileName = "多组数据填充.xlsx";
    7. List fillDatas = FillData.initFillData();
    8. System.out.println(fillDatas);
    9. // 生成工作簿对象
    10. ExcelWriterBuilder workBookWriter = EasyExcel.write(targetFileName,FillData.class).withTemplate(templateFile);
    11. // 获取第一个工作表填充并自动关闭流
    12. workBookWriter.sheet().doFill(fillDatas);
    13. }

    结果

    组合填充

    准备模板

    即有多组数据填充,又有单一数据填充 。 

    封装数据

    同上。

    填充

    1. @Test
    2. public void test03(){
    3. // 加载模板
    4. String templateFile="src/main/resources/excel/templte/fill_data_template3.xlsx";
    5. // 目标文件
    6. String targetFileName = "组合数据填充.xlsx";
    7. List fillDatas = FillData.initFillData();
    8. // 生成工作簿对象
    9. ExcelWriter excelWriter = EasyExcel.write(targetFileName,FillData.class).withTemplate(templateFile).build();
    10. // 生成工作表对象
    11. WriteSheet writeSheet = EasyExcel.writerSheet().build();
    12. // 组合填充时,因为多组填充的数据量不确定,需要在多组填充完之后另起一行
    13. FillConfig fillConfig = FillConfig.builder().forceNewRow(true).build();
    14. // 填充并换行
    15. excelWriter.fill(fillDatas, fillConfig, writeSheet);
    16. HashMap otherData = new HashMap<>();
    17. otherData.put("date", "2020-03-14");
    18. otherData.put("total", "100");
    19. excelWriter.fill(otherData, writeSheet);
    20. // 关闭
    21. excelWriter.finish();
    22. }

     结果

    水平填充

    准备模板

    水平填充和多组填充模板一样,不一样的地方在于,填充时需要通过FillConfig对象设置水平填充。  

    封装数据

    同上

    填充

    1. @Test
    2. public void test04(){
    3. // 加载模板
    4. String templateFile="src/main/resources/excel/templte/fill_data_template4.xlsx";
    5. // 写入文件
    6. String targetFileName = "水平数据填充.xlsx";
    7. List fillDatas = FillData.initFillData();
    8. // 生成工作簿对象
    9. ExcelWriter excelWriter = EasyExcel.write(targetFileName,FillData.class).withTemplate(templateFile).build();
    10. // 生成工作表对象
    11. WriteSheet writeSheet = EasyExcel.writerSheet().build();
    12. // 组合填充时,因为多组填充的数据量不确定,需要在多组填充完之后另起一行
    13. FillConfig fillConfig = FillConfig.builder().direction(WriteDirectionEnum.HORIZONTAL).build();
    14. // 填充
    15. excelWriter.fill(fillDatas, fillConfig, writeSheet);
    16. // 关闭
    17. excelWriter.finish();
    18. }

    结果

    资料

    常用类

    • EasyExcel 入口类,用于构建开始各种操作;

    • ExcelReaderBuilder 构建出一个ReadWorkbook对象,即一个工作簿对象,对应的是一个Excel文件;

    • ExcelWriterBuilder 构建出一个WriteWorkbook对象,即一个工作簿对象,对应的是一个Excel文件;

    • ExcelReaderSheetBuilder 构建出一个ReadSheet对象,即一个工作表的对象,对应的Excel中的每个sheet,一个工作簿可以有多个工作表;

    • ExcelWriterSheetBuilder 构建出一WriteSheet对象,即一个工作表的对象,对应的Excel中的每个sheet,一个工作簿可以有多个工作表;

    • ReadListener 在每一行读取完毕后都会调用ReadListener来处理数据,我们可以把调用service的代码可以写在其invoke方法内部;

    • WriteHandler 在每一个操作包括创建单元格、创建表格等都会调用WriteHandler来处理数据,对使用者透明不可见;

    • 所有配置都是继承的 Workbook的配置会被Sheet继承。所以在用EasyExcel设置参数的时候,在EasyExcel…sheet()方法之前作用域是整个sheet,之后针对单个sheet。

    读取时的注解

    @ExcelProperty
    属性名含义说明
    index对应Excel表中的列数默认-1,建议指定时从0开始
    value对应Excel表中的列头
    converter成员变量转换器自定义转换器需要实Converter接口
    @ExcelIgnore

    标注在成员变量上,默认所有字段都会和excel去匹配,加了这个注解会忽略该字段  

    @DateTimeFormat

    标注在成员变量上,日期转换,代码中用String类型的成员变量去接收excel中日期格式的数据会调用这个注解。里面的value参照java.text.SimpleDateFormat

    @NumberFormat

    标注在成员变量上,数字转换,代码中用String类型的成员变量去接收excel数字格式的数据会调用这个注解。里面的value参照java.text.DecimalFormat

    @ExcelIgnoreUnannotated

    标注在类上。不标注该注解时,默认类中所有成员变量都会参与读写,无论是否在成员变量上加了@ExcelProperty 的注解。标注该注解后,类中的成员变量如果没有标注@ExcelProperty 注解将不会参与读写。

    @ExcelProperty
    属性名含义说明
    index对应Excel表中的列数默认-1,指定时建议从0开始
    value对应Excel表中的列头
    converter成员变量转换器自定义转换器需要实Converter接口
  • 相关阅读:
    windows/linux命令行操作快捷方式
    vscode运行Live Server报错:Windows找不到文件Microsoft Edge
    Java、对数列求和
    PM和PMO到底有什么区别?如何提升组织效能?
    SpringBoot入门教程:枚举嵌套分组
    基于 Vagrant 手动部署多个 Redis Server
    Vue中如何进行数据库操作与数据持久化
    如何配置一台适合oc渲染器的电脑?
    潘多拉 (Pandora),一个让你呼吸顺畅的 ChatGPT
    【STM32】STM32的Cube和HAL生态
  • 原文地址:https://blog.csdn.net/qq_63431773/article/details/132580522