java合并sheet行_java poi Excel循环合并行

这篇博客介绍了如何使用Java的POI库来处理Excel,实现循环检查并合并具有相同企业名的行。通过计算每个企业的TSP、SO2和NOX总量,将这些值放在合并后的单元格中,从而达到数据整理和汇总的目的。
摘要由CSDN通过智能技术生成

//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); //自动列宽(第九列)

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值