easyexcel 读取指定行数据_SpringBoot整合EasyExcel

easyexcel 读取指定行数据_SpringBoot整合EasyExcel_第1张图片

EasyExcel是阿里巴巴开源poi插件之一,主要解决了poi框架使用复杂,sax解析模式不容易操作,数据量大起来容易OOM,解决了POI并发造成的报错。主要解决方式:通过解压文件的方式加载,一行一行的加载,并且抛弃样式字体等不重要的数据,降低内存的占用.

  • 文档地址 https://alibaba-easyexcel.github.io/
  • GitHub:https://github.com/alibaba/easyexcel
64M内存1分钟内读取75M(46W行25列)的Excel

easyexcel 读取指定行数据_SpringBoot整合EasyExcel_第2张图片

快速使用

总的流程分四步:

  1. 引入maven依赖
  2. 配置读取文件监听
  3. 写文件测试
  4. 读文件测试

(1)引入maven依赖

    
    
        
            com.alibaba
            easyexcel
            2.2.7
        
        
        
            com.alibaba
            fastjson
            1.2.75
        
    

(2)配置读取文件监听

/**
 * @author :wxw.
 * @date : 13:35 2020/12/30
 * @description: 模板的读取类
 *  有个很重要的点 DemoDataListener 不能被spring管理,
 * 要每次读取excel都要new,然后里面用到spring可以构造方法传进去
 * @link:
 * @version: v_0.0.1
 */
public class DemoDataListener extends AnalysisEventListener {
 
    private static final Logger LOGGER = LoggerFactory.getLogger(DemoDataListener.class);
    /**
     * 每隔5条存储数据库,实际使用中可以3000条,然后清理list ,方便内存回收
     */
    private static final int BATCH_COUNT = 5;
 
    List list = new ArrayList();
    /**
     * 假设这个是一个DAO,当然有业务逻辑这个也可以是一个service。当然如果不用存储这个对象没用。
     */
    private DemoDAO demoDAO;
 
    public DemoDataListener() {
        // 这里是demo,所以随便new一个。实际使用如果到了spring,请使用下面的有参构造函数
        demoDAO = new DemoDAO();
    }
 
    /**
     * 如果使用了spring,请使用这个构造方法。每次创建Listener的时候需要把spring管理的类传进来
     *
     * @param demoDAO
     */
    public DemoDataListener(DemoDAO demoDAO) {
        this.demoDAO = demoDAO;
    }
 
    /**
     * 这个每一条数据解析都会来调用
     *
     * @param data
     *            one row value. Is is same as {@link AnalysisContext#readRowHolder()}
     * @param context
     */
    @Override
    public void invoke(Object data, AnalysisContext context) {
        LOGGER.info("解析到一条数据:{}", 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("存储数据库成功!");
    }
} 
    
   

(3)写文件测试

     @Test
    public void simpleWrite() {
        // 写法1
        String fileName = TestFileUtil.getPath() + "simpleWrite" + System.currentTimeMillis() + ".xlsx";
        // 这里 需要指定写用哪个class去写,然后写到第一个sheet,名字为模板 然后文件流会自动关闭
        // 如果这里想使用03 则 传入excelType参数即可
        EasyExcel.write(fileName, DemoData.class).sheet("模板").doWrite(data());
 
        // 写法2
        fileName = TestFileUtil.getPath() + "simpleWrite" + System.currentTimeMillis() + ".xlsx";
        // 这里 需要指定写用哪个class去写
        ExcelWriter excelWriter = null;
        try {
            excelWriter = EasyExcel.write(fileName, DemoData.class).build();
            WriteSheet writeSheet = EasyExcel.writerSheet("模板").build();
            excelWriter.write(data(), writeSheet);
        } finally {
            // 千万别忘记finish 会帮忙关闭流
            if (excelWriter != null) {
                excelWriter.finish();
            }
        }
    }

输出路径:

easyexcel 读取指定行数据_SpringBoot整合EasyExcel_第3张图片
注意

我们最开始操作文件,可能是这样用File file = new File("c:/test.txt"),这样就会有一个硬编码的问题,这样不利于我们日后项目迁移,项目位置变了或者windows切换部署到Linux系统的话,路径也要改,很难一次成型,所以这里我们使用 Java中getResource()的用法,

使用相对路径的形式,解决绝了硬编码问题,达到了一次成型的目标。

(3)读文件测试

     /**
     * 不创建对象的读
     */
    @Test
    public void noModelRead() {
        String fileName = TestFileUtil.getPath() + File.separator+"simpleWrite1609308032245.xlsx";
        // 这里 只要,然后读取第一个sheet 同步读取会自动finish
        EasyExcel.read(fileName, new NoModelDataListener()).sheet().doRead();
    }

读取结果:

easyexcel 读取指定行数据_SpringBoot整合EasyExcel_第4张图片

easyexcel 读取指定行数据_SpringBoot整合EasyExcel_第5张图片

你可能感兴趣的:(easyexcel,读取指定行数据)