业务场景:
需要导出多个excel文件并压缩为一个文件,最后返回给前端
解决思路:
将每个业务数据导出一个excel文件,然后通过ZipOutputStream写入一个zip文件就可以了
代码层面:
Controller入口:传入必要的业务参数,以及response
@PostMapping("/v1/analysis/mediasubsidy/export")
public void export(@RequestBody MediaSubsidyMonthRequest mediaSubsidyMonthRequest,HttpServletResponse response) throws Exception {
if (mediaSubsidyMonthRequest.getSort() == null) {
mediaSubsidyMonthRequest.setSort(1);
}
if (mediaSubsidyMonthRequest.getPage() == null) {
mediaSubsidyMonthRequest.setPage(1);
}
if (mediaSubsidyMonthRequest.getSize() == null) {
mediaSubsidyMonthRequest.setSize(10000);
}
//获取压缩列表
ExportMoreFileEntity exportMoreFileEntity = exportOperate.getMediaSubsidyHSSFWorkbooks(mediaSubsidyMonthRequest);
List<String> fileNames = exportMoreFileEntity.getFileNames();
List<HSSFWorkbook> hssfWorkbookList = exportMoreFileEntity.getHssfWorkbookList();
ZipOutputStream outputStream =null;
try {
String downloadFileName = URLEncoder.encode("SelfMediaReport.zip", "UTF-8");
response.setHeader("content-type", "application/octet-stream");
response.setHeader("Access-Control-Expose-Headers", "Content-Disposition");
response.setContentType("application/x-execl");
response.setHeader("Content-Disposition",
"attachment;filename=" + new String((downloadFileName).getBytes(), "UTF-8"));
// 读取文件
outputStream= new ZipOutputStream(response.getOutputStream());
List<ByteArrayOutputStream> workList = ExportAndZipUtil.workBook2Stream( hssfWorkbookList);
for (int i = 0; i < fileNames.size(); i++) {
outputStream.putNextEntry(new ZipEntry(fileNames.get(i)));
byte[] buf = workList.get(i).toByteArray();
outputStream.write(buf,0,buf.length);
}
}finally {
if(outputStream!=null){
outputStream.close();
}
}
}
ExportAndZipUtil 将HSSFWorkbook转成字节流
package com.mongcent.statistics.analysis.web.util;
import cn.hutool.core.io.IoUtil;
import cn.hutool.core.util.ZipUtil;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.xssf.usermodel.*;
import org.springframework.stereotype.Service;
import java.io.*;
import java.text.SimpleDateFormat;
import java.util.LinkedList;
import java.util.List;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;
/**
* @author: hezishan
* @date: 2021/1/22.
* @desc:
**/
public class ExportAndZipUtil {
/**
* 把传入的工作簿文件转成输入流
*
* @param workbooks 工作簿文件
* @return 文件流list
*/
public static List<ByteArrayOutputStream> workBook2Stream(List<HSSFWorkbook> workbooks) throws IOException {
List<ByteArrayOutputStream> list = new LinkedList<ByteArrayOutputStream>();
for (Workbook obj : workbooks) {
ByteArrayOutputStream os = new ByteA