我正在使用 APACHE POI 库读取 xlsx 格式的 excel 文件。
我的问题是我想从这个Excel的每张表中删除最后一行,我找到了一种方法来找到要删除的最后一行,但它返回一个int。方法sheet.removeRow(Row var1);可以解决我的问题。
嗯,有我想要删除的行号和删除该行的方法。我只需要将lastRow (int) 转换为Row 类型,这样我就可以使用sheet.removeRow 方法。
为此,我使用了以下代码: Row a =sheet.getRow(lastRow) 此方法应返回具有该索引的行。但它却返回 NULL。
知道我做错了什么或者如何将我想要删除的行号转换为 Row 类型吗?
感谢您的帮助!
这是读取我的 Excel 文件的代码摘录
public static List<Measure> excelToMeasures(InputStream is, ProjectMeasureFile projectMeasureFile) throws IOException {
List<Measure> measures = new ArrayList<>();
try (Workbook workbook = new XSSFWorkbook(is)) {
for (int i = 0; i < 3; i++) {
Sheet sheet = workbook.getSheetAt(i);
int lastRow = sheet.getPhysicalNumberOfRows() -1;
removeRow(sheet, lastRow);
int rowNumber = 0;
for (Row row : sheet) {
// skip header
if (rowNumber == 0) {
rowNumber++;
continue;
}
Iterator<Cell> cellIterator = row.iterator();
List<Cell> cellObject = new ArrayList<>();
while (cellIterator.hasNext()) {
cellObject.add(cellIterator.next());
}
if (cellObject.size() > 0) {
Measure measure = new Measure();
measure.setArea(sheet.getSheetName());
measure.setCode(convertStringCell(cellObject.get(0)));
measure.setBehavior(convertStringCell(cellObject.get(1)));
measure.setHumanDependencyFactor(convertNumericCell(cellObject.get(2)));
Double measureType = convertToPercentage(measure.getHumanDependencyFactor());
measure.setHumanDependencyFactor(measureType);
measure.setMeasurementResults(convertNumericCell(cellObject.get(3)));
Double value = convertToPercentage(measure.getMeasurementResults());
measure.setMeasurementResults(value);
measure.setProjectMeasureFile(projectMeasureFile);
measures.add(measure);
}
rowNumber++;
}
}
} catch (Exception e) {
log.error("An error occurred when trying to parse the file.");
e.printStackTrace();
}
return measures;
}
这是删除行的方法:
public static void removeRow(Sheet sheet, int rowIndex) {
int lastRowNum = sheet.getPhysicalNumberOfRows() -1;
if (rowIndex == lastRowNum) {
Row removingRow = sheet.getRow(rowIndex);
sheet.getRow(rowIndex);
Row a = sheet.getRow(rowIndex);
if (removingRow != null) {
System.out.println(sheet.getRow(lastRowNum).getCell(0).toString());
sheet.removeRow(removingRow);
}
}
}
首先到你的问题的标题:
Sheet.getRow
将按设计返回NULL
。如果行索引后面的行未存储在工作表中,则返回 NULL
。因此,您始终需要在 NULL
之后检查 Sheet.getRow
。 Row.getCell
也是如此,对于未存储在行中的单元格,它会返回 NULL
。
并且
Sheet.getPhysicalNumberOfRows
不是获取工作表最后一行的正确方法。
Excel
工作表仅在物理上包含存储有单元格的行。完全空的行不会被物理存储。因此,如果工作表仅包含第 1、2、5、6 和 7 行中的数据,则 Sheet.getPhysicalNumberOfRows
将返回 5,但最后一行是 7。
有
Sheet.getLastRowNum
可以获取工作表中的最后一行号(从 0 开始)。因此,在上面的示例中将返回 6,并且 sheet.getRow(6)
将获得最后一行,而不是 NULL
。
但是还有一个问题需要考虑。在
Excel
中,行可能不是完全空的,而是仅包含空白单元格。空白单元格可能会被存储,因为它们具有单元格格式或之前有内容。 Sheet.getLastRowNum
获取最后一个 stored 行,即使该行仅包含空白单元格。因此,您需要通过迭代单元格来检查 Sheet.getLastRowNum
后面的行是否仅包含空白单元格,并检查 CellType.BLANK
如果您需要最后一个 filled 行。
以下方法获取工作表中最后填充的行。如果未找到填充行,则返回
NULL
。
Row getLastFilledRow(Sheet sheet) {
int lastStoredRowNum = sheet.getLastRowNum();
for (int r = lastStoredRowNum; r >= 0; r--) {
Row row = sheet.getRow(r);
if (row != null) {
for (Cell cell : row) {
if (cell.getCellType() != CellType.BLANK) return row;
}
}
}
return null;
}
我遇到了这个问题。我使用 XSSFWorkbook 而不是 SXSSFWorkbook 作为解决方案。
final XSSFWorkbook workbook = new XSSFWorkbook(inputStream);