2017-03-02 11 views
0

Apache POIを使用してExcelファイルを読み込もうとしています。私の問題は、このマージに含まれる行の数は任意であることを考慮に入れて、マージされたセルとして一連の行を読み込もうとしています。Apache POIを使用してExcelから一連の結合されたセルによってインデックスされた複数の行を読み込みます。

この絵

enter image description here

十分な例かもしれないが、私は願っています。この場合、アトリビュートであるすべての行を処理し、外部キーの行に到達すると停止する関数を思いつくことはできません。マージされたセルの「属性」文字列は、マージされたセルの最初の行に含まれています。

ありがとうございました!

答えて

2

マージされた領域内のすべてのセルがスプレッドシートXMLに表示され、行とセルを読み取ることができます。セルタイプがCell.CELL_TYPE_BLANKに戻りますが、これは他のものによって引き起こされる可能性がありますが、Cell.CELL_TYPE_BLANKを探すだけでは不十分です。また、セルがシートのマージ領域の1つに含まれるかどうかを確認する必要があります。このように:

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 if col A == 'Checks'してからcol Cを読み取る "

関連する問題