处理excel中的合并单元格问题

需求

如图所示

在T列中有合并单元格和非合并单元格,由于需要将合并单元格的数据也插入到数据库中,需要达到的效果如下

原来是

现在需要变成

需要我们将合并的单元格进行拆分,然后再相对应的赋值上去

思路

  1. 读取excel的每行数据
  2. 如果碰到合并单元格就判断 如果是一个单元格 除了第一行有数据其他为空 那这个就是我们要处理的数据

代码实现

本需求是在SpringBoot 2.5下完成的实现

先提供两个方法,一个是判断合并单元格,拆分的格子是否是null,另一个是拆分了单元格之后,除了第一行有数据,其他行是否为null

/** 
* 判断是否为合并单元格,且拆开该合并后除队一行有数据其他为null 
* @param sheet 工作表 
* @param rowIndex 索引行 
* @param columnIndex 索引列 
* @return 满足条件返回true 
*/
public static boolean isMergedEmptyCell(Sheet sheet, int rowIndex, int columnIndex) {
    int numMergedRegions = sheet.getNumMergedRegions();
    for (int i = 0; i < numMergedRegions; i++) {
        CellRangeAddress mergedRegion = sheet.getMergedRegion(i);
        if (mergedRegion != null && mergedRegion.isInRange(rowIndex - 1, columnIndex)) {
            Row firstRow = sheet.getRow(mergedRegion.getFirstRow());
            if (firstRow != null && isCellEmpty(firstRow.getCell(mergedRegion.getFirstColumn()))) {
                for (int r = mergedRegion.getFirstRow() + 1; r <= mergedRegion.getLastRow(); r++) {
                    Row mergedRow = sheet.getRow(r);
                    if (mergedRow != null && isCellEmpty(mergedRow.getCell(mergedRegion.getFirstColumn()))) {
                        return false;
                    }
                }
                return true;
            }
        }
    }
    return false;
}

/** 
* 判断单元格是否为null 
* @param cell 单元格 
* @return true为null 
*/
public static boolean isCellEmpty(Cell cell) {
    if (cell == null || cell.getCellType() == CellType.BLANK) {
        return false;
    } else if (cell.getCellType() == CellType.STRING && cell.getStringCellValue().trim().isEmpty()) {
        return false;
    }
    return true;
}

写一个导入方法

/**
* 注意:以下用字段就是指列的值
*
*
*/
private static List<Template> readTemplateSheet2(Sheet sheet) {
        Map<Integer, String> cache = new HashMap<>();
        int lineNumber = 1;
        String stype = "";
        String priority = "";
        String comment = "";
        String type = sheet.getSheetName().trim();
        int currentRow = 0;// 当前行        
        try {
            Kv kv = new Kv();
            List<Template> recordList = new ArrayList<>();
            int count = 0;
            for (Row row : sheet) {
                currentRow++;
                try {
                    count++;
                    if (count < 3) {

                        for (int i = 0; i < row.getLastCellNum(); i++) {
                            Cell cell = row.getCell(i);
                            String label = cell == null ? null : getCellStringValue(cell);
                            if (!StringUtils.isEmpty(label)) {
                                kv.set(row.getCell(i).toString().trim(), i);
                            }
                        }

                        continue;
                    }

                    if (!kv.containsKey("命名规范示例") && !kv.containsKey("规范信息")) {
                        return Collections.emptyList();
                    }

                    String signal;
                    String signalkey = "命名规范示例";
                    if (kv.containsKey("规范信息")) {
                        signalkey = "规范信息";
                    }

                    signal = getCellValue(sheet, row, kv.getInt(signalkey));
                    if (StringUtils.isEmpty(signal)) {
                        continue;
                    }
                    Template template = new Template();
                    template.setContent(signal);
                    template.setVoltage(extractString(type));
                    template.setDevType2(type);
                    template.setStype(getCellValue(sheet, row, kv.getInt("字段1")));
                    template.setIsReal(cellToInteger(getCellValue(sheet, row, kv.getInt("字段2"))));
                    template.setIsFault(cellToInteger(getCellValue(sheet, row, kv.getInt("字段3"))));
                    template.setIsException(cellToInteger(getCellValue(sheet, row, kv.getInt("字段4"))));
                    template.setIsNotify(cellToInteger(getCellValue(sheet, row, kv.getInt("字段5"))));
                    template.setIsBoard(cellToInteger(getCellValue(sheet, row, kv.getInt("字段6"))));
                    template.setIsVoice(cellToInteger(getCellValue(sheet, row, kv.getInt("字段7"))));
                    template.setStatus(cellToInteger(getCellValue(sheet, row, kv.getInt("字段8"))));
                    template.setIsNecessary(cellToInteger(getCellValue(sheet, row, kv.getInt("字段9"))));
                    template.setIsMerge(cellToInteger(getCellValue(sheet, row, kv.getInt("字段10"))));
                    template.setMatchThreshold(getCellDoubleValue(row, kv.getInt("字段11")));
                    // 报错情况 priority读到null 会读到double类型 会读到“—”                    priority = String.valueOf(getCellValue(sheet, row, kv.getInt("字段12")));
                    if (priority.contains("—")) {
                        Template template1 = recordList.get(currentRow - 4);
                        priority = String.valueOf(template1.getPriority());
                    } else if (priority.isEmpty()) {
                        priority = cache.getOrDefault(lineNumber, "0");
                    } else {
                        priority = priority.replace(".0", "");
                        cache.put(lineNumber, priority);
                    }
                    template.setPriority(Integer.parseInt(priority));
//                    template.setPriority(Integer.valueOf(getCellValue(sheet, row, kv.getInt("字段13"))));//                    template.setComment(getCellValue(sheet, row, kv.getInt("字段14")));                    // 处理字段列                    comment = getCellValue(sheet, row, kv.getInt("字段14"));
                    if (!"".equals(comment)){
                        cache.put(lineNumber + 1,comment);
                    }
                    if (isMergedEmptyCell(sheet,count,kv.getInt("备注"))){
                        comment = cache.get(lineNumber + 1);
                        template.setComment(comment);
                    } else {
                        template.setComment(comment);
                    }

                    stype = template.getStype();
                    if (stype.isEmpty()) {
                        // 说明该列读到了null或空字符串                        stype = cache.getOrDefault(lineNumber + 2, "");
                    } else {
                        cache.put(lineNumber + 2, stype);
                    }
                    template.setStype(stype);

                    recordList.add(template);
                } catch (Exception e) {
                    e.printStackTrace();
                }

            }
            return recordList;

        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

最后写一个api接口测试看看

@PostMapping("/import/data/new")
@ApiOperation("导入规范库列表 新2023-7-4")
@ApiOperationSupport(order = 13)
public R importDataNew(@RequestParam("file") MultipartFile file) {
    signalTemplateService.importDataNew(file);
    return R.success();
}

搞定

本篇文章如有疑问欢迎评论讨论,作者会在第一时间看到问题之后回复,很少发帖,如有不足或错误之处,希望大家多多海涵,感谢!

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值