XSSFWorkbook對象的write方法內會將傳入的資源流自動關閉 導致下載excel失敗
錯誤代碼
OutputStream out = response.getOutputStream();
ZipOutputStream zos = new ZipOutputStream(out);
XSSFWorkbook workbook = new XSSFWorkbook();
// 將文件寫入zip內,即將文件進行打包
zos.putNextEntry(new ZipEntry(fileName + "(" + UUID.randomUUID() + ")." + typeName));
// 此處將自動關閉zos資源
workbook.wirte(zos);
解決方法: 將XSSFWorkbook轉換成ByteArrayOutputStream,用ByteArrayOutputStream對象將流寫入zip對象中
OutputStream out = response.getOutputStream();
ZipOutputStream zos = new ZipOutputStream(out);
XSSFWorkbook workbook = new XSSFWorkbook();
// 將文件寫入zip內,即將文件進行打包
zos.putNextEntry(new ZipEntry(fileName + "(" + UUID.randomUUID() + ")." + typeName));
ByteArrayOutputStream bos = new ByteArrayOutputStream();
workbook.write(bos);
bos.writeTo(zos);
zos.closeEntry();
// 當所有文件打包完成后關閉zos資源
zos.close();