2017-03-02 278 views
0

我正在尝试使用Apache POI读取Excel文件。我的问题是试图读取一系列行作为合并单元格,考虑到此合并包含的行数是任意的。使用Apache POI从Excel中读取由一系列合并单元格索引的多行

这张照片

enter image description here

可能是一个适当的例子,我希望。在这种情况下,我不能想出一个函数来通过属性的所有行,并在到达外键行时停止。合并单元格中的“属性”字符串包含在合并单元格的第一行中。

感谢您的帮助!

回答

2

合并区域中的所有单元格都出现在电子表格XML中,并且可以读取行和单元格,但是它们的单元格类型在XML中缺失。单元格类型为Cell.CELL_TYPE_BLANK。这可能是由于其他原因导致的,但仅仅查找Cell.CELL_TYPE_BLANK还不够,还需要检查单元是否位于工作表中的某个合并区域内。像这样:

public static CellRangeAddress getMergedRegion(Cell cell) { 
    Sheet sheet = cell.getSheet(); 
    for (CellRangeAddress range : sheet.getMergedRegions()) { 
     if (range.isInRange(cell.getRowIndex(), cell.getColumnIndex())) { 
      return range; 
     } 
    } 
    return null; 
} 

这将返回包含该单元的CellRangeAddress对象,或返回null。然后,您可以使用

Sheet sheet = wb.getSheetAt(0); 
for (Row row : sheet) { 
    for (Cell cell : row) { 
     if (cell.getCellType() == Cell.CELL_TYPE_BLANK) { 
      CellRangeAddress range = getMergedRegion(cell); 
      if (range != null) { 
       Cell mergeValue = sheet.getRow(range.getFirstRow()).getCell(range.getFirstColumn()); 
       System.out.println("Cell " + cell.getAddress() + ": " + "merged cell (" + 
        range.formatAsString() + ") " + mergeValue.getStringCellValue()); 
      } else { 
       System.out.println("Cell " + cell.getAddress() + ": " + "blank"); 
      } 
     } else if (cell.getCellType() == Cell.CELL_TYPE_STRING) { 
      System.out.println("Cell " + cell.getAddress() + ": " + cell.getStringCellValue());     
     } 
    } 
} 

以获取工作表中单元格中的值。您可能需要处理数字或布尔单元格,这些在我的示例中未显示。

0

你到底在挣扎着什么?如果您需要阅读合并单元格的内容,则可能需要检查this thread。如果您的问题是“如何确定行中存在合并区域(例如您的”Checks“--Row),那么您不会在解析器中添加某种”洞察“ - 逻辑,例如”if col A =='Checks',然后阅读col C“

相关问题