POI和easyExcel

什么是POI什么是easyExcel?

首先操作Excel,word 目前比较流行的是,Apache POI和 阿里巴巴的easyExcel

应用场景:

1.将用户数据大量导出为Excel表格 (导出数据)

2.将Excel表中的信息导入到网站数据库中 (大量数据上传)

POI是由Apache软件基金会的开放源码函式库,POI提供给java程序对Miscroslft Office格式档案的读和写的功能

基本功能:

HSSF 提供读写Microsoft Excel 格式档案的功能,(03版本中行数最多只能存65535行)

XSSF 提供读写Microsoft Excel OOXML 格式档案的功能,(07版本行数不限)

HWPF 提供读写Microsoft Word格式档案的功能,

HSLF 提供读写Microsoft Point 格式档案的功能,

HDGF 提供读写Microsoft Visio 格式档案的功能,

POI相比于其他框架比较原生,其实其他框架的底层还是基于POI实现的。

那么! EasyExcel就出现了, EasyExcel是阿里巴巴开源的一个处理excel框架,简单,节省内存著称,

        EasyExcel能大大减少占用内存的原因是在解析Excel时没有将文件数据一次性全部加载到内存中,而是从磁盘上一行一行读取数据,逐个解析,反之POI就是把数据先加载到内存中(这样会导致内存溢出OOM )再写入到文件

小文件POI和EasyExcel 大文件 EasyExcel

数据批量导入:

大文件写HSSF: 缺点:最多只能处理65536行,否则会抛出异常

                            优点:过程写入缓存,不操作磁盘,最后一次性写入磁盘,速度快

大文件写XSSF: 缺点:写数据速度非常慢,非常消耗内存,也会发生内存溢出,比如100万条

                            优点:可以写较大的数据量 ,如20万条

大文件写XSSF: 优点:可以写非常大的数据量,如200万条甚至更多条,写数据快,占用更少的内存,但是:过程中会产生临时文件,需要清理临时文件

POI-Excel读取:

读取值的时候一定要注意类型

EasyExcel底层也是基于POI

首先导入依赖:

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

读Excel:

    /**
     * 最简单的读
     * <p>1. 创建excel对应的实体对象 参照{@link DemoData}
     * <p>2. 由于默认一行行的读取excel,所以需要创建excel一行一行的回调监听器,参照{@link DemoDataListener}
     * <p>3. 直接读即可
     */
    @Test
    public void simpleRead() {
        String fileName = TestFileUtil.getPath() + "demo" + File.separator + "demo.xlsx";
        // 这里 需要指定读用哪个class去读,然后读取第一个sheet 文件流会自动关闭
        EasyExcel.read(fileName, DemoData.class, new DemoDataListener()).sheet().doRead();
    }

写Excel:

    /**
     * 最简单的写
     */
    @Test
    public void simpleWrite() {
        String fileName = TestFileUtil.getPath() + "write" + System.currentTimeMillis() + ".xlsx";
        // 这里 需要指定写用哪个class去读,然后写到第一个sheet,名字为模板 然后文件流会自动关闭
        // 如果这里想使用03 则 传入excelType参数即可
        EasyExcel.write(fileName, DemoData.class).sheet("模板").doWrite(data());
    }

web上传、下载:

 /**
     * 文件下载(失败了会返回一个有部分数据的Excel)
     * <p>1. 创建excel对应的实体对象 参照{@link DownloadData}
     * <p>2. 设置返回的 参数
     * <p>3. 直接写,这里注意,finish的时候会自动关闭OutputStream,当然你外面再关闭流问题不大
     */
    @GetMapping("download")
    public void download(HttpServletResponse response) throws IOException {
        // 这里注意 有同学反应使用swagger 会导致各种问题,请直接用浏览器或者用postman
        response.setContentType("application/vnd.ms-excel");
        response.setCharacterEncoding("utf-8");
        // 这里URLEncoder.encode可以防止中文乱码 当然和easyexcel没有关系
        String fileName = URLEncoder.encode("测试", "UTF-8");
        response.setHeader("Content-disposition", "attachment;filename=" + fileName + ".xlsx");
        EasyExcel.write(response.getOutputStream(), DownloadData.class).sheet("模板").doWrite(data());
    }

    /**
     * 文件上传
     * <p>1. 创建excel对应的实体对象 参照{@link UploadData}
     * <p>2. 由于默认一行行的读取excel,所以需要创建excel一行一行的回调监听器,参照{@link UploadDataListener}
     * <p>3. 直接读即可
     */
    @PostMapping("upload")
    @ResponseBody
    public String upload(MultipartFile file) throws IOException {
        EasyExcel.read(file.getInputStream(), UploadData.class, new UploadDataListener(uploadDAO)).sheet().doRead();
        return "success";
    }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值