1. 程式人生 > >poi excel單元格合併

poi excel單元格合併

sheet.addMergedRegion(new CellRangeAddress(oldValue, newValue, 0, 0));

CellRangeAddress有4個引數:起始行號,終止行號, 起始列號,終止列號

當合並一列的單元格時,可以先渲染全部資料,在進行相同項的合併

public void exportXls(StatisticalInfo model, HttpServletResponse response, SysUser user){
        
        // 1.建立Excel工作薄物件  
        HSSFWorkbook wb = new HSSFWorkbook();  
        // 2.建立Excel工作表物件  
        HSSFSheet sheet = wb.createSheet("new Sheet111");  
        // 3.建立單元格樣式  
        CellStyle cellStyle = wb.createCellStyle();  
        // 設定這些樣式  
        cellStyle.setFillForegroundColor(HSSFColor.SKY_BLUE.index);  
        cellStyle.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);  
        cellStyle.setBorderBottom(HSSFCellStyle.BORDER_THIN);  
        cellStyle.setBorderLeft(HSSFCellStyle.BORDER_THIN);  
        cellStyle.setBorderRight(HSSFCellStyle.BORDER_THIN);  
        cellStyle.setBorderTop(HSSFCellStyle.BORDER_THIN);  
        cellStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER);  
        sheet.setDefaultColumnWidth(20);
        
        HSSFRow row = sheet.createRow(0);  
        row.createCell(0).setCellValue("監測單位地區");  
        row.createCell(1).setCellValue("監測專案");  
        row.createCell(2).setCellValue("汙染物數量");  
        row.createCell(3).setCellValue("具體監測專案");  
        row.createCell(4).setCellValue("樣品數量");  
        row.createCell(5).setCellValue("合計");  
        
        List<StatisticalInfo> list = getProjectStatistic(model,user);
        
        if(CollectionUtils.isNotEmpty(list)){
            int i = 1;
            
            for (StatisticalInfo view : list) {
                
                row = sheet.createRow(i);  
                row.createCell(0).setCellValue(view.getPrecinctName());  
                row.createCell(1).setCellValue(view.getPath());  
                row.createCell(2).setCellValue(view.getDetectionCount());  
                row.createCell(3).setCellValue(view.getNamePath());  
                row.createCell(4).setCellValue(view.getSampleCount());  
                row.createCell(5).setCellValue(view.getTotal());
                
                i++;
                
            }
            
            Map<String, Integer> map = null;
            setMap1(map, list, sheet, 0, 0);
            setMap2(map, list, sheet, 0, 0);
            setMap3(map, list, sheet, 0, 0);
            setMap4(map, list, sheet, 0, 0);
        }
        
        
        try {
            OutputStream out = null;
            response.setContentType("application/x-msdownload");
            response.setHeader("Content-Disposition", "attachment; filename=" + URLEncoder.encode("data.xls", "UTF-8"));
            out = response.getOutputStream();            
            wb.write(out);
            out.flush();
            out.close();        
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

/**
     * setMap1:(合併監測單位地區). <br/>
     *
     * @author wpengfei
     * @param list
     * @return
     * @since JDK 1.6
     */
    private void setMap1(Map<String, Integer> map,List<StatisticalInfo> list,
            HSSFSheet sheet, int newValue, int oldValue ){
        
        map = new LinkedHashMap<String, Integer>();
        String key = null;
        for (StatisticalInfo view : list) {
            
            key = view.getPrecinctName();
            if(map.containsKey(key)){
                map.put(key, map.get(key)+1);
            } else {
                map.put(key, 1);
            }
        }
        
        for (Map.Entry<String, Integer> entry : map.entrySet()) {
            
            oldValue = newValue+1;
            newValue = entry.getValue() -1 + oldValue;
            
            sheet.addMergedRegion(new CellRangeAddress(oldValue, newValue, 0, 0));
            
        }
        
    }

/**
     * setMap2:(合併監測專案). <br/>
     *
     * @author wpengfei
     * @param map
     * @param list
     * @param sheet
     * @param newValue
     * @param oldValue
     * @param key
     * @since JDK 1.6
     */
    private void setMap2(Map<String, Integer> map,List<StatisticalInfo> list,
            HSSFSheet sheet, int newValue, int oldValue ){
        
        map = getMap(list);
        
        for (Map.Entry<String, Integer> entry : map.entrySet()) {
            
            oldValue = newValue+1;
            newValue = entry.getValue() -1 + oldValue;
            
            sheet.addMergedRegion(new CellRangeAddress(oldValue, newValue, 1, 1));
        }
    }
    
    
    
    /**
     * setMap3:(合併汙染物數量). <br/>
     *
     * @author wpengfei
     * @param map
     * @param list
     * @param sheet
     * @param newValue
     * @param oldValue
     * @param key
     * @since JDK 1.6
     */
    private void setMap3(Map<String, Integer> map,List<StatisticalInfo> list,
            HSSFSheet sheet, int newValue, int oldValue ){
        
        map = getMap(list);
        
        for (Map.Entry<String, Integer> entry : map.entrySet()) {
            
            oldValue = newValue+1;//oldValue初始值為0
            newValue = entry.getValue() -1 + oldValue;//newValue初始值為0,, entry.getValue()關鍵字的個數


            
            sheet.addMergedRegion(new CellRangeAddress(oldValue, newValue, 2, 2));
            
        }
        
    }
    
    /**
     * setMap4:(合併合計). <br/>
     *
     * @author wpengfei
     * @param map
     * @param list
     * @param sheet
     * @param newValue
     * @param oldValue
     * @since JDK 1.6
     */
    private void setMap4(Map<String, Integer> map,List<StatisticalInfo> list,
            HSSFSheet sheet, int newValue, int oldValue ){
        
        map = getMap(list);
        
        for (Map.Entry<String, Integer> entry : map.entrySet()) {
            
            oldValue = newValue+1;
            newValue = entry.getValue() -1 + oldValue;
            
            sheet.addMergedRegion(new CellRangeAddress(oldValue, newValue, 5, 5));
            
        }
        
    }
    
    /**
     * getMap:(獲取各個關鍵字的次數). <br/>
     *
     * @author wpengfei
     * @param list
     * @return
     * @since JDK 1.6
     */
    private Map<String, Integer> getMap(List<StatisticalInfo> list){
        Map<String, Integer> map = new LinkedHashMap<String, Integer>();
        
        String key = null;
        for (StatisticalInfo view : list) {
            
            key = view.getPrecinctName() + view.getPath();
            if(map.containsKey(key)){
                map.put(key, map.get(key)+1);
            } else {
                map.put(key, 1);
            }
        }
        return map;
    }