• EasyExcel入门(最简单的读)


    官网:EasyExcel官方文档 - 基于Java的Excel处理工具 | Easy Excel (alibaba.com)

    因为暂时项目没有用到,所以不急,知道了这个技术。就想着学着用一下!

    最简单的读

     先看官方文档给的用法和解释!!!

    导入依赖

    1. <dependency>
    2. <groupId>com.alibabagroupId>
    3. <artifactId>easyexcelartifactId>
    4. <version>3.3.2version>
    5. dependency>
    6. <dependency>
    7. <groupId>org.projectlombokgroupId>
    8. <artifactId>lombokartifactId>
    9. dependency>
    10. <dependency>
    11. <groupId>com.alibabagroupId>
    12. <artifactId>fastjsonartifactId>
    13. <version>1.2.70version>
    14. dependency>

    创建实体类

     自己准备一个Excel表格。

    1. @Data
    2. public class DemoData {
    3. private String name;
    4. private String sex;
    5. private String age;
    6. }

    测试

    官方提供了4种写法

    写法一:

    1. final String fileName = "C:\\Users\\gong'chao\\Desktop\\58_com_resumes_bj.xls";
    2. /**
    3. * 最简单的读 - 01
    4. */
    5. @Test
    6. void readExcel01(){
    7. AtomicInteger i = new AtomicInteger();
    8. EasyExcel.read(fileName, DemoData.class, new PageReadListener(dataList -> {
    9. for (DemoData demoData : dataList) {
    10. System.out.println("读取到一条数据" + JSON.toJSONString(demoData));
    11. i.getAndIncrement();
    12. }
    13. // 输出集合长度
    14. System.err.println(dataList.size());
    15. })).sheet().doRead();
    16. // 输出总行数
    17. System.out.println(i);
    18. }

    点击PageReadListener查看源码:

     默认是一行一行读取。然后可以再点进ListUtils中查看,可以知道,一行一行的将数据存进集合中,当长度到100时重新new一个集合,则原来的集合对象不被引用交给垃圾回收。这就是 Easy Excel 处理大文件内存溢出的一种方式吧。

    ---   个人理解

    然后可以看出实体类映射的三个字段输出的值不匹配。按照官网给出的注解:

    1. @Data
    2. public class DemoData {
    3. @ExcelProperty(value = "姓名")
    4. private String name;
    5. @ExcelProperty(value = "性别")
    6. private String sex;
    7. @ExcelProperty(index = 5)
    8. private String age;
    9. }

    可以指定列名,也可以指定下标。这样就正确映射了

    写法二:内部类

    1. /**
    2. * 最简单的读 - 02
    3. */
    4. @Test
    5. void readExcel02(){
    6. EasyExcel.read(fileName, DemoData.class, new ReadListener(){
    7. // 单次缓存的数量
    8. public static int BATCH_COUNT = 200;
    9. // 临时存储
    10. private List cachedDataList = ListUtils.newArrayListWithExpectedSize(BATCH_COUNT);
    11. @Override
    12. public void invoke(DemoData data, AnalysisContext context) {
    13. cachedDataList.add(data);
    14. if(cachedDataList.size() >= BATCH_COUNT) {
    15. System.err.println(cachedDataList.size());
    16. System.err.println("已保存至数据库\n已完成清理 list");
    17. cachedDataList = ListUtils.newArrayListWithExpectedSize(BATCH_COUNT);
    18. }
    19. }
    20. @Override
    21. public void doAfterAllAnalysed(AnalysisContext context) {
    22. System.err.println("已将剩余数据保存至数据库");
    23. }
    24. }).sheet().doRead();
    25. }

    写法三:外部类

    定义一个类

    1. public class read03 implements ReadListener {
    2. // 单次缓存的数量
    3. public static int BATCH_COUNT = 200;
    4. // 临时存储
    5. private List cachedDataList = ListUtils.newArrayListWithExpectedSize(BATCH_COUNT);
    6. public void invoke(DemoData data, AnalysisContext context) {
    7. cachedDataList.add(data);
    8. if(cachedDataList.size() >= BATCH_COUNT) {
    9. System.err.println(cachedDataList.size());
    10. System.err.println("已保存至数据库\n已完成清理 list");
    11. cachedDataList = ListUtils.newArrayListWithExpectedSize(BATCH_COUNT);
    12. }
    13. }
    14. public void doAfterAllAnalysed(AnalysisContext context) {
    15. System.err.println("已将剩余数据保存至数据库");
    16. }
    17. }
    1. /**
    2. * 最简单的读 - 03
    3. */
    4. @Test
    5. void readExcel03(){
    6. EasyExcel.read(fileName, DemoData.class, new read03()).sheet().doRead();
    7. }

    写法四:

    1. /**
    2. * 最简单的读 - 04
    3. */
    4. @Test
    5. void readExcel04(){
    6. try (ExcelReader excelReader = EasyExcel.read(fileName, DemoData.class, new read03()).build()) {
    7. // 构建一个sheet 这里可以指定名字或者no
    8. ReadSheet readSheet1 = EasyExcel.readSheet(0).sheetName("员工表").build();
    9. ReadSheet readSheet2 = EasyExcel.readSheet(1).sheetName("请假表").build();
    10. System.out.println(readSheet1.toString());
    11. System.out.println(readSheet2.toString());
    12. // 读取一个sheet
    13. excelReader.read(readSheet1);
    14. excelReader.read(readSheet2);
    15. }
    16. }

    写法四中可以通过下标指定工作表和相应的名称。 

    总结

    之后真正要用EasyExcel技术时再研究其他用法,之后再更新!

  • 相关阅读:
    Linux中的yum和vim
    希尔排序的实现
    【华为机试 Python实现】图的存储结构_图的遍历_最短路径问题
    使用RoboBrowser和Python下载音频
    JAVA社区疫情防控系统毕业设计,社区疫情防控管理系统设计与实现,毕设作品参考
    Go之流程控制大全: 细节、示例与最佳实践
    前端程序——待办事项
    mysql-DuplicateUpdate和java的threadpool的"死锁"
    SLAM视觉里程计的理解
    Flink部署——细粒度资源管理
  • 原文地址:https://blog.csdn.net/m0_73288917/article/details/132790709