1.背景:
实际应用中,批量导出exel的功能,用户为了方便归类整理,要求导出一个压缩包,然后压缩包里再按某种规则进行压缩打包excel。最终导出到本地环境的文件是一个压缩包套压缩包的形式。
2.原理:
里层一个压缩流,外层一个总的压缩流,用两个压缩流导出。
3.实现:

// 外层压缩流ZipArchiveOutputStream zos=new ZipArchiveOutputStream(new File(zipName));zos.setEncoding("UTF8");ZipEncoding zipEncoding = ZipEncodingHelper.getZipEncoding("UTF8");InputStream input = null;BufferedInputStream bis = new BufferedInputStream(new FileInputStream(zipName1));for(){//业务代码......ZipArchiveOutputStream zos1 = new ZipArchiveOutputStream(new File(zipName2));zos1.setEncoding("UTF8");ZipEncoding zipEncoding1 = ZipEncodingHelper.getZipEncoding("UTF8");BASE64Decoder decoder = new BASE64Decoder();for(){//业务代码......// excelContent为要导出的String流byte[] b=decoder.decodeBuffer(excelContent);InputStream in = new ByteArrayInputStream(b);// 创建输入流读取文件BufferedInputStream bis1 = new BufferedInputStream(in);// 将excel文件写入zip内,即将文件进行打包ZipArchiveEntry zipEntry = new ZipArchiveEntry(reportName + ".xlsx");ByteBuffer byteBuffer = zipEncoding1.encode(reportName + ".xlsx");// 从给定的文件名称和字节数组组装unicode路径名称UnicodePathExtraField unicodePathExtraField = new UnicodePathExtraField(reportName + ".xlsx", byteBuffer.array(),byteBuffer.arrayOffset(), byteBuffer.limit() - byteBuffer.position());zipEntry.addExtraField(unicodePathExtraField);zos1.putArchiveEntry(zipEntry);// 写入文件的方法,同上int size = 0;// 设置读取数据缓存大小byte[] buffer = new byte[1024];while ((size = bis1.read(buffer)) > 0) {zos1.write(buffer, 0, size);}zos1.closeArchiveEntry();bis1.close();}zos1.close();// 向总的压缩包里写入非结构化的压缩包input = new FileInputStream(fileBran);ZipArchiveEntry zipEntry = new ZipArchiveEntry(fileName);ByteBuffer byteBuffer = zipEncoding.encode(fileName);// 从给定的文件名称和字节数组组装unicode路径名称UnicodePathExtraField unicodePathExtraField = new UnicodePathExtraField(fileName,byteBuffer.array(), byteBuffer.arrayOffset(), byteBuffer.limit() - byteBuffer.position());zipEntry.addExtraField(unicodePathExtraField);zos.putArchiveEntry(zipEntry);int temp = 0;while ((temp = input.read()) != -1) {zos.write(temp);}zos.flush();zos.closeArchiveEntry();}input.close();zos.flush();zos.close();// 下载的时候兼容IE浏览器String userAgent = request.getHeader("user-agent").toLowerCase();// win10 ie edge 浏览器 和其他系统的ieif (userAgent.contains("msie") || userAgent.contains("like gecko")) {try {zipName = URLEncoder.encode(zipName, "utf-8");} catch (UnsupportedEncodingException e) {logger.error("win10 ie edge 浏览器 和其他系统的ie-生成压缩文件名出错:", e);}} else {// 其他浏览器zipName = new String((zipName).getBytes(StandardCharsets.UTF_8), StandardCharsets.ISO_8859_1);}response.setContentType("application/octet-stream; charset=utf-8");response.setHeader("Content-Disposition", "attachment; filename=" + zipName);// 创建页面返回方式为输出流,会自动弹出下载框OutputStream out = response.getOutputStream();// 将打包后的文件写到客户端,输出的方法同上,使用缓冲流输出bis = new BufferedInputStream(new FileInputStream(zipName));byte[] zbuff = new byte[bis.available()];bis.read(zbuff);bis.close();// 输出数据文件out.write(zbuff);// 释放缓存out.flush();// 关闭输出流out.close();

以上就是导出压缩包套压缩包文件的大致流程代码。

