web-dev-qa-db-ja.com

空の行を決定する方法は?

Apache POIを使用して.xlsドキュメント内の空の行を決定するにはどうすればよいですか?

26
MyTitle

POIプロジェクトで次のメソッドを使用していますが、うまく機能しています。これはzellerのソリューションのバリエーションです。

public static boolean isRowEmpty(Row row) {
    for (int c = row.getFirstCellNum(); c < row.getLastCellNum(); c++) {
        Cell cell = row.getCell(c);
        if (cell != null && cell.getCellType() != Cell.CELL_TYPE_BLANK)
            return false;
    }
    return true;
}
30
Takaitra

行反復子は、データを含む行のみを返しますが、それらが完全に空の場合、行インデックスによる反復は、getRow(index)nullを返します

溶液:

POIバージョン3.14まで(Sergii Lisnychyiに感謝):

_private boolean checkIfRowIsEmpty(Row row) {
    if (row == null) {
        return true;
    }
    if (row.getLastCellNum() <= 0) {
        return true;
    }
    for (int cellNum = row.getFirstCellNum(); cellNum < row.getLastCellNum(); cellNum++) {
        Cell cell = row.getCell(cellNum);
        if (cell != null && cell.getCellType() != Cell.CELL_TYPE_BLANK && StringUtils.isNotBlank(cell.toString())) {
            return false;
        }
    }
    return true;
}
_

POIバージョン3.15から4.2(int getCellType()は非推奨):

_    private boolean checkIfRowIsEmpty(Row row) {
    if (row == null) {
        return true;
    }
    if (row.getLastCellNum() <= 0) {
        return true;
    }
    for (int cellNum = row.getFirstCellNum(); cellNum < row.getLastCellNum(); cellNum++) {
        Cell cell = row.getCell(cellNum);
        if (cell != null && cell.getCellTypeEnum() != CellType.BLANK && StringUtils.isNotBlank(cell.toString())) {
            return false;
        }
    }
    return true;
}
_

POIバージョン4から(CellTypeEnum getCellTypeEnum()はintではなくEnumを返します):

_private boolean checkIfRowIsEmpty(Row row) {
    if (row == null) {
        return true;
    }
    if (row.getLastCellNum() <= 0) {
        return true;
    }
    for (int cellNum = row.getFirstCellNum(); cellNum < row.getLastCellNum(); cellNum++) {
        Cell cell = row.getCell(cellNum);
        if (cell != null && cell.getCellTypeEnum() != CellType.BLANK && StringUtils.isNotBlank(cell.toString())) {
            return false;
        }
    }
    return true;
}
_
23
EpicPandaForce

行内のすべてのセルを反復処理し、それらがすべて空かどうかを確認する必要があります。私は他の解決策を知りません...

 short c;
 for (c = lastRow.getFirstCellNum(); c <= lastRow.getLastCellNum(); c++) {
     cell = lastRow.getCell(c);
     if (cell != null && lastRow.getCell(c).getCellType() != HSSFCell.CELL_TYPE_BLANK) {
          nonBlankRowFound = true;
     }
 }

コードは here から

5
zeller

はい。ただし、一部のにある場合、一部のセル = ""にあり、別のセルに空の値があります。この方法はより良く機能します:

  boolean isEmptyRow(Row row){
     boolean isEmptyRow = true;
         for(int cellNum = row.getFirstCellNum(); cellNum < row.getLastCellNum(); cellNum++){
            Cell cell = row.getCell(cellNum);
            if(cell != null && cell.getCellType() != Cell.CELL_TYPE_BLANK && StringUtils.isNotBlank(cell.toString())){
            isEmptyRow = false;
            }    
         }
     return isEmptyRow;
   }
3

nが空かどうかを確認したい場合、Apache POIの行は1ベースではなく0ベースであることを思い出して、次のようなものが必要です。

 Row r = sheet.getRow(n-1); // 2nd row = row 1
 boolean hasData = true;

 if (r == null) {
    // Row has never been used
    hasData = false;
 } else {
    // Check to see if all cells in the row are blank (empty)
    hasData = false;
    for (Cell c : r) {
       if (c.getCellType() != Cell.CELL_TYPE_BLANK) {
         hasData = true;
         break;
       }
    }
 }
2
Gagravarr
boolean isEmptyRow(Row row) {
    boolean isEmpty=true;
    String data="";
    for(Cell cell:row) {
        data=data.concat(cell.getStringCellValue());
    }
    if(!data.trim().isEmpty()) {
        isEmpty=false;
    }
    return isEmpty;
}

if(iterator.hasNext)を使用してみてください

Row nextRow = null;
Cell nextCell = null;
Iterator<Row> iterator = firstSheet.rowIterator();
if(iterator.hasNext) {
    return true;
}
else {
    return false;
}
1
beginnerCoder

Apache-poi [4+]:を使用している場合

次に、以下の方法が役立ちます。提案された他の方法がうまくいかなかったので、私はこのようにしなければなりませんでした。

_public static boolean isRowEmpty(Row row) {
    boolean isEmpty = true;
    DataFormatter dataFormatter = new DataFormatter();
    if(row != null) {
        for(Cell cell: row) {
            if(dataFormatter.formatCellValue(cell).trim().length() > 0) {
                isEmpty = false;
                break;
            }
        }
    }
    return isEmpty;
}
_

メソッドdataFormatter.formatCellValue(cell)は、セルがnullまたはBLANKの場合、_""_、_empty / ZERO length string_を返します。

参照用のインポートステートメント:

_import org.Apache.poi.ss.usermodel.DataFormatter;
import org.Apache.poi.ss.usermodel.Sheet;
import org.Apache.poi.ss.usermodel.Row;
import org.Apache.poi.ss.usermodel.Cell;
_

お役に立てれば!

1
snmaddula

cellReferenceのインスタンスを取得し、インスタンスでformatAsString()を使用します。空の文字列と比較します

`

if("".equals(cellRef.formatAsString())){
     System.out.println("this is an empty cell");
   }else{
      System.out.println("Cell value : "+cellRef.formatAsString());
   }

`参照: http://www.javabeat.net/2007/10/Apache-poi-reading-Excel-sheet-using-Java/

0
Preet