前言
文件下載的場景很多(還不是需求豐富嘛~)蜜氨,那么什么是動態(tài)生成文件呢催享,就是用戶選擇文件內容傅寡,服務器端根據選擇的數(shù)據生成某個格式的文件然后下載到客戶端。單個碼直接下載骂倘,多個打包下載咯眼滤!
項目場景
項目中有個數(shù)據導出excel的需求巴席,而且是批量历涝,那么就要打包咯
解決步驟
基本實現(xiàn)如下:
生成文件
保存到臨時目錄 || 緩存到內存中
將文件打包下載
我不想廢話了,上代碼:
直接把文件輸出流放到壓縮流ZipOutputStream
List<String> 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());
//多個從這里就可遍歷了
// --start
ZipEntry 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();
// --end
zipOutputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
生成excel文件也貼一下荧库,如下:
public static HSSFWorkbook getNewExcel(String formName, List<String> fields) {
//新建excel對象
HSSFWorkbook workbook = new HSSFWorkbook();
//新建工作表
HSSFSheet sheet = workbook.createSheet(formName);
// 設置表格默認列寬度為20個字節(jié)
sheet.setDefaultColumnWidth((short) 20);
// 生成一個樣式
HSSFCellStyle style = workbook.createCellStyle();
// 生成一個字體
HSSFFont font = workbook.createFont();
font.setFontHeightInPoints((short) 12);
//字體應用到當前樣式
style.setFont(font);
//創(chuàng)建表格行
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;
}
一些實踐總結,歡迎指正赵刑!