zoukankan      html  css  js  c++  java
  • EasyExcel

    EasyExcel

    主要以官方文档为主!

    1. 导入依赖

    <dependency>
        <groupId>com.alibaba</groupId>
        <artifactId>easyexcel</artifactId>
        <version>2.2.6</version>
    </dependency>
    

    2. 固定套路

    1. 写入

      1. 固定的类格式写入
      package com.wang.easy;
      
      import com.alibaba.excel.annotation.ExcelIgnore;
      import com.alibaba.excel.annotation.ExcelProperty;
      import lombok.Data;
      
      import java.util.Date;
      
      @Data
      public class DemoData {
          @ExcelProperty("字符串标题")
          private String string;
          @ExcelProperty("日期标题")
          private Date date;
          @ExcelProperty("数字标题")
          private Double doubleData;
          /**
           * 忽略这个字段
           */
          @ExcelIgnore
          private String ignore;
      }
      
    2. 读取

      1. 根据监听器设置的规则进行读取
      package com.wang.easy;
      
      import com.alibaba.excel.context.AnalysisContext;
      import com.alibaba.excel.event.AnalysisEventListener;
      import com.alibaba.fastjson.JSON;
      import org.slf4j.Logger;
      import org.slf4j.LoggerFactory;
      
      import java.util.ArrayList;
      import java.util.List;
      
      // 有个很重要的点 DemoDataListener 不能被spring管理,要每次读取excel都要new,然后里面用到spring可以构造方法传进去
      public class DemoDataListener extends AnalysisEventListener<DemoData> {
          private static final Logger LOGGER = LoggerFactory.getLogger(DemoDataListener.class);
          /**
           * 每隔5条存储数据库,实际使用中可以3000条,然后清理list ,方便内存回收
           */
          private static final int BATCH_COUNT = 5;
          List<DemoData> list = new ArrayList<>();
          /**
           * 假设这个是一个DAO,当然有业务逻辑这个也可以是一个service。当然如果不用存储这个对象没用。
           */
          private DemoDAO demoDAO;
          public DemoDataListener() {
              // 这里是demo,所以随便new一个。实际使用如果到了spring,请使用下面的有参构造函数
              demoDAO = new DemoDAO();
          }
      
          //读取数据 会执行 invoke 方法
          //DemoData 类型
          // AnalysisContext 分析上下文
          @Override
          public void invoke(DemoData data, AnalysisContext context) {
              System.out.println(JSON.toJSONString(data));
              list.add(data);
              // 达到BATCH_COUNT了,需要去存储一次数据库,防止数据几万条数据在内存,容易OOM
              if (list.size() >= BATCH_COUNT) {
                  saveData();
                  // 存储完成清理 list
                  list.clear();
              }
          }
          /**
           * 所有数据解析完成了 都会来调用
           *
           * @param context
           */
          @Override
          public void doAfterAllAnalysed(AnalysisContext context) {
              // 这里也要保存数据,确保最后遗留的数据也存储到数据库
              saveData();
              LOGGER.info("所有数据解析完成!");
          }
          /**
           * 加上存储数据库
           */
          private void saveData() {
              LOGGER.info("{}条数据,开始存储数据库!", list.size());
              demoDAO.save(list);
              LOGGER.info("存储数据库成功!");
          }
      }
      

    测试

    package com.wang.easy;
    
    import com.alibaba.excel.EasyExcel;
    import com.alibaba.excel.ExcelReader;
    import com.alibaba.excel.read.metadata.ReadSheet;
    import org.junit.Test;
    
    import java.io.File;
    import java.util.ArrayList;
    import java.util.Date;
    import java.util.List;
    
    public class EasyTest {
    
        private static final String PATH = "D:\Java_Web\EasyExcel\";
    
        //根据list, 写入Excel
        private List<DemoData> data() {
            List<DemoData> list = new ArrayList<DemoData>();
            for (int i = 0; i < 10; i++) {
                DemoData data = new DemoData();
                data.setString("字符串" + i);
                data.setDate(new Date());
                data.setDoubleData(0.56);
                list.add(data);
            }
            return list;
        }
    
        @Test
        public void simpleWriter() {
            String fileName = PATH + "EasyTest.xlsx";
            //write (fileName, 格式类)
            //sheet(表名)
            //doWrite(数据)
            EasyExcel.write(fileName, DemoData.class)
                    .sheet("模板")
                    .doWrite(data());
        }
    
        @Test
        public void simpleRead() {
            // 有个很重要的点 DemoDataListener 不能被spring管理,要每次读取excel都要new,然后里面用到spring可以构造方法传进去
            // 写法1:
            String fileName = PATH + "EasyTest.xlsx";
            // 这里 需要指定读用哪个class去读,然后读取第一个sheet 文件流会自动关闭
            EasyExcel.read(fileName, DemoData.class, new DemoDataListener())
                    .sheet().doRead();
        }
    }
    
  • 相关阅读:
    EPANET头文件解读系列4——EPANET2.H
    EPANET头文件解读系列3——TOOLKIT.H
    EPANET头文件解读系列2——ENUMSTXT.H
    EPANET头文件解读系列1——TEXT.H
    ENUMSTXT.H中的指针数组
    main函数的参数
    函数指针与指针函数
    FMDB源码阅读
    17个提升iOS开发效率的必用工具
    UIKit性能调优实战讲解
  • 原文地址:https://www.cnblogs.com/wang-sky/p/13891276.html
Copyright © 2011-2022 走看看