項目場景
項目中有個數據導出excel的需求,而且是批量,那么就要打包咯
解決步驟
基本實現如下:
- 生成文件
- 保存到臨時目錄 || 緩存到內存中
- 將文件打包下載
我不想廢話了,上代碼:
直接把文件輸出流放到壓縮流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個字節 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; }