【EasyExcel】 模板填充批量导出,多文件以zip压缩包格式导出

2023-11-19

        使用 阿里巴巴的 EasyExcel 填充 excel模板导出,需要支持批量操作,即一个模板循环导出多份,在网上找了下其他大佬们的做法,没有找到想要的,很多都是要先生成excel文件,再压缩导出,但我不想这样做,想直接通过文件流的方式,直接导出,经下午修改测试,成功达到了我想要的效果。

一、导包

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

二、主要的逻辑代码

    public void doExportTemplateExcel(HttpServletResponse response) {
        
        //获取模板文件,模板文件需放在 resource下
        String templateExcelFileName = "xxx导出模板.xlsx";
        InputStream templateExcelInputStream = this.getClass().getClassLoader().getResourceAsStream("template" + File.separatorChar + templateExcelFileName);
        if (null == templateExcelInputStream) {
            throw new SystemException("模板文件不存在!");
        }

        ByteArrayOutputStream outputStream = null;
        ZipOutputStream zipOut = null;
        try {
            //处理导出的zip 文件名称,避免中文乱码
            response.setContentType("application/octet-stream; charset=UTF-8");
            String encodedFileName = URLEncoder.encode("XXX导出.zip", StandardCharsets.UTF_8.name()).replaceAll("\\+", "%20");
            response.setHeader(HttpHeaders.CONTENT_DISPOSITION, "attachment;filename*=utf-8''" + encodedFileName);
            zipOut = new ZipOutputStream(response.getOutputStream());
            
            //复制输入模板文件流,避免第一次以后读取为空问题
            ByteArrayOutputStream bos = cloneInputStream(templateExcelInputStream);
            for (int i = 0; i < 10; i ++) {
                InputStream copyInputStream = new ByteArrayInputStream(bos.toByteArray());
                outputStream = new ByteArrayOutputStream();
                ExcelWriter excelWriter = EasyExcel.write(outputStream).withTemplate(copyInputStream).excelType(ExcelTypeEnum.XLSX).build();

                //设置 zip 中的每个文件名称
                zipOut.putNextEntry(new ZipEntry("导出excel文件- " + i + templateExcelFileName.substring(templateExcelFileName.lastIndexOf("."))));
                
                WriteSheet writeSheet = EasyExcel.writerSheet().build();
                FillConfig fillConfig = FillConfig.builder().forceNewRow(Boolean.FALSE).build();
                
                /******************  值填充逻辑开始,请按实际业务修改  ************************/
                excelWriter.fill(() -> {
                    List<Map> dataList = new ArrayList<>();
                    for (int j = 0; j < 10; j ++) {
                        Map temp = new HashMap();
                        temp.put("index", j);
                        temp.put("no", "No " + j);
                        temp.put("name", "名称 " + j);

                        dataList.add(temp);
                    }
                    return dataList;
                }, fillConfig, writeSheet);
                Map map = new HashMap();
                map.put("applyStaffName", "提交人");
                map.put("applyOrgName", "提交部门");
                map.put("createDate", new SimpleDateFormat("yyyyMMdd").format(new Date()));
                map.put("orderSn", "SN12345");
                map.put("description", "我是备注");
                excelWriter.fill(map, writeSheet);

                /******************  值填充逻辑结束,请按实际业务修改  ************************/
                
                excelWriter.finish();
                outputStream.writeTo(zipOut);
                outputStream.flush();
                outputStream.close();
                zipOut.closeEntry();

                copyInputStream.close();
            }

        } catch (Exception e) {
            e.printStackTrace();
            System.out.println("导出 excel -> zip 时出现异常" + e.getMessage());
        } finally {
            if (null != outputStream) {
                try {
                    outputStream.flush();
                    outputStream.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if (null != zipOut) {
                try {
                    zipOut.flush();
                    zipOut.finish();
                    zipOut.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }

    /**
     * 复制InputStream
     *
     * InputStream inputStream = new ByteArrayInputStream(ByteArrayOutputStream.toByteArray());
     * @param input
     * @return
     */
    public static ByteArrayOutputStream cloneInputStream(InputStream input) {
        try {
            ByteArrayOutputStream baos = new ByteArrayOutputStream();
            byte[] buffer = new byte[1024];
            int len;
            while ((len = input.read(buffer)) > -1) {
                baos.write(buffer, 0, len);
            }
            baos.flush();
            return baos;
        } catch (IOException e) {
            e.printStackTrace();
            return null;
        }
    }

        以上主要业务逻辑代码仅为实现业务的概要代码,仅作为解决思路指引和参考,如需在正式项目中使用,请根据实际业务逻辑进行修改,并增加对应的导出数据获取、处理以及异常处理等逻辑。

三、执行结果

        代码执行成功后,会下载一个 zip压缩包,压缩包里面放的就是代码中通过 excel模板生成的 excel文件。

注:

        执行结果截图为我当前实际业务截图,非上述概要业务代码执行结果,所以文件名称和代码中的设置会不一样。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【EasyExcel】 模板填充批量导出,多文件以zip压缩包格式导出 的相关文章

  • Android NumberPicker 带字符串

    I have customised the NumberPicker to show text The output is this 当我按 确定 时 我想将 e x 鼠标添加到我的列表 文章 中 我得到的是索引值 int 它由 array
  • JAVA - 带有特殊字符的 LDAP 密码不起作用

    我试图在我的系统上创建一个登录屏幕 在 Active Directory 中进行查询 但是当用户的密码包含一些特殊字符 如 和 时 它不会验证 我需要加密密码才能工作吗 我该怎么做 我使用 getPassword 通过 JPasswordF
  • 从 OMElement 对象获取 InputStream/io.Reader

    我有一个OMElement对象 从中我想得到一个InputStream或读者对象 我想要的是流式传输xml来自OMElement我有 没有加载到内存中 我只能得到XMLStreamReader对此表示反对 但我找不到办法得到InputStr
  • 使用多个构造函数创建不可变类

    我正在阅读这一页 https docs oracle com javase tutorial essential concurrency imstrat html关于在 Java 中创建不可变类 并决定根据页面上概述的规范修改我正在编写的类
  • JUnit 使用 Mockito 测试异步方法

    我已经使用 Spring Framework 版本 5 0 5 RELEASE 在 Java 1 8 类中实现了异步方法 public class ClassToBeTested Autowired private MyComponent
  • 如何在 OpenAPI 3.0 中定义字节数组

    我正在将 API 从 Swagger 2 0 迁移到 OpenAPI 3 0 在 DTO 中 我有一个指定为字节数组的字段 Swagger 对 DTO 的定义 Job type object properties body type str
  • Java:检查给定日期是否在当前月份内

    我需要检查给定的日期是否在当前月份 我编写了以下代码 但 IDE 提醒我getMonth https docs oracle com javase 7 docs api java util Date html getMonth and ge
  • LibGdx 如何使用 OrthographicCamera 滚动?

    我已经找了 10 个小时 字面意思 我已经完成了 我需要问一下 事情是我正在学习如何使用 LibGdx 来编写 Java 游戏 我正在做一个水平太空飞船游戏 所以 我最糟糕的问题是我不知道如何滚动 我认为绘制会更好地解释 我想绘制一个巨大的
  • java 属性文件作为枚举

    是否可以将属性文件转换为枚举 我有一个包含很多设置的属性文件 例如 equipment height equipment widht equipment depth and many more like this and not all a
  • 如何在将数据发送到 Firebase 数据库之前对其进行加密?

    我正在使用 Firebase 实时数据库制作聊天应用程序 我知道 Firebase 非常安全 只要您的规则正确 但我自己可以阅读使用我的应用程序的人的所有聊天记录 我想阻止这种情况 为此我需要一种解密和加密方法 我尝试使用凯撒解密 但失败了
  • Java中的DRY原则[关闭]

    Closed 这个问题需要细节或清晰度 help closed questions 目前不接受答案 我一直在读关于DRY https en wikipedia org wiki Don 27t repeat yourself原则 虽然看起来
  • 使用外部硬盘写入和存储 mysql 数据库

    我已经设置了 mysql 数据库在我的 Mac 上使用 java 和 eclipse 运行 它运行得很好 但现在我将生成大约 43 亿行数据 这将占用大约 64GB 的数据 我存储了大量的密钥和加密值 我有一个 1TB 外部我想用作存储位置
  • 当容器大小更改时,JTable 仅调整选定列的大小

    对于面板内的 JTable 如果面板变大 我如何将额外的空间仅分配给某些列 在我的例子中 分配给最后一列 尽管提供 第 3 4 列和8 将获得额外的空间 我想允许用户手动更改所有列的列大小 我尝试了 table setAutoResizeM
  • 嵌入式 tomcat 7 servlet 3.0 注释不起作用

    我有一个精简的测试项目 其中包含 Servlet 版本 3 0 用注释声明 如下所示 WebServlet test public class TestServlet extends HttpServlet private static f
  • 是什么原因导致“对象不是声明类的实例”? [复制]

    这个问题在这里已经有答案了 可能的重复 使用反射调用方法时 为什么会出现 对象不是声明类的实例 https stackoverflow com questions 7202988 why do i get object is not an
  • 如何计算文件中单词的长度?爪哇

    我正在尝试编写一个代码来计算文件中特定长度的单词数 例如 How are you 会打印 Proportion of 3 letter words 100 3 words 我想计算长度为 1 2 3 4 5 6 7 8 9 10 11 12
  • RMI 服务器:rmiregistry 或 LocateRegistry.createRegistry

    对于服务器端的RMI 我们需要启动吗rmiregistry程序 或者只是调用LocateRegistry createRegistry 如果两者都可以的话 各有什么优点和缺点 他们是同一件事 rmiregistry是一个单独的程序 您可以从
  • Java泛型类型

    当我有一个界面时 public interface Foo
  • 使用 Android 的 Mobile Vision API 扫描二维码

    我跟着这个tutorial http code tutsplus com tutorials reading qr codes using the mobile vision api cms 24680关于如何构建可以扫描二维码的 Andr
  • Java 9 中紧凑字符串和压缩字符串的区别

    有什么优点紧凑的字符串 http openjdk java net jeps 254JDK9 中的压缩字符串 压缩字符串 Java 6 和紧凑字符串 Java 9 都有相同的动机 字符串通常实际上是 Latin 1 因此浪费了一半的空间 和

随机推荐

  • C# 实例详解委托之Func、Action、delegate(精品)

    概述 委托是 NET编程的精髓之一 在日常编程中经常用到 在C 中实现委托主要有Func Action delegate三种方式 本节主要就这三种委托的用法通过实例展开讲解 Func用法解析 Func Func是带返回值的委托 原型函数如下
  • 软件测试技术(性能与自动化测试)

    一 实验原理 1 功能与自动化测试 功能自动化测试是指使用自动化工具和脚本来模拟用户操作 验证软件应用程序的各种功能是否按照预期工作的过程 在进行功能自动化测试时 测试人员通常编写脚本 这些脚本可以模拟用户在应用程序中进行的各种操作 例如点
  • 【机器学习】12、主题模型

    文章目录 一 pLSA 二 LDA模型 一 pLSA 每个文档都会在主题上有一个分布 每个主题在各个词上也有一个分布 p w j
  • React中使用if else 条件判断

    在react中用jsx渲染dom的时候经常会遇到if条件判断 然而在jsx中竟是不允许if条件判断的 以下有几种判断方式 可以根据自己的应用场景 挑选适合的 方案一 class HelloMessage extends React Comp
  • QTableWidget获取选中的内容及所在行数

    QTableWidget选中所有单元格及取消选中所有单元格 ui gt allowSelectKeyTableWidget gt selectAll ui gt allowSelectKeyTableWidget gt setFocus i
  • 使用 Blender* 重新拓扑 VR 和游戏素材

    本文介绍如何将网格重新拓扑成一个整洁的低密度模型 然后 UV 解包该网格 以便将纹理贴添加至新模型 本文还将探讨如何使用免费工具 比如 Blender 及其 Bsurface 插件 重新拓扑雕塑的 3D 网格 查看详情
  • bootstrap3 表单构建器_如何快速构建基于MES的开源云平台

    导读本文为2019工业互联网平台活动盘点文章 同时也欢迎广大工业互联网平台企业参与本次盘点 具体参与方式可加编辑微信号 13517202453 详细咨询 随着智能制造转型战略的持续推进 MES作为承载智能化生产制造过程的核心系统正在受到越来
  • 正则表达式语法大全

    前言 一般开发中都会接触到正则表达式 作为一名合格的前端 也应该了解一下正则表达式编写原则 便于自己也能快速编写想要的正则表达式 1 作用 正则表达式是一种字符串匹配的模式 数据验证 比如电话号码 邮箱等 替换文本 快速找到特定文本 用于替
  • lua秒级睡眠和毫秒级睡眠(sleep, msleep)

    秒级睡眠 for linux cygwin or mingw function sleep n os execute sleep tonumber n end for windows function sleep n os execute
  • Transaction rolled back because it has been marked as rollback-only解决

    项目中遇到Transaction rolled back because it has been marked as rollback only错误 不要想 就是遇到了事物嵌套 即使你把所有方法上的 Transactional注解全部删除
  • cookie 设置中文

    在使用Django的时候需要将中文用户名写入cookie中 但是cookie的编码不支持中文 写入就会 UnicodeEncodeError latin 1 codec can t encode characters in position
  • 更好的在小学语课上用计算机,论多媒体技术在小学语文教学中的作用

    论多媒体技术在小学语文教学中的优势 作者 孖无悔观教育 论文格式范文 摘要 多媒体教学相比于传统的 黑板加粉笔 式的传统教学更具有优势 多媒体教学在小学语文课堂中的应用犹如清风活水 给教育注入了新的活力 它不但可以优化课堂结构 而且也让我们
  • java 匿名内部类简介说明

    转自 java 匿名内部类简介说明 下文笔者讲述Java匿名内部类的简介说明 如下所示 匿名内部类的简介 匿名内部类 未显式指定类名的内部类称之为 匿名内部类 匿名内部类创建 匿名类是不能有名称的类 所以没办法引用它们 须在创建时 作为ne
  • 关于element UI 中输入框禁止输入空格的实现

    关于element UI 中输入框禁止输入空格的实现 在项目开发过程中会遇到输入框禁止输入空格或者特殊字符之类的需求 其中禁止输入空格的实现方法如下所示 1 使用vue框架中的 trim修饰符
  • Python基础教程(crossin全60课)

    Python 第 第 1 1 课 安装 4 Python 第 第 2 2 课 print 5 Python 第 第 3 3 课 IDE
  • Flutter踩坑笔记一——环境搭建的坑

    Flutter的环境搭建其实还是很简单的 当你把AndroidStudio升级安装3 5版本的时候 他已经默认为你安装了Dart和Flutter插件 可见Google对flutter的重视 所以也省了我们不少事儿 首先 打开 官方文档 获取
  • mysql数据库中user表字段详解

    描述 MySQL的user表是MySQL服务器的内置表 它用于存储MySQL服务器上的用户信息 包括用户名 密码 主机名和权限等 它用于控制MySQL服务器上的访问权限 以确保服务器的安全性 表结构 CREATE TABLE user Ho
  • 文本挖掘(四万字总结篇:爬虫 - 文本预处理 - 高频词统计 - 聚类 - 情感分析)

    1 爬虫 1 1 爬虫原理 这部分内容可以跳过 掌握与否对后面内容的阅读影响并不大 但有兴趣的话可以看看呐 实现一个爬虫 一般需要经过两个步骤 处理请求和解析源码 数据 处理请求方面 我们可以使用Python程序自动发送请求 然后根据返回的
  • 求助,AttributeError: ‘Namespace‘ object has no attribute ‘input_df_filename‘

    import argparse import re import pandas as pd import os import json from pyxdameraulevenshtein import damerau levenshtei
  • 【EasyExcel】 模板填充批量导出,多文件以zip压缩包格式导出

    使用 阿里巴巴的 EasyExcel 填充 excel模板导出 需要支持批量操作 即一个模板循环导出多份 在网上找了下其他大佬们的做法 没有找到想要的 很多都是要先生成excel文件 再压缩导出 但我不想这样做 想直接通过文件流的方式 直接