通过EasyExcel实现对数据集合转换成Excel文件并提供下载

开源插件介绍

  • Java领域解析、生成Excel比较有名的框架有Apache poi、jxl等。但他们都存在一个严重的问题就是非常的耗内存。如果你的系统并发量不大的话可能还行,但是一旦并发上来后一定会OOM或者JVM频繁的full gc。
  • EasyExcel是阿里巴巴开源的一个excel处理框架,以使用简单、节省内存著称。EasyExcel能大大减少占用内存的主要原因是在解析Excel时没有将文件数据一次性全部加载到内存中,而是磁盘上一行行读取数据,逐个解析
  • EasyExcel采用一行一行的解析模式,并将一行的解析结果以观察者的模式通知处理(AnalysisEventListener)。

其使用的场景是有许多的,功能也十分强大。

本次我使用的是基础的web写,导出Excel文档。

首先添加一个 链接 ,里面写的还是比较详细了的

基本的使用理念就是把一个集合数据转换成Excel模式的文档。


实现一个基础的web写操作

首先我们来做一些准备工作:

  1. 第一步引入依赖文件

    <!-- 官方文档里面提醒了最好不要跨大版本跟新使用,可能会出现一些不必要的bug -->
    <dependency>
                <groupId>com.alibaba</groupId>
                <artifactId>easyexcel</artifactId>
    </dependency>
    
  2. 第二步设置我们的Data数据

@Data
public class DemoData {
		//文档最上面行的标题符号,安装定义的上下顺序,呈现出来在Excel中的顺序是从左到右的
		//当然官方文档中还有许多其他特殊格式的定义,如:自定义拼接字符、日期格式、小数转百分数
    @ExcelProperty("字符串标题")
    private String string;
    @ExcelProperty("日期标题")
    private Date date;
    @ExcelProperty("数字标题")
    private Double doubleData;
}
  1. 选择需要的写方法,此次在对应的需求中我采用的是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.openxmlformats-officedocument.spreadsheetml.sheet");
            response.setCharacterEncoding("utf-8");
            // 这里URLEncoder.encode可以防止中文乱码 当然和easyexcel没有关系
    				// "测试" ----> 最终导出的文件名字
            String fileName = URLEncoder.encode("测试", "UTF-8").replaceAll("\\+", "%20");
            response.setHeader("Content-disposition", "attachment;filename*=utf-8''" + fileName + ".xlsx");
    				// 此处的 DemoData.class 为第二步中定义的Data数据,
    				// sheet("模板")     "模板"  为 Excel中sheet的名称
    				// doWrite(data())  data() 为 我们需要导入的数据集合
            EasyExcel.write(response.getOutputStream(), DemoData.class).sheet("模板").doWrite(data());
        }
    

以上三步操作就是实现了简单的写操作,其他操作可以继续在官方文档中学习使用。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
EasyExcel 中,可以使用 `read()` 方法读取指定行的数据,并将其转换成 Java 集合对象。我们可以通过实现 `AnalysisEventListener` 接口来处理读取到的数据,并将其添加到 Java 集合中。 以下是一个读取第 3 行数据并返回 Java 集合的示例代码: ```java public class UserListener extends AnalysisEventListener<User> { private List<User> userList = new ArrayList<>(); @Override public void invoke(User data, AnalysisContext context) { // 读取第 3 行数据及其后面的数据 if (context.readRowHolder().getRowIndex() >= 2) { // 添加到 Java 集合中 userList.add(data); } } @Override public void doAfterAllAnalysed(AnalysisContext context) { // 处理完所有数据后的操作 } public List<User> getUserList() { return userList; } } ``` 在上面的代码中,我们实现了 `AnalysisEventListener` 接口,并重写了其中的 `invoke()` 方法。在 `invoke()` 方法中,我们使用 `context.readRowHolder().getRowIndex()` 方法获取当前读取的行号,当行号大于等于 2 时,表示读取到了第 3 行及其后面的数据。此时,我们将读取到的数据添加到 Java 集合中。 在读取完数据后,我们可以在 `getUserList()` 方法中获取到读取到的 Java 集合对象: ```java ExcelReader excelReader = EasyExcel.read(fileName, User.class, new UserListener()).build(); excelReader.read(); excelReader.finish(); List<User> userList = userListener.getUserList(); System.out.println(userList); ``` 在上面的代码中,我们创建了一个 EasyExcel 的读取器对象,并使用 `read()` 方法读取 Excel 文件中的数据。读取完数据后,我们通过 `userListener.getUserList()` 方法获取到读取到的 Java 集合对象。 需要注意的是,在读取 Excel 文件时,如果表头占用了多行,那么实际读取到的数据行号会比指定的行号多出表头的行数。因此,在计算要读取的行号时,需要考虑表头的行数。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值