Comment puis-je déterminer les lignes vides dans les documents .xls à l'aide d'un POI Apache?
J'utilise la méthode suivante dans mon projet de POI et cela fonctionne bien. C'est une variante de la solution de 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;
}
L'itérateur de ligne ne renvoie que les lignes contenant des données. Toutefois, si elles sont complètement vides, puis itératives par index de ligne, getRow(index)
renvoie null
.
Solution:
Jusqu’à la version 3.14 de POI (merci à 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;
}
De POI version 3.15 à 4.2 (int getCellType()
est obsolète):
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;
}
A partir de la version 4 de POI (CellTypeEnum getCellTypeEnum()
renverra le Enum not int):
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;
}
Vous devez parcourir toutes les cellules de la ligne et vérifier si elles sont toutes vides. Je ne connais pas d'autre solution ...
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;
}
}
Le code est de ici
Oui, mais si dans row nous aurons dans cell = "" et des valeurs vides dans d'autres cellules. Cette méthode fonctionnera mieux:
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;
}
En supposant que vous souhaitiez vérifier si la ligne n
est vide, en gardant à l'esprit que les lignes des points d'intérêt Apache sont à zéro et non à base unique, vous souhaiterez probablement:
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;
}
}
}
essayez d'utiliser if (iterator.hasNext)
Row nextRow = null;
Cell nextCell = null;
Iterator<Row> iterator = firstSheet.rowIterator();
if(iterator.hasNext) {
return true;
}
else {
return false;
}
Si vous utilisez Apache-poi [4+]:
Ensuite, la méthode ci-dessous fonctionne pour vous. Comme les autres méthodes suggérées ne fonctionnaient pas pour moi, je devais le faire de cette façon.
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;
}
La méthode dataFormatter.formatCellValue(cell)
renverrait ""
, un empty / ZERO length string
lorsque la cellule est null
ou BLANK
.
Les déclarations d'importation pour votre référence:
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;
J'espère que cela t'aides!
récupérez l'instance de CellReference et utilisez formatAsString () sur l'instance. comparer avec une chaîne vide
`
if("".equals(cellRef.formatAsString())){
System.out.println("this is an empty cell");
}else{
System.out.println("Cell value : "+cellRef.formatAsString());
}
`.__ Référence: http://www.javabeat.net/2007/10/Apache-poi-reading-Excel-sheet-using-Java/