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