gpt4 book ai didi

java - Apache POI : Check if a column is empty

转载 作者:行者123 更新时间:2023-11-30 02:52:31 24 4
gpt4 key购买 nike

我需要检查 .xlsx 文件中的列是否为空,但找不到比这更平滑的内容:

    public static boolean isColumnEmpty(int column, int firstRow, XSSFSheet sheet) {


XSSFRow row = sheet.getRow(firstRow);

while (row != null) {
Cell c = row.getCell(column, Row.RETURN_BLANK_AS_NULL);
if (c != null) {
return false;
}
row = sheet.getRow(firstRow++);
}
return true;

}

firstRow 只是您想要开始的行(实际上我的列并不完全为空,仍然有一个标题)。

我想知道你们中的一些人是否有更好的想法!

最佳答案

答案因工作表中物理行的稀疏程度、您对简单代码的渴望以及您对执行速度的关心程度而异。

三者的良好折衷只会循环物理行,并且只要startRow就可以很好地执行更接近 getFirstRowNum()getLastRowNum() .

public static boolean isColumnEmpty(Sheet sheet, int columnIndex, int startRow) {
for (Row row : sheet) {
if (row.getRowNum() < startRow) continue;
Cell cell = row.getCell(columnIndex, Row.RETURN_BLANK_AS_NULL);
if (cell != null) {
return false;
}
}
return true;
}

对于行密集的工作簿,您的代码更好。

对于工作最少的代码,您可以结合这两种方法(我更喜欢 for -loops 而不是 while -loops,因为它可以更快地验证您的代码不会陷入无限循环)

public static boolean isColumnEmpty(Sheet sheet, int columnIndex, int startRow) {
int firstRow = sheet.getFirstRowNum();
int lastRow = sheet.getLastRowNum();
// No need to check rows above the first row
startRow = Math.max(startRow, firstRow);
int numRows = sheet.getPhysicalNumberOfRows();

// Compute an estimate of the number of rows that each method
// will access.
// Assume the cost to access one row is the same
// between an explicit getRow() or through the rowIterator.
// Assume physical rows are uniformly spaced, which is unlikely true
// but the best estimate possible without iterating over the rows.
double rowDensity = (lastRow - firstRow + 1) / numRows;
double estimatedForEachLoopCost = numRows;
double estimatedForLoopCost = (lastRow - startRow) + 1) * rowDensity;
if (estimatedForEachLoopCost < estimatedForLoopCost) {
// for-each iteration
for (Row row : sheet) {
if (row.getRowNum() < startRow) continue;
Cell cell = row.getCell(columnIndex, Row.RETURN_BLANK_AS_NULL);
if (cell != null) {
return false;
}
}
return true;
} else {
for (int r=startRow; r<=lastRow; r++) {
Row row = sheet.getRow(r);
if (row == null) continue;
Cell cell = row.getCell(columnIndex, Row.RETURN_BLANK_AS_NULL);
if (cell != null) {
return false;
}
}
return true;
}
}

如果您真的关心性能,您可以 fork POI 并编写一个方法来公开 TreeMap<Integer, XSSFRow>XSSFSheet用于访问行。然后您可以使用 _rows.tailMap(startRow, inclusive=true) 访问最小行数.

如果您在 POI bugzilla 上为返回 java.util.Collections.unmodifiableSortedMap(_rows.subMap(startRow, true, endRow, true)) 的方法添加补丁和测试用例来自 HSSF、XSSF 和 SXSSF(如果起始行或结束行在访问窗口之外,或者使用类似于自动调整大小列跟踪器的列跟踪器,则会失败),然后将 isColumnEmpty 函数添加到适当的类,那么您可以避免维护分支,如果您的补丁被接受。

关于java - Apache POI : Check if a column is empty,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38204944/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com