比 poi导入导出更好用的 EasyExcel使用小结

poi,导入,导出,更好,easyexcel,使用,小结 · 浏览次数 : 605

小编点评

**easyexcel框架解析、生成Excel比较有名的框架有Apache poi、jxl。但他们都存在一个严重问题就是非常的耗内存,poi有一套SAX模式的API可以一定程度的解决一些内存溢出的问题,但POI还是有一些缺陷,比如07版Excel解压缩以及解压后存储都是在内存中完成的,内存消耗依然很大。** **易excel框架重写了poi对07版Excel的解析,一个3M的excel用POI sax解析依然需要100M左右内存,改用easyexcel可以降低到几M,并且再大的excel也不会出现内存溢出;03版依赖POI的sax模式,在上层做了模型转换的封装,让使用者更加简单方便** **易excel框架使用一些技术来降低内存消耗,例如:** - 使用了内存映射技术来缓存数据,减少内存Biografía。 - 使用了并行计算技术来加速解析过程。 - 使用了虚拟内存技术来让系统虚拟出更多的内存。 - 使用了流式处理技术来读取和写入数据。

正文

转载请注明出处:

  官方文档: https://easyexcel.opensource.alibaba.com/docs/current/quickstart/read

1.简洁

  Java解析、生成Excel比较有名的框架有Apache poi、jxl。但他们都存在一个严重的问题就是非常的耗内存,poi有一套SAX模式的API可以一定程度的解决一些内存溢出的问题,但POI还是有一些缺陷,比如07版Excel解压缩以及解压后存储都是在内存中完成的,内存消耗依然很大。 easyexcel重写了poi对07版Excel的解析,一个3M的excel用POI sax解析依然需要100M左右内存,改用easyexcel可以降低到几M,并且再大的excel也不会出现内存溢出;03版依赖POI的sax模式,在上层做了模型转换的封装,让使用者更加简单方便

  优点:节省内存消耗,可大量减少网络开销

2.使用方法

2.1.引入依赖

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

2.2 导入

  导入对应的表格字段解析实体类:

public class ConfigImportExcelRow implements Serializable {

    @ExcelProperty(value = "姓名", index = 0)
    private String userName;

    /**
     * 昵称
     */
    @ExcelProperty(value = "昵称", index = 1)
    private String nickName;

    @ExcelProperty(value = "年龄", index = 2)
    private Integer age;

}

  接口示例

@PostMapping("/import")
    public JSONResult import(@RequestParam(name = "file") MultipartFile file, HttpServletResponse response) {
    
    List<ConfigImportExcelRow> userRowList = null;
        try {
            userRowList = EasyExcel.read(file.getInputStream()).headRowNumber(2)
                    .head(ConfigImportExcelRow.class).sheet().doReadSync();
        } catch (Exception e) {
            LOGGER.error("导入配置异常", e);
        }
        
        return  "导入结果";
    }

  head()指定Excel行对应的POJO

  sheet() 读取第一个sheet

  doReadSync() ; 同步读取会自动finish

  headRowNumber 从头的第几行开始读取:可以设置1,因为头就是一行。如果多行头,可以设置其他值。不传入也可以没有指定头,也就是默认1行

 

  当有多个 sheet的时候,可以将 read 改为 readSheet 方法:

  官方示例:

2.3 导出

  同样对导出的实体字段添加 @ExcelProperty 注解

public class ConfigExportExcelRow implements Serializable {

    @ExcelProperty(value = "姓名", index = 0)
    private String userName;

    /**
     * 昵称
     */
    @ExcelProperty(value = "昵称", index = 1)
    private String nickName;

    @ExcelProperty(value = "年龄", index = 2)
    private Integer age;

}

  调用示例

@GetMapping("/export")
    @ApiOperation(value = "导出明细")
    public JSONResult importUser(HttpServletResponse response) {
        
        return JSONResult.okResult();
    }
    
    public void exportWorkerPlan(Long cycleId, HttpServletResponse response) {

        try {
            List<ConfigExportExcelRow> excelRowList = new ArrayList<>();
            ConfigExportExcelRow result1 = new ConfigExportExcelRow();
            result1.setUserName("张三");
            result1.setNickName("张三");
            result1.setAge(22);
            excelRowList.add(result1);
            AssessPersonConfigImportResult result2 = new AssessPersonConfigImportResult();
            result2.setUserName("李四");
            result2.setNickName("李四");
            result2.setAge("33");
            excelRowList.add(result2);

            String fileFix = DateUtils.formatDate(System.currentTimeMillis(), DateFormatEnum.YYYYMMDDHHMMSSS);
            String fileName = "导出结果_" + fileFix;
            response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
            response.setCharacterEncoding("utf-8");
            // 这里URLEncoder.encode可以防止中文乱码 当然和easyexcel没有关系
            fileName = URLEncoder.encode(fileName, "UTF-8").replace("\\+", "%20");
            response.setHeader("Content-disposition", "attachment;filename*=utf-8''" + fileName + ".xlsx");

            // 内容样式策略
            WriteCellStyle contentWriteCellStyle = new WriteCellStyle();
            // 垂直居中,水平居中
            contentWriteCellStyle.setVerticalAlignment(VerticalAlignment.CENTER);
            contentWriteCellStyle.setHorizontalAlignment(HorizontalAlignment.CENTER);
            contentWriteCellStyle.setBorderLeft(BorderStyle.THIN);
            contentWriteCellStyle.setBorderTop(BorderStyle.THIN);
            contentWriteCellStyle.setBorderRight(BorderStyle.THIN);
            contentWriteCellStyle.setBorderBottom(BorderStyle.THIN);
            // 字体策略
            WriteFont contentWriteFont = new WriteFont();
            // 字体大小
            contentWriteFont.setFontHeightInPoints((short) 10);
            contentWriteCellStyle.setWriteFont(contentWriteFont);

            //设置输出流和模板信息
            File excelTemplate = ResourceUtils.getFile(EXCEL_TEMPLATE_PATH);
            ExcelWriter excelWriter = EasyExcel.write(response.getOutputStream())
                    .registerWriteHandler(new HorizontalCellStyleStrategy(null, contentWriteCellStyle))
                    .excelType(ExcelTypeEnum.XLSX)
                    .withTemplate(excelTemplate).build();
            WriteSheet writeSheet = EasyExcel.writerSheet().build();
            //开启自动换行,自动换行表示每次写入一条list数据是都会重新生成一行空行,此选项默认是关闭的,需要提前设置为true
            FillConfig fillConfig = FillConfig.builder().forceNewRow(Boolean.TRUE).build();
            excelWriter.fill(excelRowList, fillConfig, writeSheet);
            excelWriter.finish();
        } catch (Exception e) {
            LOGGER.error("导出Excel失败, errorMessage={}", e.getMessage(), e);
            throw new BusinessException(ActionStatus.PARAMAS_ERROR.inValue(), "人员设置导出Excel失败!");
        }
    }

 

与比 poi导入导出更好用的 EasyExcel使用小结相似的内容:

比 poi导入导出更好用的 EasyExcel使用小结

转载请注明出处: 官方文档: https://easyexcel.opensource.alibaba.com/docs/current/quickstart/read 1.简洁 Java解析、生成Excel比较有名的框架有Apache poi、jxl。但他们都存在一个严重的问题就是非常的耗内存,p

比Selenium更优秀的playwright介绍与未来展望

Playwright是新兴的自动化测试工具,拥有丰富的功能和API,隐藏在众多的爬虫和自动化工具背后,而多模LLM的出现让Playwright可以如虎添翼,自动化智能化的RPA工具预计将会井喷般出现。

Python——比 Seaborn 更好的相关性热力图:Biokit Corrplot

在 Python 中我们日常分析数据的过程当中经常需要对数据进行相关性分析,相关性热力图(Correlation Heatmap)是我们经常使用的一种工具。通过相关性热力图,我们可以通过为相关性不同的数据使用不同深浅的不同颜色进行标记,从而直观地观察两两数据序列之间的相关性情况——这将有助于我们进一...

Crossplane - 比 Terraform 更先进的云基础架构管理平台?

👉️URL: https://crossplane.io/ 📝Description: 将云基础架构和服务组成自定义平台 API 简介 在 11 月的 KCD 上海现场,听了一场阿里云的工程师关于他们自己的多云基础架构管理工具的介绍,前边的引言部分有介绍到 Terraform,还有另一款竞品就是

一个比 Redis 性能更强的数据库

给大家推荐一个比Redis性能更强的数据:KeyDB KeyDB是Redis的高性能分支,侧重于多线程、内存效率和高吞吐量。除了性能改进外,KeyDB还提供主动复制、闪存和子密钥过期等功能。KeyDB具有MVCC架构,允许您在不阻塞数据库和降低性能的情况下执行密钥和扫描等查询。 KeyDB与Redi

腾讯面试:什么锁比读写锁性能更高?

在并发编程中,读写锁 ReentrantReadWriteLock 的性能已经算是比较高的了,因为它将悲观锁的粒度分的更细,在它里面有读锁和写锁,当所有操作为读操作时,并发线程是可以共享读锁同时运行的,这样就无需排队执行了,所以执行效率也就更高。 那么问题来了,有没有比读写锁 ReentrantRe

巧如范金,精比琢玉,一分钟高效打造精美详实的Go语言技术简历(Golang1.18)

研发少闲月,九月人倍忙。又到了一年一度的“金九银十”秋招季,又到了写简历的时节,如果你还在用传统的Word文档寻找模板,然后默默耕耘,显然就有些落后于时代了,本次我们尝试使用云平台flowcv高效打造一份巧如范金、精比琢玉的高品质Golang技术简历。 首先来到云平台:flowcv.com 点击 t

[转帖]数据库选型比对 Oracle vs sqlserver

http://blog.itpub.net/23825935/viewspace-2928407/ SQL Server 2014 优点 1. 内存 OLTP: 提供部署到核心 SQL Server 数据库中的内存 OLTP 功能,以显著提高数据库应用程序性能。 内存 OLTP 是随 SQL Ser

[转帖]一代更比一代强!一文带你回顾DDR内存的前世今生

根据冯诺·依曼结构,计算机中要有存储器。所以直到今天,内存和硬盘仍然在电脑中占有非常重要的地位。与大容量的硬盘不同,内存在存取速度上有着非常惊人的表现,但是断电后又不能保存存入的信息。因此在电脑硬件长期的发展过程中,内存一直扮演着中转站的角色。和其他硬件一样,内存遵循着摩根定律,从最远古的SIMM到

[转帖]和sar比起来,其他Linux命令都是猹

https://juejin.cn/post/6916300737194491912 原创:小姐姐味道(微信公众号ID:xjjdog),欢迎分享,转载请保留出处。 我决定把今年装x的机会,留给sar命令。它是一个Linux下的监控工具,一直站在鄙视链的顶端。之所以让人望而生畏,主要是由于它繁多的参数