java poi Excel循环合并行

//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<List<String>> bodyList = (List<List<String>>) 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<bodyList.size();i++){
				int bodyline = 0;
				HSSFRow row = sheet.createRow(rowNum);
					for(int j = 0;j<bodyList.get(i).size();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); //自动列宽(第九列)
		}

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值