广西网站建设费用/站长工具爱情岛
本文总结了magicapi将多个文件压缩成zip流,通过ResponseEntity下载-不用将zip保存硬盘。
一、工具类:数组转字节流
/*** 写入excel* @param result 传入一个横是array,竖是array的列表* @param headers 表头*/@Function@Comment("表头和表内容转换字节流")public byte[] writeExcel(@Comment(name = "headers", value = "表头<key,value>,key是数据库字段名,value是表格的字段名")LinkedHashMap<String,String> headers,@Comment(name = "rows", value = "表内容,格式[{...},{...}]")ArrayList<Map<String,String>> rows) {SXSSFWorkbook wb = new SXSSFWorkbook();SXSSFSheet sheet = wb.createSheet("sheet1");SXSSFRow row = sheet.createRow(0);int columnIndex = 0;for(String value : headers.values()) {row.createCell(columnIndex).setCellValue(value);columnIndex++;}int rowIndex = 1;for(int i=0;i<rows.size();i++) {Map<String,String> map = rows.get(i);row = sheet.createRow(rowIndex);rowIndex++;int j = 0;for(String key : headers.keySet()) {row.createCell(j).setCellValue(map.get(key));j++;}}return getByte(wb);}/*** 返回文件流* @return*/private byte[] getByte(SXSSFWorkbook wb) {ByteArrayOutputStream bos = new ByteArrayOutputStream();try {wb.write(bos);wb.close();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();
// logger.error(e.getMessage());}return bos.toByteArray();}
二、工具类:文件批量压缩
/*** 文件批量压缩,不保存实际位置** @param byteList 文件字节码Map,k:fileName,v:byte[]* @param byteOutPutStream 字节输出流*/@Function@Comment("文件批量压缩,不保存实际位置")public void batchFileToZIP(@Comment(name = "多个map文件输入", value = "Map<String, byte[]>,String是文件名,byte是流")Map<String, byte[]> byteList, @Comment(name = "输出流", value = "stream输出,作为response输入参数")ByteArrayOutputStream byteOutPutStream) {ZipOutputStream zipOutputStream = new ZipOutputStream(byteOutPutStream);try {for (Map.Entry<String, byte[]> entry : byteList.entrySet()) {//写入一个条目,我们需要给这个条目起个名字,相当于起一个文件名称zipOutputStream.putNextEntry(new ZipEntry(entry.getKey()));zipOutputStream.write(entry.getValue());}zipOutputStream.closeEntry();} catch (IOException e) {e.printStackTrace();} finally {try {zipOutputStream.close();} catch (IOException e) {e.printStackTrace();}}}
三、脚本调用示例
magicapi脚本就可以直接调用以上2个工具类。
#调用工具类一
#表头
var headers = {'s_1': '标签1','s_2': '标签2',}
var rows = [{'s_1': '数据1', 's_2': '数据2', }
]
#返回字节流
var stream = writeExcel(headers, rows)#调用工具类二
import java.io.ByteArrayOutputStream
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
import java.util.HashMap
Map byteFileMap = new HashMap()
byteFileMap.put("text1.csv",stream);
byteFileMap.put("text2.csv",stream);
batchFileToZIP(byteFileMap, byteArrayOutputStream);#调用magicapi的response模块三
var zipFileName = "text.zip"
return response.download(byteArrayOutputStream.toByteArray(), zipFileName)
参考:springboot将多个文件压缩成zip流并通过ResponseEntity下载-不用将zip保存硬盘_水豚少年的码农生活的博客-CSDN博客