Map<String, List<Map<String, Object>>> listGroupMao = listGroup(list,"QXDMKDDM"); String[] headers = new String[]{"區縣代碼", "區縣名稱", "考點代碼", "考點簡稱", "考試時間", "課程代碼", "課程簡稱", "考場號", "屏幕標識"};//在excel中的第2行每列的參數 String[] headersKey = new String[]{"QXDM", "QXMC", "KDDM", "KDJC", "KSSJ", "KCDM", "KCMC", "KCH", "PMBS"};//在excel中的第2行每列的參數 exportExcel(response, listGroupMao,headers,headersKey);
package org.jeecg.common.util; import org.apache.poi.hssf.usermodel.*; import org.apache.poi.ss.util.CellRangeAddress; import javax.servlet.ServletOutputStream; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.zip.ZipEntry; import java.util.zip.ZipOutputStream; public class ExcelGroupUtil { public static Map<String, List<Map<String,Object>>> listGroup(List<Map<String,Object>> list,String key) throws Exception { Map<String, List<Map<String,Object>>> resultMap = new HashMap<>(); try { for (Map map : list) { String mapKey =String.valueOf(map.get(key)); // map中key已存在,將該數據存放到同一個key(key存放的是一級品種code + 交貨地code)的map中 if (resultMap.containsKey(mapKey)) { resultMap.get(mapKey).add(map); } else { // map中不存在,新建key,用來存放數據 List<Map<String,Object>> tmpList = new ArrayList<>(); tmpList.add(map); resultMap.put(mapKey, tmpList); } } } catch (Exception e) { throw new Exception("按照一級品種code加交貨地code進行分組時出現異常", e); } return resultMap; } public static void exportExcel(HttpServletResponse response, Map<String, List<Map<String, Object>>> map, String[] headers, String[] headersKey) throws IOException { ServletOutputStream outputStream = response.getOutputStream(); ZipOutputStream zipOutputStream = new ZipOutputStream(outputStream); try { map.forEach((k, v) -> { //新建一個Excel 並設置下sheet頭 HSSFWorkbook workbook = createExcelAndSetHeaders(headers, k); //向sheet中 繼續填充對象的數據 setSheetCellValue(workbook.getSheet(k), v,headersKey); try { //重點開始,創建壓縮文件 ZipEntry zipEntry = new ZipEntry(k + ".xls"); zipOutputStream.putNextEntry(zipEntry); } catch (IOException e) { try { throw new Exception("向XXX壓縮包中添加Excel失敗"); } catch (Exception e1) { e1.printStackTrace(); } } try { //寫入一個壓縮文件 workbook.write(zipOutputStream); } catch (IOException e) { try { throw new Exception("向zipOutputStream中寫入流數據失敗"); } catch (Exception e1) { e1.printStackTrace(); } } }); zipOutputStream.flush(); } catch (Exception e) { e.printStackTrace(); } finally { //關閉數據流,注意關閉的順序 zipOutputStream.close(); outputStream.close(); } } private static HSSFWorkbook createExcelAndSetHeaders(String[] headers, String sheetName) { HSSFWorkbook hssfWorkbook = new HSSFWorkbook(); HSSFCellStyle headstyle = createCellStyle(hssfWorkbook, (short) 18); HSSFCellStyle style1 = createCellStyle(hssfWorkbook, (short) 13); HSSFSheet hssfSheet = hssfWorkbook.createSheet(sheetName); hssfSheet.setDefaultColumnWidth(15); hssfSheet.setDefaultRowHeightInPoints(15); hssfSheet.autoSizeColumn(1, true); HSSFRow row0 = hssfSheet.createRow(0); row0.setHeightInPoints(50); HSSFCell cell0 = row0.createCell(0); // 加載單元格樣式 cell0.setCellStyle(headstyle); String titleName = "考場標識 ("+sheetName.substring(sheetName.lastIndexOf("_")+1)+")"; cell0.setCellValue(titleName); hssfSheet.addMergedRegion(new CellRangeAddress(0, 0, 0, headers.length - 1)); HSSFRow row1 = hssfSheet.createRow(1); for (int i = 0; i < headers.length; i++) { HSSFCell cellHeader = row1.createCell(i); cellHeader.setCellStyle(style1); cellHeader.setCellValue(headers[i]); } return hssfWorkbook; } private static void setSheetCellValue(HSSFSheet hssfSheet, List<Map<String,Object>> dtos,String[] headersKey) { for (Map map : dtos) { //從當前sheet頁的最后一行后新增一行,開始填充數據 HSSFRow row = hssfSheet.createRow(hssfSheet.getLastRowNum() + 1); int count = -1; for (int i = 0; i < headersKey.length; i++) { row.createCell(++count).setCellValue(String.valueOf(map.get(headersKey[i]))); } } } /** * 創建單元格樣式 * * @param workbook 工作簿 * @param fontSize 字體大小 * @return 單元格樣式 */ private static HSSFCellStyle createCellStyle(HSSFWorkbook workbook, short fontSize) { HSSFCellStyle style = workbook.createCellStyle(); style.setAlignment(HSSFCellStyle.ALIGN_CENTER);// 水平居中 style.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);// 垂直居中 // 創建字體 HSSFFont font = workbook.createFont(); font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);// 加粗字體 font.setFontHeightInPoints(fontSize); // 加載字體 style.setFont(font); return style; } }