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