將數據集合按某個字段分組,分別導出excel


 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;
    }
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM