【问题标题】:How to get data of the merged cell given a cell indexes in java?java - 如何在给定单元格索引的情况下获取合并单元格的数据?
【发布时间】:2016-01-25 14:15:54
【问题描述】:

我有一个 excel 文件,我正在使用 apache-poi 获取 excel 文件的数据,所以如果我读取任何单元格值,那么如何知道单元格是否是合并单元格并获取合并单元格的值

所以我想知道一个单元格是否是一个合并单元格,如果它是一个合并单元格,我将尝试获取第一行的值和合并单元格的第一个冒号值,如果它不是合并单元格,那么我会直接获取value的数据

喜欢

String var = String.valueOf(sheet.getRow(Row).getCell(Cell));

【问题讨论】:

    标签: java excel merge apache-poi import-from-excel


    【解决方案1】:

    您可以使用Sheet.getMergedRegions() 来确定合并单元格的所有范围。然后您可以在返回的范围上使用CellRangeAddress.isInRange(row,column) 来检查有问题的单元格是否为合并单元格。

    public boolean isMergedCell(int row, int column) {
        for (CellRangeAddress range : sheet.getMergedRegions()) {
            if (range.isInRange(row, column)) {
                return true;
            }
        }
    
        return false;
    }
    

    【讨论】:

    • 它给了我区域,但是如果我给一个单元格它会告诉我它是一个合并的单元格
    • 是否有任何方法可以将输入作为单元格的索引(行号,列号)并返回是否为合并单元格
    • 这样的方法你可以自己轻松写,如上图。
    • 为什么不使用CellRangeAddress.isInRange(row,column) 来检查单元格是否在合并区域中?
    • @Gagravarr 谢谢!我相应地更新了答案。
    【解决方案2】:

    你需要的两个关键方法:

    您的代码将类似于:

    public CellRangeAddress getMergedRegionForCell(Cell c) {
       Sheet s = c.getRow().getSheet();
       for (CellRangeAddress mergedRegion : s.getMergedRegions()) {
          if (mergedRegion.isInRange(c.getRowIndex(), c.getColumnIndex())) {
             // This region contains the cell in question
             return mergedRegion;
          }
       }
       // Not in any
       return null;
    }
    

    然后检查你是否得到null,如果没有读取该区域的第一行和第一列以了解包含您感兴趣的单元格的区域的左上角单元格

    【讨论】:

      【解决方案3】:

      这是我的代码 (Kotlin),关于如何将 excel 单元格数据作为字符串获取,同时考虑到单元格可能被合并。我使用此代码将 excel 数据加载到数据库中。

      fun getCellStr(sheet: XSSFSheet, cell: Cell): String {
          var res = ""
          val formatter = DataFormatter()
          var inRange = false
          for (range in sheet.getMergedRegions()) {
              if (range.isInRange(cell.rowIndex, cell.columnIndex)) {
                  for (rIndex in range.firstRow..range.lastRow) {
                      for (cIndex in range.firstColumn..range.lastColumn) {
                          res = "$res${formatter.formatCellValue(sheet.getRow(rIndex).getCell(cIndex))}"
                      }
                  }
                  inRange = true
              }
          }
          if (!inRange) {
              res = formatter.formatCellValue(cell)
          }
          return res.trim()
      }
      

      【讨论】:

        猜你喜欢
        • 2018-03-13
        • 2013-10-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-06-16
        • 2013-06-03
        • 1970-01-01
        相关资源
        最近更新 更多