使用 阿里巴巴的 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文件。

注:

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

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

  1. 【java】 文件批量下载并压缩为zip压缩包

    [java] 文件批量下载并压缩为zip压缩包 java常用的压缩技术 java中常见实现压缩与解压 业务场景 代码实现 注意点 java常用的压缩技术 常见的压缩格式有很多种,例如:zip.rar. ...

  2. 批量解压多个zip压缩包并将解压出来的文件以该压缩包的名称重命名

    批量解压多个zip压缩包并将解压出来的文件以该压缩包的名称重命名.bat 复制下面的内容保存成bat文件即可运行: @echo off rem 批量解压多个zip压缩包并将解压出来的文件以该压缩包的名 ...

  3. SpringBoot使用EasyExcel 模板填充数据并导出,以及Excel导入解析入库

    需求 1.导出Excel模板,第一个sheet为用户基本信息,默认只有表头,用户手动填写后续用来导入人员信息.第二个sheet为组织架构信息,默认从数据库查询组织信息,方便用户查询组织编码. 2.导入 ...

  4. JAVA根据模板填充,生成PDF文件

    项目场景: 需求:根据客户模板,生成对应PDF文件. 例如:客户的doc模板文件: 最终效果展示: 话不多说,上操作: 首先引入pdf相关的依赖 <dependency><group ...

  5. 使用EasyPoi导出Word文件,使用@Excel注释导出实体对象图片的解决方案

    目录 一.问题介绍 二.解决方案展示 1.准备Word模板文件 2.部分实体对象 3.重写EasyPoi中ExcelEntityParse类的createCells方法 4.导出Word文件的主逻辑 ...

  6. 使用Python批量修改PPTX文件中文本框格式

    问题描述:最近正在整理Python教材的配套PPT,原来的PPT是4:3的,考虑到现在很多屏幕都是宽屏的,于是打算重新整理一下.对于正常的幻灯片,直接在"页面设置"中修改一下就可以 ...

  7. Spring Boot 文件通过zip压缩包 批量下载

    最近项目中新增了一个需求:要求批量下载之前信息导出的word 文件,也就是批量下载. 数据是保存在ES 中,导出word 的功能也是写好的. 我的思路: 传入数据ID分别导出word 文件到服务器某个 ...

  8. java如何导出et文件_Springboot使用POI实现导出Excel文件示例

    前面讲述了使用POI导出Word文件和读取Excel文件,这两个例子都相对简单,接下来要讲述的使用POI导出Excel文件要复杂得多,内容也会比较长. 创建表头信息 表头信息用于自动生成表头结构及排序 ...

  9. ug导出step文件失败_解决UG导出CAD图纸失败的问题

    解决UG导出CAD图纸失败的问题 先说一下问题吧,有些人刚开始可以用UG在制图环境下导出CAD dwg图纸.可是后来就莫名其妙的导不出来了,那个黑色的框框跳到一半就自动不动了.而我们只得到一个XXX. ...

  10. html文件怎么导出stl文件,各种3D建模软件导出STL文件的小技巧(一)

    很多用户在提交3D模型文件的时候,常常有这样的困惑:什么是STL 格式文件,怎么获取STL 格式文件呢?STL 格式文件是在计算机图形应用系统中,用于表示三角形网格的一种文件格式.它也是3D打印机在执 ...

最新文章

  1. 从面试角度一文学完 Kafka
  2. php对象当参数传递 php深复制和浅复制
  3. 从 Spring Cloud 看一个微服务框架的「五脏六腑]
  4. 【深度学习】Coursera的TensorFlow课程练习题精华部分
  5. 关于字符串流的学习(c++)
  6. java for循环 嵌套for循环-标签使用
  7. java之简单的Callback使用总结
  8. Acision推出“ forgeathon” –第一个WebRTC应用挑战
  9. 显示当前行号、文件名和函数名
  10. [html] 你知道短链接的生成原理吗?
  11. 传B站35岁女副总裁嫁给24岁男主播!女方资产80亿,任职45家企业
  12. stm32单片机驱动L298N模块
  13. 帮室友写的表白程序 Python打包成exe文件
  14. R语言实现可理解的随机森林模型(Random Forest)——iml包
  15. 单片机程序跑飞死机的几种原因
  16. Java图形化界面编程超详细知识点(10)——Swing_表格
  17. hdiraw多点分析,使用getevnt进行上报
  18. CNN Architecture
  19. android开发——分秒计时器(可 开始/暂停/继续/停止)
  20. java设计建议植物大战僵尸_基于Java的游戏设计之植物大战僵尸

热门文章

  1. 直线段检测法(LSD)
  2. MFC对话框标题栏颜色自绘,标题栏由过渡色组成,自绘关闭按钮
  3. 计算机考证忘记密码了怎么办,计算机忘记开机密码怎么办?
  4. 绑架、做空、造假…是谁搞垮了曾经的“网红公司”网秦?
  5. 做了个网页版的 五笔跟打器: 玫枫跟打器
  6. pythonallowpos_基于Python的诗和远方
  7. 过度理想化与造梦周期
  8. java robot 游戏_JAVA制作游戏脚本(1)---Robot机器人
  9. android 设置应用权限管理,几种安卓权限管理应用介绍
  10. php里用钢笔画曲线,ps钢笔工具怎么抠图