SpringBoot动态生成多个Excel文件以压缩包.zip格式下载
文章图片
前言
文件下载的场景很多(还不是需求丰富嘛~),那么什么是动态生成文件呢,就是用户选择文件内容,服务器端根据选择的数据生成某个格式的文件然后下载到客户端。单个码直接下载,多个打包下载咯!
项目场景
项目中有个数据导出excel的需求,而且是批量,那么就要打包咯
解决步骤
基本实现如下:
- 生成文件
- 保存到临时目录 || 缓存到内存中
- 将文件打包下载
【SpringBoot动态生成多个Excel文件以压缩包.zip格式下载】直接把文件输出流放到压缩流ZipOutputStream
List fields = new ArrayList<>();
fields.add("字段1");
fields.add("字段2");
fields.add("字段3");
HSSFWorkbook workbook = excelUtil.getNewExcel("压缩文件测试", fields);
try {response.setContentType("application/zip;
charset=UTF-8");
//返回客户端浏览器的版本号、类型String agent = request.getHeader("USER-AGENT");
String downloadName = "压缩文件测试.zip";
//针对IE或者以IE为内核的浏览器:if (agent.contains("MSIE") || agent.contains("Trident")) {downloadName = java.net.URLEncoder.encode(downloadName, "UTF-8");
} else {downloadName = new String(downloadName.getBytes("UTF-8"), "ISO-8859-1");
}response.setHeader("Content-disposition", "attachment;
filename=" + downloadName);
ZipOutputStream zipOutputStream = new ZipOutputStream(response.getOutputStream());
//多个从这里就可遍历了// --startZipEntry entry = new ZipEntry("第一个文件名.xls");
zipOutputStream.putNextEntry(entry);
ByteOutputStream byteOutputStream = new ByteOutputStream();
workbook.write(byteOutputStream);
byteOutputStream.writeTo(zipOutputStream);
//zipOutputStream.write(workbook.getBytes());
byteOutputStream.close();
zipOutputStream.closeEntry();
// --endzipOutputStream.close();
} catch (IOException e) {e.printStackTrace();
}
生成excel文件也贴一下,如下:
public static HSSFWorkbook getNewExcel(String formName, List fields) {//新建excel对象HSSFWorkbook workbook = new HSSFWorkbook();
//新建工作表HSSFSheet sheet = workbook.createSheet(formName);
// 设置表格默认列宽度为20个字节sheet.setDefaultColumnWidth((short) 20);
// 生成一个样式HSSFCellStyle style = workbook.createCellStyle();
// 生成一个字体HSSFFont font = workbook.createFont();
font.setFontHeightInPoints((short) 12);
//字体应用到当前样式style.setFont(font);
//创建表格行HSSFRow row = sheet.createRow(0);
//设置表单名称row.createCell(0).setCellValue(formName);
if (fields.size() - 1 > 0) {//合并单元格sheet.addMergedRegion(new CellRangeAddress(0, 0, 0, fields.size() - 1));
}HSSFRow row1 = sheet.createRow(sheet.getLastRowNum() + 1);
//设置列标题行for (int i = 0;
i < fields.size();
i++) {row1.createCell(i).setCellValue(fields.get(i));
}return workbook;
}
一些实践总结,欢迎指正!
推荐阅读
- springboot|Vue+Spring Boot前后端分离开发实战--微服务框架书籍
- SpringBoot|[SpringBoot系列]SpringBoot如何整合SSMP
- java|基于SpringBoot的SSMP整合案例
- SpringBoot|[SpringBoot系列]基础过渡与夯实(创建Boot项目的新方式、Boot简化核心)
- SpringBoot|[SpringBoot系列]基础过渡与夯实(基础配置)
- 关于vue-admin-element中的动态加载路由
- IntelliJ|IntelliJ IDEA 自动生成序列化serialVersionUID设置
- Ant-design-pro的动态菜单的实现
- 一个注解搞定SpringBoot接口定制属性加解密
- Springboot集成kafka高级应用实战