java 导出多个excel_Java导出Excel压缩包
一.业务背景
工作中接到的一个业务需求,需要将某部分数据按照某个条件拆分成多个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压缩包相关推荐
- java区分不同的excel_Java处理excel两种不同的方式
1.背景说明 业务中有时候会碰到利用java 处理excel文件(生成.下载.上传),通常生成一个excel文件会把它写入到机器的一个临时路径,但有时候完全没必要把它存下来,只需要在内存中把这个文件转 ...
- java jxl上传excel_JAVA JXL -----excel文件上传和解析
Java 操作EXCEL 有比较常见的方法 一是使用开源JXL组件,另外一种是POI,POI相对应用更广泛,能够操作微软所有windows文档,但数据量大的情况下比较消耗内存,所以相对效率比较低. 这 ...
- JAVA导出exls时报oom_如何实现导出百万条数据到EXCEL中不报OOM异常?
Java项目中使用POI导出百万条数据到Excel中,但是会出现内存溢出异常. 存在以下问题需要考虑POI导出条数限制6w+ 数据量大的话会导致内存溢出 现在的做法是每6w条数据做一次分割,创建一个新 ...
- java使用POI工具类导出excel
POI导出excel 1.导入maven依赖 <dependency><groupId>org.apache.poi</groupId><artifactId ...
- java读取百万条记录出错_如何实现导出百万条数据到EXCEL中不报OOM异常?
Java项目中使用POI导出百万条数据到Excel中,但是会出现内存溢出异常. 存在以下问题需要考虑POI导出条数限制6w+ 数据量大的话会导致内存溢出 现在的做法是每6w条数据做一次分割,创建一个新 ...
- Java 利用hutool工具实现导出excel并合并单元格
Java 利用hutool工具实现导出excel并合并单元格 controller层调用service,就一个核心方法,没错就下面这个代码就能实现了.前提是项目里面要引用hutool包.把我这个复制到 ...
- 使用java在后台将数据导出为excel文件
本文主要讲的是怎么使用java将数据导出为Excel文件,xls格式的. 例如:我从前台查询到的数据,要把数据进行导出为excl格式的文件.需要将前台的查询条件(数据)传递到后台,后台拿到数据,写sq ...
- JAVA实现数据库数据导入/导出到Excel(POI)
原文地址为: JAVA实现数据库数据导入/导出到Excel(POI) 准备工作: 1.导入POI包:POI下载地址http://mirrors.tuna.tsinghua.edu.cn/apache/ ...
- 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 ...
- iText导出pdf,poi导出excel并下载到客户端
项目中需要做导出功能,要支持excel,pdf导出. excel导出我选择使用poi:pdf导出我选择使用iText,在此单独做记录. 先说说在设计与开发中的问题,从整体上把握设计思路. 思路(一) ...
最新文章
- [转]android的selector,背景选择器
- php socket ubuntu,Ubuntu升级php7.0配置fpm socket
- 根据当前系统日期求出本周,本月,本年,上周,上月,上年的第一天
- linux 安装python
- SAP系统的配置传输分为两种情况:
- 上传文件返回数据提示下载
- 剑指offer 二进制中1的个数
- sap.ca.ui.utils.busydialog - scenario1 - opportunity opened
- mysql使用DISTINCT进行去重
- python 代码_如何让Python代码加速运行?
- swift3.0 类字符串转类(字符串转ViewController)
- 【转贴】蚂蚁和大象的恩怨
- virtuoso配合calibre进行电路后仿真
- Docker配置的Redis集群报错CLUSTERDOWN Hash slot not served的解决办法
- android面试题之三(红黑联盟)
- 学习银行业务----存款
- 【红帽rhcsa基础命令】
- 娱乐蓝屏程序, 禁用键盘鼠标, 指定键可恢复
- You-get 万能的音视频下载工具
- 计算机和操作系统基础知识
热门文章
- threejs开启对数深度缓存区时、着色器深度混乱
- python复数类型的虚部通过什么表示_Python小白必备知识:Python复数类型(complex)详解...
- 图像的剪裁——imcrop
- 网页访问报错This request has been blocked; the content must be served over HTTPS.
- 怎么把Word文档转换成长图
- 视频教程-玩转Python-Python3基础入门-Python
- python3排序,sorted字典排序
- OMNeT++理论算法仿真详述
- c语言 输入英文 字符串,C语言编程:从键盘中输入一个英文字符串
- 【无标题】公众号引流进阶教程(公众号对接电影,影视资源)