在Apache POI中处理excel文件时,我注意到它会跳过某些空行。经过大量的反复试验后,我注意到Apache POI只能读取其单元格已经更新过的那些行。
我编写了一个简短的程序来读取XLSX(XSSF模型)文件中的行是否为空。这是我的输入excel文件:
private static boolean isRowEmpty(Row row) {
boolean isRowEmpty = true;
if (row != null) {
for (Cell cell : row) {
if (cell != null) {
System.out.println("Row:" + cell.getRowIndex() + " Col:"
+ cell.getColumnIndex() + " Len:"
+ cell.toString().length());
isRowEmpty = false;
} else {
System.out.println("Cell is Null at Row "+row.getRowNum());
}
}
} else {
System.out.println("Row is Null");
}
return isRowEmpty;
}
for (Row row : sheet) {
if (isRowEmpty(row)) {
System.out.println("Empty row at " + row.getRowNum());
}
}
输出
Row:0 Col:0 Len:1
Row:2 Col:0 Len:1
Row:3 Col:0 Len:1
Row:4 Col:0 Len:1
Row:5 Col:0 Len:1
Row:6 Col:1 Len:1
Row:7 Col:0 Len:1
Row:8 Col:2 Len:1
在单元格A5
中,我输入了一个空间,由Apache POI检测到。从输出中可以看出,它不处理第2行(rownum 1)。
是否有任何解决方法,以便它提供以下输出:
Row:0 Col:0 Len:1
Empty Row at 1
Row:2 Col:0 Len:1
Row:3 Col:0 Len:1
Empty Row at 4
Row:5 Col:0 Len:1
Row:6 Col:1 Len:1
Row:7 Col:0 Len:1
Row:8 Col:2 Len:1
谢谢!
更新1
使用(cell != null && StringUtils.isNotBlank(cell.toString()))
代替(cell != null)
会给我以下输出:
Row:0 Col:0 Len:1
Row:2 Col:0 Len:1
Row:3 Col:0 Len:1
Cell is Null for Row 4
Empty row at 4
Row:5 Col:0 Len:1
Row:6 Col:1 Len:1
Row:7 Col:0 Len:1
Row:8 Col:2 Len:1
答案 0 :(得分:0)
这完全符合预期,explained in the documentation!
迭代器可以让生活更轻松地抓取包含内容的行和单元格(以及Excel随机仍包含在文件中的其他几个......)。
如果你想获取每一行和单元格,无论它们是否被定义,那么你需要遵循advice in the documentation并逐行和单元格编号,例如
// Decide which rows to process
int rowStart = Math.min(15, sheet.getFirstRowNum());
int rowEnd = Math.max(1400, sheet.getLastRowNum());
for (int rowNum = rowStart; rowNum < rowEnd; rowNum++) {
Row r = sheet.getRow(rowNum);
if (r == null) {
// Handle there being no cells defined for this row
continue;
}
// Decide how many columns to fetch for this row
int lastColumn = Math.max(r.getLastCellNum(), MY_MINIMUM_COLUMN_COUNT);
for (int cn = 0; cn < lastColumn; cn++) {
Cell c = r.getCell(cn, Row.RETURN_BLANK_AS_NULL);
if (c == null) {
// The spreadsheet is empty in this cell
} else {
// Do something useful with the cell's contents
}
}
}