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