一.使用场景

生成多个excel文件打包压缩后导出压缩包。

二.解决方法探索

在面向百度(谷歌)编程之后的过程中发现大多数的解决方式都是先在本地建一个临时的文件夹,将每个excel放到这个文件夹中,全部添加完成后打包这个文件夹,再删除这个文件夹

看到这种解决方式,我觉得这种方式并不是很合适!我觉得会有更优雅的方式,在一番搜索之后,我发现了下面代码所展示的这种解决方式,并不需要创建中间过渡文件,直接打包压缩,非常感谢这位博主。

原博链接javaWeb导出POI创建的多个excel的压缩文件.

三.代码

 @ResponseBody@RequestMapping(value = "/xxx")public BaseResp unDirectExport(Date date, HttpServletResponse response) throws Exception {String fileName = xxx;ResponseUtil.setMultipartHeader(response, fileName);List<T> list = xxxService.query(xx);//按某个条件分组Map<String, List<T>> map = list.stream().collect(Collectors.groupingBy(T::getXXX));exportExcel(response, map);return BaseResp.succResp();}private void exportExcel(HttpServletResponse response, Map<String, List<T>> map) throws IOException {//Excel sheet 标题String[] headers = {""};ServletOutputStream outputStream = response.getOutputStream();ZipOutputStream zipOutputStream = new ZipOutputStream(outputStream);try {map.forEach((k, v) -> {//新建一个Excel 并设置下sheet头HSSFWorkbook workbook = createExcelAndSetHeaders(headers, k);//向sheet中 继续填充对象的数据setSheetCellValue(workbook.getSheet(k), v);try {//重点开始,创建压缩文件ZipEntry zipEntry = new ZipEntry(k + ".xls");zipOutputStream.putNextEntry(zipEntry);} catch (IOException e) {logger.error("向XXX压缩包中添加Excel失败");throw new Exception("向XXX压缩包中添加Excel失败");}try {//写入一个压缩文件workbook.write(zipOutputStream);} catch (IOException e) {logger.error("向zipOutputStream中写入流数据失败");throw new Exception("向zipOutputStream中写入流数据失败");}});zipOutputStream.flush();} catch (Exception e) {//重复丢出异常,有点多余,但是为了套上try catch finally 关闭数据流logger.error("导出XXX失败,原因" + e.getErrorCode());throw new Exception("导出XXX失败,原因:" + e.getErrorCode());} finally {//关闭数据流,注意关闭的顺序zipOutputStream.close();outputStream.close();}}private HSSFWorkbook createExcelAndSetHeaders(String[] headers, String sheetName) {HSSFWorkbook hssfWorkbook = new HSSFWorkbook();HSSFSheet hssfSheet = hssfWorkbook.createSheet(sheetName);HSSFRow row0 = hssfSheet.createRow(0);for (int i = 0; i < headers.length; i++) {HSSFCell cellHeader = row0.createCell(i);cellHeader.setCellValue(headers[i]);}return hssfWorkbook;}private void setSheetCellValue(HSSFSheet hssfSheet, List<T> dtos) {for (T dto : dtos) {//从当前sheet页的最后一行后新增一行,开始填充数据HSSFRow row = hssfSheet.createRow(hssfSheet.getLastRowNum() + 1);int count = -1;row.createCell(++count).setCellValue(dto.getXXX);row.createCell(++count).setCellValue(dto.getXXX);row.createCell(++count).setCellValue(dto.getXXX);row.createCell(++count).setCellValue(dto.getXXX);row.createCell(++count).setCellValuedto.getXXX);}}
import javax.servlet.http.HttpServletResponse;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;/*** @author zhaojq* @email zhaojq@tsintergy.com* @date 2019 2019/10/14 17:11*/
public class ResponseUtil {private ResponseUtil() {}public static void setMultipartHeader(HttpServletResponse response, String fileName)    {try {response.setCharacterEncoding("utf-8");response.setContentType("multipart/form-data");response.setHeader("Content-Disposition", "attachment;filename*=UTF-8''" + URLEncoder.encode(fileName, "UTF-8"));} catch (UnsupportedEncodingException e) {throw new BusinessException("文件名编码异常");}}
}

【Java】如何导出压缩包相关推荐

  1. java导入导出压缩包

    java导入导出压缩包 最近有个需求,需要将导入导出压缩包格式的JSON文件,然后存入数据库中,特整理如下: 一:首先是导出压缩包 1.首先是controller /*** 接口必填配置导出** @a ...

  2. java项目 导出_Java项目的导入和导出

    ---------siwuxie095 在很多情况下,需要将当前的 Java工程传递给其他人继续工作, 或 协同工作,或者是从其他人那里接收到传递来的Java项目, 就需要掌握 Java项目的导入和导 ...

  3. Java excel导出压缩zip并加密(拿起即用,有用请点赞,不做白嫖怪!)

    文章目录 1.前言 2.开发思路 以下某些类缺少的可以去我上篇文章拿 4.效果 5.结尾了 6.最最后 1.前言 上篇文章我有写了java用poi导出excel加密,但excel加密懂点电脑的都知道怎 ...

  4. Java导入导出图片

    Java导入&导出图片 实现步骤: 导入图片压缩包 - 1.获取上传压缩包解压遍历为单个文件 - 2.定义图片存储目录 (Linux和win目录不同) - 3.遍历图片File存储到指定目录 ...

  5. Java项目导出为可执行jar包,并在windows/linux下运行

    Java项目导出为jar包,项目文件结构: 在你的项目的根目录下新建一个文件:MANIFEST.MF和一个lib文件夹(该文件夹放的是用的第三方包).文件内容是这样的: Manifest-Versio ...

  6. java实现导出Excel的功能

    这篇文章主要为大家详细介绍了java实现导出Excel的功能,具有一定的参考价值,感兴趣的小伙伴们可以参考一下 导出excel是咱Java开发的必备技能啦,之前项目有这个功能,现在将其独立出来,分享一 ...

  7. java导入导出excel_Java导入导出Excel工具 easyexcel

    Java导入导出Excel工具  easyexcel 做Java开发的同学,尤其是做管理后台的同学绝大多数都会接触到报表系统,这时候就少不了Excel的导入和导出了.Java解析生成Excel比较有名 ...

  8. java 中导出word后压缩文件_Java批量导出word压缩后的zip文件案例

    一.js代码,由于参数比较大所以利用form表单使用post导出 function export_word(){ var selectedRows = $("#dg").datag ...

  9. java后台导出excel代码详细讲解,java基础面试笔试题

    我总结出了很多互联网公司的面试题及答案,并整理成了文档,以及各种学习的进阶学习资料,免费分享给大家. 扫描二维码或搜索下图红色VX号,加VX好友,拉你进[程序员面试学习交流群]免费领取.也欢迎各位一起 ...

  10. java zip追加_基于Java向zip压缩包追加文件

    这篇文章主要介绍了基于Java向zip压缩包追加文件,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 有个需求,从某个接口下载的一个zip压缩包,往里 ...

最新文章

  1. 【Qt】QModbusResponse类
  2. 聚类算法(part1)--DBSCAN
  3. restful web_泽西岛的RESTful Web服务
  4. 前端学习笔记之 JavaScript WebAPIs(整理)
  5. 你在滥用Python吗?初学者常会遇到的5个情景
  6. 你不知道的 Web 性能优化 | 原力计划
  7. 系统集成管理师2011下半年软考透解 四
  8. VC++实现自定义切换按钮
  9. python粘性拓展_Python拓展
  10. php生成静态页面的方法,php生成静态页面的办法
  11. win7中竟然没有telnet.exe??
  12. tornado(五)
  13. iOS开发-dSYM文件
  14. marlin固件解析
  15. 8根网线的排序和作用
  16. centos7 wget无法解析主机域名的解决办法
  17. 混合现实:地面高度不准确
  18. H3C交换机MPLS配置
  19. phinx武林秘籍(上)
  20. 关于睡眠唤醒实现开机功能

热门文章

  1. 人工智能会取代程序员吗?
  2. excel下拉公式保持一些参数不变
  3. python中def func是什么意思_python中的函数def和函数的参数
  4. mysql比较两个表数据的差异_mysql实用技巧之比较两个表是否有不同数据的方法分析...
  5. Python批量将TXT文件转为Excel格式
  6. win11电脑摄像头打不开,如下图
  7. 1设计一身高体重测量仪c语言,身高体重测量仪使用经验
  8. Android 自带的字体库、字体样式
  9. safari打不开cookies_从Mac和iOS上的safari阻止cookies的设置方法
  10. coreldraw矫正两张图_CorelDRAW矫正图像方法-CDR中如何矫正图像_好特教程