概述
不多说 ,直接上代码
package com.aheadbiotech.cms.modular.util.excel;
import com.aheadbiotech.cms.modular.util.excel.model.MergeRecord;
import org.apache.commons.lang3.StringUtils;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.ss.util.CellRangeAddress;
import java.util.ArrayList;
import java.util.List;
public class ExcelUtil {
// needMergeColName:需要合并的列名集合 startMergeRowNum: 需要从哪一行开始合并
public static Workbook mergeSameCell(Workbook workbook , List<String> needMergeColName , Integer startMergeRowNum){
List<MergeRecord> mergeRecords = new ArrayList<>();
List<Integer> needMergeColNum = new ArrayList<>();
Sheet sheet = workbook.getSheetAt(0);
if(workbook != null && needMergeColName != null){
// 遍历获取所有相同单元格 , 并记录
// 遍历表头 ,获取需要合并的 colnum ,
Row firstRow = sheet.getRow(0);
if (firstRow != null) {
// 找出所有需要合并单元格的列号
for (String needName : needMergeColName) {
for (int i = 0; i < firstRow.getLastCellNum(); i++) {
String cellContent = firstRow.getCell(i).getStringCellValue();
if (StringUtils.isNotEmpty(cellContent)) {
if (cellContent.equals(needName)) {
needMergeColNum.add(i);
break;
}
}
}
}
}
// 找出所有需要合并的单元格
for(Integer needCol : needMergeColNum){
Integer allRows = sheet.getLastRowNum();
String sameContent = null;
Integer firstRowNum = null ;
Integer lastRowNum = null;
Integer firstColNum = null;
Integer lastColNum = null;
MergeRecord mergeRecord = null;
for(int rowNum = startMergeRowNum ; rowNum < allRows + 1 ; rowNum ++){
// 如果本行与下一行的值一样 ,则需要新建一个合并区域
Row row = sheet.getRow(rowNum);
Row nextRow = sheet.getRow(rowNum + 1);
String cellVal = row.getCell(needCol).getStringCellValue();
String nextCellVal = null;
if(nextRow != null){
nextCellVal = nextRow.getCell(needCol).getStringCellValue();
}
// 如果当行值等于相同值的话 ,合并行加1
if(sameContent != null && sameContent.equals(nextCellVal)){
lastRowNum = rowNum + 1;
continue;
}
// 如果下一行的值与当前值不相同 或者已经到最后一行,那么结束本次的合并单元格任务
if(((sameContent != null && !sameContent.equals(nextCellVal))) || (nextRow == null && sameContent != null)){
mergeRecord = new MergeRecord();
mergeRecord.setMergeContent(sameContent);
mergeRecord.setCulomnNum(needCol);
mergeRecord.setFirstRow(firstRowNum);
mergeRecord.setLastRow(lastRowNum);
mergeRecord.setFirstCol(firstColNum);
mergeRecord.setLastCol(lastColNum);
mergeRecords.add(mergeRecord);
// 将相同内容置空 ,并寻找下一个需要合并的单元格
sameContent = null;
}
// 如果第一次两个值一样的话
if(cellVal.equals(nextCellVal)){
sameContent = cellVal ;
firstRowNum = rowNum ;
lastRowNum = rowNum + 1;
firstColNum = needCol;
lastColNum = needCol;
}
}
}
}
// 找完所有的单元格后 ,开始合并
for(MergeRecord mergeRecord : mergeRecords){
sheet.addMergedRegion(new CellRangeAddress(mergeRecord.getFirstRow(), mergeRecord.getLastRow(), mergeRecord.getFirstCol(), mergeRecord.getLastCol()));
}
return workbook;
}
// list 的第一个为需要做合并判断逻辑的 , list中其他的合并逻辑跟第一个相同
public static Workbook mergeSameCellByMainCol(Workbook workbook , List<String> needMergeColName , Integer startMergeRowNum){
List<MergeRecord> mergeRecords = new ArrayList<>();
List<Integer> needMergeColNum = new ArrayList<>();
Sheet sheet = workbook.getSheetAt(0);
if(workbook != null && needMergeColName != null){
// 遍历获取所有相同单元格 , 并记录
// 遍历表头 ,获取需要合并的 colnum ,
Row firstRow = sheet.getRow(0);
if (firstRow != null) {
// 找出所有需要合并单元格的列号
for (String needName : needMergeColName) {
for (int i = 0; i < firstRow.getLastCellNum(); i++) {
String cellContent = firstRow.getCell(i).getStringCellValue();
if (StringUtils.isNotEmpty(cellContent)) {
if (cellContent.equals(needName)) {
needMergeColNum.add(i);
break;
}
}
}
}
}
// 找出所有需要合并的单元格
Integer needCol = needMergeColNum.get(0);
Integer allRows = sheet.getLastRowNum();
String sameContent = null;
Integer firstRowNum = null ;
Integer lastRowNum = null;
Integer firstColNum = null;
Integer lastColNum = null;
MergeRecord mergeRecord = null;
for(int rowNum = startMergeRowNum ; rowNum < allRows + 1 ; rowNum ++){
// 如果本行与下一行的值一样 ,则需要新建一个合并区域
Row row = sheet.getRow(rowNum);
Row nextRow = sheet.getRow(rowNum + 1);
String cellVal = row.getCell(needCol).getStringCellValue();
String nextCellVal = null;
if(nextRow != null){
nextCellVal = nextRow.getCell(needCol).getStringCellValue();
}
// 如果当行值等于相同值的话 ,合并行加1
if(sameContent != null && sameContent.equals(nextCellVal)){
lastRowNum = rowNum + 1;
continue;
}
// 如果下一行的值与当前值不相同 或者已经到最后一行,那么结束本次的合并单元格任务
if(((sameContent != null && !sameContent.equals(nextCellVal))) || (nextRow == null && sameContent != null)){
mergeRecord = new MergeRecord();
mergeRecord.setMergeContent(sameContent);
mergeRecord.setCulomnNum(needCol);
mergeRecord.setFirstRow(firstRowNum);
mergeRecord.setLastRow(lastRowNum);
mergeRecord.setFirstCol(firstColNum);
mergeRecord.setLastCol(lastColNum);
mergeRecords.add(mergeRecord);
// 将相同内容置空 ,并寻找下一个需要合并的单元格
sameContent = null;
}
// 如果第一次两个值一样的话
if(cellVal.equals(nextCellVal)){
sameContent = cellVal ;
firstRowNum = rowNum ;
lastRowNum = rowNum + 1;
firstColNum = needCol;
lastColNum = needCol;
}
}
// 其他列的合并情况跟第一列都一样
List<MergeRecord> lastAll = new ArrayList<>();
for(int i = 1 ; i < needMergeColNum.size() ; i++){
List<MergeRecord> tempList = new ArrayList<>();
for(MergeRecord record : mergeRecords){
MergeRecord mergeRecord1 = new MergeRecord();
mergeRecord1.setFirstRow(record.getFirstRow());
mergeRecord1.setLastRow(record.getLastRow());
mergeRecord1.setFirstCol(needMergeColNum.get(i));
mergeRecord1.setLastCol(needMergeColNum.get(i));
tempList.add(mergeRecord1);
}
lastAll.addAll(tempList);
}
mergeRecords.addAll(lastAll);
}
// 找完所有的单元格后 ,开始合并
for(MergeRecord mergeRecord : mergeRecords){
sheet.addMergedRegion(new CellRangeAddress(mergeRecord.getFirstRow(), mergeRecord.getLastRow(), mergeRecord.getFirstCol(), mergeRecord.getLastCol()));
}
return workbook;
}
}
使用方法
//合并单元格需要的逻辑
String[] names = {"医生用户" , "医生姓名" ,"当前使用设备号" , "历史使用设备数" , "备注" , "创建时间" };
List<String> needColNames = Arrays.asList(names);
ExcelUtil.mergeSameCellByMainCol(workbook , needColNames , 2);```
第二个参数为需要合并的列名称 , 第三个参数为需要从第几行开始合并单元格
最后
以上就是明理草丛为你收集整理的poi 导出excel表格时 ,合并单元格(根据相同列值)的全部内容,希望文章能够帮你解决poi 导出excel表格时 ,合并单元格(根据相同列值)所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复