我是靠谱客的博主 明理草丛,最近开发中收集的这篇文章主要介绍poi 导出excel表格时 ,合并单元格(根据相同列值),觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

效果如上
不多说 ,直接上代码

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表格时 ,合并单元格(根据相同列值)所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(51)

评论列表共有 0 条评论

立即
投稿
返回
顶部