• 使用EasyExcel后端导出excel


    官方文档:关于Easyexcel | Easy Excel

    这里进行简单记录,方便确定是不是适用此方式:

    零:实体类中注解用法

    一:读excel

    1. /**
    2. * 强制读取第三个 这里不建议 index 和 name 同时用,要么一个对象只用index,要么一个对象只用name去匹配
    3. */
    4. @ExcelProperty(index = 2)
    5. /**
    6. * 用名字去匹配,这里需要注意,如果名字重复,会导致只有一个字段读取到数据
    7. */
    8. @ExcelProperty("字符串标题")
    9. /**
    10. * 我自定义 转换器,不管数据库传过来什么 。我给他加上“自定义:”
    11. */
    12. @ExcelProperty(converter = CustomStringStringConverter.class)
    13. private String string;
    14. /**
    15. * 这里用string 去接日期才能格式化。我想接收年月日格式
    16. */
    17. @DateTimeFormat("yyyy年MM月dd日HH时mm分ss秒")
    18. private String date;
    19. /**
    20. * 我想接收百分比的数字
    21. */
    22. @NumberFormat("#.##%")
    23. private String doubleData;
    1. @Test
    2. public void simpleRead() {
    3. // 写法1:JDK8+ ,不用额外写一个DemoDataListener
    4. // since: 3.0.0-beta1
    5. String fileName = TestFileUtil.getPath() + "demo" + File.separator + "demo.xlsx";
    6. // 这里默认每次会读取100条数据 然后返回过来 直接调用使用数据就行
    7. // 具体需要返回多少行可以在`PageReadListener`的构造函数设置
    8. EasyExcel.read(fileName, DemoData.class, new PageReadListener<DemoData>(dataList -> {
    9. for (DemoData demoData : dataList) {
    10. log.info("读取到一条数据{}", JSON.toJSONString(demoData));
    11. }
    12. })).sheet().doRead();
    13. // 写法2
    14. // 匿名内部类 不用额外写一个DemoDataListener
    15. fileName = TestFileUtil.getPath() + "demo" + File.separator + "demo.xlsx";
    16. // 这里 需要指定读用哪个class去读,然后读取第一个sheet 文件流会自动关闭
    17. EasyExcel.read(fileName, DemoData.class, new ReadListener<DemoData>() {
    18. /**
    19. * 单次缓存的数据量
    20. */
    21. public static final int BATCH_COUNT = 100;
    22. /**
    23. *临时存储
    24. */
    25. private List<DemoData> cachedDataList = ListUtils.newArrayListWithExpectedSize(BATCH_COUNT);
    26. @Override
    27. public void invoke(DemoData data, AnalysisContext context) {
    28. cachedDataList.add(data);
    29. if (cachedDataList.size() >= BATCH_COUNT) {
    30. saveData();
    31. // 存储完成清理 list
    32. cachedDataList = ListUtils.newArrayListWithExpectedSize(BATCH_COUNT);
    33. }
    34. }
    35. @Override
    36. public void doAfterAllAnalysed(AnalysisContext context) {
    37. saveData();
    38. }
    39. /**
    40. * 加上存储数据库
    41. */
    42. private void saveData() {
    43. log.info("{}条数据,开始存储数据库!", cachedDataList.size());
    44. log.info("存储数据库成功!");
    45. }
    46. }).sheet().doRead();
    47. // 有个很重要的点 DemoDataListener 不能被spring管理,要每次读取excel都要new,然后里面用到spring可以构造方法传进去
    48. // 写法3
    49. fileName = TestFileUtil.getPath() + "demo" + File.separator + "demo.xlsx";
    50. // 这里 需要指定读用哪个class去读,然后读取第一个sheet 文件流会自动关闭
    51. EasyExcel.read(fileName, DemoData.class, new DemoDataListener()).sheet().doRead();
    52. // 写法4
    53. fileName = TestFileUtil.getPath() + "demo" + File.separator + "demo.xlsx";
    54. // 一个文件一个reader
    55. try (ExcelReader excelReader = EasyExcel.read(fileName, DemoData.class, new DemoDataListener()).build()) {
    56. // 构建一个sheet 这里可以指定名字或者no
    57. ReadSheet readSheet = EasyExcel.readSheet(0).build();
    58. // 读取一个sheet
    59. excelReader.read(readSheet);
    60. }
    61. }

    二:写excel

    1. @ExcelProperty("字符串标题")
    2. private String string;
    3. @ExcelProperty(value = "字符串标题", index = 0)
    4. private String string;
    5. @ExcelProperty({"主标题", "字符串标题"})
    6. private String string;
    7. @ExcelProperty({"主标题", "日期标题"})
    8. private Date date;
    9. /**
    10. * 我想所有的 字符串起前面加上"自定义:"三个字
    11. */
    12. @ExcelProperty(value = "字符串标题", converter = CustomStringStringConverter.class)
    13. private String string;
    14. /**
    15. * 我想写到excel 用年月日的格式
    16. */
    17. @DateTimeFormat("yyyy年MM月dd日HH时mm分ss秒")
    18. @ExcelProperty("日期标题")
    19. private Date date;
    20. /**
    21. * 我想写到excel 用百分比表示
    22. */
    23. @NumberFormat("#.##%")
    24. @ExcelProperty(value = "数字标题")
    25. private Double doubleData;

    另外还包含:

    图片导出、
    超链接导出、
    自定义背景导出、
    合并单元格导出、
    设置行高列宽、
    动态头、
    可变标题等
    详见文档

    1. @Test
    2. public void simpleWrite() {
    3. // 注意 simpleWrite在数据量不大的情况下可以使用(5000以内,具体也要看实际情况),数据量大参照 重复多次写入
    4. // 写法1 JDK8+
    5. // since: 3.0.0-beta1
    6. String fileName = TestFileUtil.getPath() + "simpleWrite" + System.currentTimeMillis() + ".xlsx";
    7. // 这里 需要指定写用哪个class去写,然后写到第一个sheet,名字为模板 然后文件流会自动关闭
    8. // 如果这里想使用03 则 传入excelType参数即可
    9. EasyExcel.write(fileName, DemoData.class)
    10. .sheet("模板")
    11. .doWrite(() -> {
    12. // 分页查询数据
    13. return data();
    14. });
    15. // 写法2
    16. fileName = TestFileUtil.getPath() + "simpleWrite" + System.currentTimeMillis() + ".xlsx";
    17. // 这里 需要指定写用哪个class去写,然后写到第一个sheet,名字为模板 然后文件流会自动关闭
    18. // 如果这里想使用03 则 传入excelType参数即可
    19. EasyExcel.write(fileName, DemoData.class).sheet("模板").doWrite(data());
    20. // 写法3
    21. fileName = TestFileUtil.getPath() + "simpleWrite" + System.currentTimeMillis() + ".xlsx";
    22. // 这里 需要指定写用哪个class去写
    23. try (ExcelWriter excelWriter = EasyExcel.write(fileName, DemoData.class).build()) {
    24. WriteSheet writeSheet = EasyExcel.writerSheet("模板").build();
    25. excelWriter.write(data(), writeSheet);
    26. }
    27. }

    三:填充excel

    1. @Getter
    2. @Setter
    3. @EqualsAndHashCode
    4. public class FillData {
    5. private String name;
    6. private double number;
    7. private Date date;
    8. }
    1. @Test
    2. public void simpleFill() {
    3. // 模板注意 用{} 来表示你要用的变量 如果本来就有"{","}" 特殊字符 用"\{","\}"代替
    4. String templateFileName =
    5. TestFileUtil.getPath() + "demo" + File.separator + "fill" + File.separator + "simple.xlsx";
    6. // 方案1 根据对象填充
    7. String fileName = TestFileUtil.getPath() + "simpleFill" + System.currentTimeMillis() + ".xlsx";
    8. // 这里 会填充到第一个sheet, 然后文件流会自动关闭
    9. FillData fillData = new FillData();
    10. fillData.setName("张三");
    11. fillData.setNumber(5.2);
    12. EasyExcel.write(fileName).withTemplate(templateFileName).sheet().doFill(fillData);
    13. // 方案2 根据Map填充
    14. fileName = TestFileUtil.getPath() + "simpleFill" + System.currentTimeMillis() + ".xlsx";
    15. // 这里 会填充到第一个sheet, 然后文件流会自动关闭
    16. Map<String, Object> map = MapUtils.newHashMap();
    17. map.put("name", "张三");
    18. map.put("number", 5.2);
    19. EasyExcel.write(fileName).withTemplate(templateFileName).sheet().doFill(map);
    20. }

  • 相关阅读:
    【Java】java: 无效的标记: -parameters
    11+孟德尔随机化+GWAS分析
    AI聊天ChatGPT系统源码卡密验证开源版
    Apache DolphinScheduler源码分析(超详细)
    GitLab存储空间满了
    SCADA系统在石油炼制行业的应用:如何实现石油炼制过程实时数据采集与监控?
    MPP 架构在 OLAP 数据库的运用
    Vue报错: Avoid mutating a prop directly since the value will 问题解决
    uniapp使用scroll-view,设置横向,内容重叠的问题解决
    llama-7B、vicuna-7b-delta-v1.1和vicuna-7b-v1.3——使用体验
  • 原文地址:https://blog.csdn.net/goxingman/article/details/133133761