压缩包套压缩包的形式批量导出excel相关推荐

  1. Excel记录指定文件夹下的所有文件名;批量解压压缩包,处理压缩包套压缩包问题;

    10.20 发现一个问题: 当压缩包过大,文件条目超过1048576时,rarfile库中的代码已经不能解决这个压缩包了,需要加装unrar库(from unrar import rarfile)和u ...

  2. POI批量导出Excel ZIP打包下载

    POI批量导出Excel ZIP打包下载 1.公共抽象导出Excel类 需要自己实现两个抽象方法: getColumValueForColunmName : 扩展方法:根据名称判断来做值得转换 比如: ...

  3. VBA应用笔记 -- 批量导出excel工作表中的图片

    业务场景: 日常工作中,我们可能会遇到需要批量导出excel表中的图片的情况,按照网友的做法,批量导出excel中的图片主要有几种方法: 解压缩方法:可以通过将excel文件转成rar压缩文件,解压后 ...

  4. 使用POI批量导出Excel文件(SSM)

    文章目录 前言 如何使用POI批量导出Excel文件(SSM) 一.什么是POI? 模块 二.使用步骤 1.引入依赖 2.mapper层代码 包括Mapper接口.Mapper SQL代码 Mappe ...

  5. 前端提效 - js 批量导出 excel 为zip压缩包

    本篇文章主要介绍使用 exceljs.file-saver.jszip实现下载包含多层级文件夹.多个 excel.每个 excel 支持多个 sheet 的 zip 压缩包. 上一篇文章:前端复杂表格 ...

  6. php使用phpspreadsheet批量导出excel数据

    由于PHPExcel早就停止更新维护,建议使用phpspreadsheet,本文就教你如何用PhpSpreadsheet导出excel 这里我用的thinkadmin框架举例,其他也是大同小异 注:原 ...

  7. thinkphp thinkadmin使用phpspreadsheet批量导出excel数据

    由于PHPExcel早就停止更新维护,建议使用phpspreadsheet,本文就教你如何用PhpSpreadsheet导出excel 注:原生导出excel可以看我另一篇文章https://blog ...

  8. php批量导出excel表格,PHP批量导出数据为excel表格

    之前用插件phoexcel写过批量导入数据,现在用到了批量导出,就记录一下,这次批量导出没用插件,是写出一个表格,直接输出 //$teacherList 是从数据库查出来的二维数组 $execlnam ...

  9. Elasticsearch获取ES查询的所有结果,并批量导出Excel

    工作环境是内网所以不能截图. 搭建了ELK环境. 3500W个dic中查询数据,并要求导出excel. 从es中查询 status=500,返回为空,查询时间超过2000ms的数据 head插件查询出 ...

最新文章

  1. 如何在JavaScript中比较数组?
  2. python-1day
  3. linux下的malloc申请的是虚拟还是物理的,关于malloc申请内存
  4. python中文版免费下载-PYTHON自然语言处理(中文最新完整版)pdf下载
  5. 【信号与系统】(二十一)拉普拉斯变换与复频域分析——拉普拉斯变换及其性质
  6. 清风老师数学建模课程——第一讲层次分析法
  7. java把date转化成yyyymmdd_jquery 将当前时间转换成yyyymmdd格式的实现方法
  8. matlab面试问题,前25个MATLAB面试问题
  9. Field.Store ,ANALYZED备忘
  10. php 万网域名查询接口
  11. 读取yaml文件出现UnicodeDeco: ‘gbk‘ codec can‘t decode byte 0xaf in position 68: illegal multibyte sequen报错
  12. jQuery全屏插件fullPage的基本使用
  13. blob格式照片在前端页面的显示
  14. 重新理解创业:一个创业者的中途思考
  15. QT 安装 配置过程
  16. PYTHON 中的多线程
  17. node-sass安装失败的解决方法
  18. mysql时间分钟比较_MySql中时间比较方法 周 小时 分钟
  19. IOS多线程使用GCD与信号量实现生产者与消费者模式
  20. Java并发问题--乐观锁与悲观锁以及乐观锁的一种实现方式-CAS

热门文章

  1. js事件循环——看输出顺序
  2. [总结]为了效率,应该把基础运算交给数据库还是程序?
  3. 微信渠道推广带参数二维码如何生成和统计呢?
  4. Construct2:自制简易超级玛丽射击游戏进阶
  5. ypid编码是什么_重复ypid查询,重复记录查询,准确
  6. 金融危机对于中国来说是好是坏?
  7. OPC UA 质量代码 OPC quality codes 简介
  8. Java并发--happens-before详解
  9. LAMP架构 (资源)
  10. Apollo(分布式配置中心)核心概念及核心功能介绍