一.业务背景

工作中接到的一个业务需求,需要将某部分数据按照某个条件拆分成多个excel然后打包成压缩包,导出压缩包。

二.解决方式探索

作为一个码农,当不知道该如何解决问题的时候,第一步自然是先面向百度(谷歌)编程。于是开始了漫长的搜索。大多数的解决方式都是先在本地建一个临时的文件夹,将每个excel放到这个文件夹中,全部添加完成后打包这个文件夹,再删除这个文件夹。

看到这种解决方式,我第一反应就是恶心!什么?这样搞也太蠢了把。于是我又继续搜啊搜,终于让我找到了一个非常非常舒服的解决方式,非常感谢这位博主。

三.解决问题

@ResponseBody

@RequestMapping(value = "/xxx")

public BaseResp unDirectExport(Date date, HttpServletResponse response) throws Exception {

String fileName = xxx;

ResponseUtil.setMultipartHeader(response, fileName);

List list = xxxService.query(xx);

//按某个条件分组

Map> map = list.stream().collect(Collectors.groupingBy(T::getXXX));

exportExcel(response, map);

return BaseResp.succResp();

}

private void exportExcel(HttpServletResponse response, Map> 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 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 导出多个excel_Java导出Excel压缩包相关推荐

  1. java区分不同的excel_Java处理excel两种不同的方式

    1.背景说明 业务中有时候会碰到利用java 处理excel文件(生成.下载.上传),通常生成一个excel文件会把它写入到机器的一个临时路径,但有时候完全没必要把它存下来,只需要在内存中把这个文件转 ...

  2. java jxl上传excel_JAVA JXL -----excel文件上传和解析

    Java 操作EXCEL 有比较常见的方法 一是使用开源JXL组件,另外一种是POI,POI相对应用更广泛,能够操作微软所有windows文档,但数据量大的情况下比较消耗内存,所以相对效率比较低. 这 ...

  3. JAVA导出exls时报oom_如何实现导出百万条数据到EXCEL中不报OOM异常?

    Java项目中使用POI导出百万条数据到Excel中,但是会出现内存溢出异常. 存在以下问题需要考虑POI导出条数限制6w+ 数据量大的话会导致内存溢出 现在的做法是每6w条数据做一次分割,创建一个新 ...

  4. java使用POI工具类导出excel

    POI导出excel 1.导入maven依赖 <dependency><groupId>org.apache.poi</groupId><artifactId ...

  5. java读取百万条记录出错_如何实现导出百万条数据到EXCEL中不报OOM异常?

    Java项目中使用POI导出百万条数据到Excel中,但是会出现内存溢出异常. 存在以下问题需要考虑POI导出条数限制6w+ 数据量大的话会导致内存溢出 现在的做法是每6w条数据做一次分割,创建一个新 ...

  6. Java 利用hutool工具实现导出excel并合并单元格

    Java 利用hutool工具实现导出excel并合并单元格 controller层调用service,就一个核心方法,没错就下面这个代码就能实现了.前提是项目里面要引用hutool包.把我这个复制到 ...

  7. 使用java在后台将数据导出为excel文件

    本文主要讲的是怎么使用java将数据导出为Excel文件,xls格式的. 例如:我从前台查询到的数据,要把数据进行导出为excl格式的文件.需要将前台的查询条件(数据)传递到后台,后台拿到数据,写sq ...

  8. JAVA实现数据库数据导入/导出到Excel(POI)

    原文地址为: JAVA实现数据库数据导入/导出到Excel(POI) 准备工作: 1.导入POI包:POI下载地址http://mirrors.tuna.tsinghua.edu.cn/apache/ ...

  9. java 兼容excel_Java解析Excel工具类(兼容xls和xlsx)

    依赖jar org.apache.poi poi-ooxml 4.0.1 ExcelUtils.java package javax.utils; import java.io.File; impor ...

  10. iText导出pdf,poi导出excel并下载到客户端

    项目中需要做导出功能,要支持excel,pdf导出. excel导出我选择使用poi:pdf导出我选择使用iText,在此单独做记录. 先说说在设计与开发中的问题,从整体上把握设计思路. 思路(一) ...

最新文章

  1. [转]android的selector,背景选择器
  2. php socket ubuntu,Ubuntu升级php7.0配置fpm socket
  3. 根据当前系统日期求出本周,本月,本年,上周,上月,上年的第一天
  4. linux 安装python
  5. SAP系统的配置传输分为两种情况:
  6. 上传文件返回数据提示下载
  7. 剑指offer 二进制中1的个数
  8. sap.ca.ui.utils.busydialog - scenario1 - opportunity opened
  9. mysql使用DISTINCT进行去重
  10. python 代码_如何让Python代码加速运行?
  11. swift3.0 类字符串转类(字符串转ViewController)
  12. 【转贴】蚂蚁和大象的恩怨
  13. virtuoso配合calibre进行电路后仿真
  14. Docker配置的Redis集群报错CLUSTERDOWN Hash slot not served的解决办法
  15. android面试题之三(红黑联盟)
  16. 学习银行业务----存款
  17. 【红帽rhcsa基础命令】
  18. 娱乐蓝屏程序, 禁用键盘鼠标, 指定键可恢复
  19. You-get 万能的音视频下载工具
  20. 计算机和操作系统基础知识

热门文章

  1. threejs开启对数深度缓存区时、着色器深度混乱
  2. python复数类型的虚部通过什么表示_Python小白必备知识:Python复数类型(complex)详解...
  3. 图像的剪裁——imcrop
  4. 网页访问报错This request has been blocked; the content must be served over HTTPS.
  5. 怎么把Word文档转换成长图
  6. 视频教程-玩转Python-Python3基础入门-Python
  7. python3排序,sorted字典排序
  8. OMNeT++理论算法仿真详述
  9. c语言 输入英文 字符串,C语言编程:从键盘中输入一个英文字符串
  10. 【无标题】公众号引流进阶教程(公众号对接电影,影视资源)