Wie kann ich leere Zeilen in XLS-Dokumenten mit Apache POI ermitteln?Wie wird eine leere Zeile ermittelt?
Antwort
Sie müssen durch alle Zellen in der Zeile iterieren und prüfen, ob sie alle leer sind. Ich kenne keine andere Lösung ...
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;
}
}
Der Code ist von here
die Instanz von Cellreference bekommen und formatAsString() auf der Instanz. vergleichen Sie es mit einem leeren String
`
if("".equals(cellRef.formatAsString())){
System.out.println("this is an empty cell");
}else{
System.out.println("Cell value : "+cellRef.formatAsString());
}
` Referenz: http://www.javabeat.net/2007/10/apache-poi-reading-excel-sheet-using-java/
Angenommen, Sie, wenn Zeile n
überprüfen möchten leer ist, nicht vergessen, dass Zeilen in Apache POI Null basiert nicht eine Basis Sie möchten etwas wie:
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;
}
}
}
Ich verwende die folgende Methode in meinem POI-Projekt und es ist gut arbeiten. Es ist eine Variation von Zellers Lösung.
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;
}
Ja, aber wenn in einigen Reihe werden wir in einigen Zelle = "" und leere Werte in anderen Zellen haben. Diese Methode wird eine bessere Arbeit sein:
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;
}
Die Zeile Iterator gibt nur die Zeilen, die Daten enthalten, aber wenn sie ganz leer sind dann Iterieren durch Zeilenindex, getRow(index)
kehrt null
Lösung:
Bis zu POI Version 3.14 (Danke an 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;
}
Von POI Version 3,15-4,2 (int getCellType()
ist veraltet):
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;
}
Von POI Version 4 (CellTypeEnum getCellType()
die Enum nicht int zurück):
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() != CellType.BLANK && StringUtils.isNotBlank(cell.toString())) {
return false;
}
}
return true;
}
versuchen Sie es mit if (iterator.hasNext)
Row nextRow = null;
Cell nextCell = null;
Iterator<Row> iterator = firstSheet.rowIterator();
if(iterator.hasNext) {
return true;
}
else {
return false;
}
Ich habe das gleiche Stück Code verwendet, aber es gibt false für Zellenwert leer. Wenn ich überprüfe, ob (cell.getStringCellValue! = Null && cell.getNumericValue! = Null) funktioniert es für String-Wert, aber für BigDecimal-Wert gibt es IllegalStateException zurück: Kann Text nicht in numerischen Wert konvertieren. Können Sie mir vorschlagen, wie iSRowEmpty behandelt wird, um für die leere Zeile "True" zurückzugeben? – Harleen
Und was, wenn Zelltyp von Formel ist? –