//Java poi 实现循环合并行,还是第一次遇到这种问题
//在网上查了很多资料,都不是自己想要的
//以下为自己研究后,写的一点东西,给大家分享,希望对大家能有思路上的启发,也希望大家能提出宝贵意见,相互学习,一起提高,谢谢
import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFCellStyle;
import org.apache.poi.hssf.usermodel.HSSFFont;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.hssf.util.CellRangeAddress;
import org.apache.poi.hssf.util.Region;
//定义excel-sheet的数据显示
@SuppressWarnings("unchecked")
List> bodyList = (List>) model.get("body");
/***********************数据************************/
HSSFCellStyle style1 = workBook.createCellStyle();//数据样式设置
HSSFFont font1 = workBook.createFont();
style1.setAlignment(HSSFCellStyle.ALIGN_CENTER);//水平居中
style1.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);//垂直居中
style1.setFont(font1);
int startRow = 0;//合并开始行号
int endRow = 0;//合并结束行号
double tspTotal = 0;//计算,合并的根据项的子项和的中间变量
double so2Total = 0;
double noxTotal = 0;
//数据第一行(因为有标题和表头,所以,数据行号从2开始)
int rowNum = 2;
//数据第一列
if(bodyList!=null && bodyList.size()>0){
//按照企业名称、相同的合并行,并计算企业的tsp、so2、nox的总量
for(int i=0;i
int bodyline = 0;
HSSFRow row = sheet.createRow(rowNum);
for(int j = 0;j
row.createCell(bodyline).setCellValue(bodyList.get(i).get(j));
row.getCell(bodyline).setCellStyle(style1);
bodyline++;
}
if(i != 0){
if(bodyList.get(i-1).get(0).equals(bodyList.get(i).get(0))){//两行的主项相等
tspTotal += Double.valueOf(bodyList.get(i-1).get(3).toString());
so2Total += Double.valueOf(bodyList.get(i-1).get(5).toString());
noxTotal += Double.valueOf(bodyList.get(i-1).get(7).toString());
endRow++;//则合并结束行号+1
if(i == bodyList.size()-1){//最后一行数据判断、合并行
tspTotal += Double.valueOf(bodyList.get(i).get(3).toString());
so2Total += Double.valueOf(bodyList.get(i).get(5).toString());
noxTotal += Double.valueOf(bodyList.get(i).get(7).toString());
sheet.getRow(rowNum - (endRow - startRow)).getCell(3).setCellValue(tspTotal);//企业TSP总量
sheet.getRow(rowNum - (endRow - startRow)).getCell(5).setCellValue(so2Total);//企业SO2总量
sheet.getRow(rowNum - (endRow - startRow)).getCell(7).setCellValue(noxTotal);//企业NOX总量
//企业名称
sheet.addMergedRegion(new CellRangeAddress(
startRow, //first row (0-based)
endRow, //last row (0-based)
0, //first column (0-based)
0 //last column (0-based)
));//合并单元格
//企业TSP总量
sheet.addMergedRegion(new CellRangeAddress(
startRow, //first row (0-based)
endRow, //last row (0-based)
3, //first column (0-based)
3 //last column (0-based)
));//合并单元格
//企业SO2总量
sheet.addMergedRegion(new CellRangeAddress(
startRow, //first row (0-based)
endRow, //last row (0-based)
5, //first column (0-based)
5 //last column (0-based)
));//合并单元格
//企业NOX总量
sheet.addMergedRegion(new CellRangeAddress(
startRow, //first row (0-based)
endRow, //last row (0-based)
7, //first column (0-based)
7 //last column (0-based)
));//合并单元格
}
}else{//两行的主项不相等时
tspTotal += Double.valueOf(bodyList.get(i-1).get(3).toString());
so2Total += Double.valueOf(bodyList.get(i-1).get(5).toString());
noxTotal += Double.valueOf(bodyList.get(i-1).get(7).toString());
if(startRow == endRow){
sheet.getRow(rowNum - 1).getCell(3).setCellValue(tspTotal);//企业TSP总量
sheet.getRow(rowNum - 1).getCell(5).setCellValue(so2Total);//企业SO2总量
sheet.getRow(rowNum - 1).getCell(7).setCellValue(noxTotal);//企业NOX总量
}else{
sheet.getRow(rowNum - (endRow - startRow) - 1).getCell(3).setCellValue(tspTotal);//企业TSP总量
sheet.getRow(rowNum - (endRow - startRow) - 1).getCell(5).setCellValue(so2Total);//企业SO2总量
sheet.getRow(rowNum - (endRow - startRow) - 1).getCell(7).setCellValue(noxTotal);//企业NOX总量
/******************************************根据计算出的开始行号和结束行号开始合并*****************************************/
//企业名称
sheet.addMergedRegion(new CellRangeAddress(
startRow, //first row (0-based)
endRow, //last row (0-based)
0, //first column (0-based)
0 //last column (0-based)
));//合并单元格
//企业TSP总量
sheet.addMergedRegion(new CellRangeAddress(
startRow, //first row (0-based)
endRow, //last row (0-based)
3, //first column (0-based)
3 //last column (0-based)
));//合并单元格
//企业SO2总量
sheet.addMergedRegion(new CellRangeAddress(
startRow, //first row (0-based)
endRow, //last row (0-based)
5, //first column (0-based)
5 //last column (0-based)
));//合并单元格
//企业NOX总量
sheet.addMergedRegion(new CellRangeAddress(
startRow, //first row (0-based)
endRow, //last row (0-based)
7, //first column (0-based)
7 //last column (0-based)
));//合并单元格
}
startRow = rowNum;//为下次合并做准备,把合并开始行号赋值为下一行开始号
endRow = rowNum;//合并结束行同合并开始行
tspTotal = 0;//为中间值初始化
so2Total = 0;
noxTotal = 0;
}
}
rowNum++;
}
sheet.setColumnWidth(0,15*2*256);//第一列宽度
sheet.setColumnWidth(1,15*2*256);//第二列宽度
sheet.autoSizeColumn((short)8); //自动列宽(第九列)
}