尝试使用Apache POI在excel中导出和着色行时出现异常



所以我想在导出到Excel时为行着色,但我得到了一个NullPointerException

这是我的代码:

HSSFCellStyle cellStyle = hssfWorkbook.createCellStyle();
cellStyle.setFillPattern(FillPatternType.SOLID_FOREGROUND);
cellStyle.setFillForegroundColor(IndexedColors.YELLOW.getIndex())
for (int i = 3; i < hssfSheet.getLastRowNum(); i++) {
for (int j = 0; j < hssfSheet.getRow(i).getPhysicalNumberOfCells(); j++) {
hssfSheet.getRow(i).getCell(j).setCellStyle(cellStyle);
}              
}

所以我注意到,当我放少量的行(比如3行或4行(时,效果很好,只要我放得更多,它就会给我一个例外。我至少有200行,这取决于用户选择的过滤器。如何解决此问题?

问题是因为当行/单元格未定义时,HSSFSheet#getRow(int)Row#getCell(int)返回null。因此,a的连续调用.getCell(...).setCellStyle(...)抛出一个NPE。如果定义了行,则可以插入NULL检查以仅在单元格上循环。

此外,应该使用getLastCellNum()而不是getPhysicalNumberOfCells()在单元格上循环。不要忘记使用<=,因为双方都是零基础。

如果你也想给空单元格上色,你可以使用Row#getCell(int, Row.MissingCellPolicy)来动态创建单元格:

for (int i = 3; i <= hssfSheet.getLastRowNum(); i++) {
HSSFRow row = hssfSheet.getRow(i);
if (row != null) {
for (int j = 0; j < row.getLastCellNum(); j++) {
HSSFCell cell = row.getCell(j, Row.MissingCellPolicy.CREATE_NULL_AS_BLANK);
cell.setCellStyle(cellStyle);
}
}
}

如果空单元格不应该着色,可以使用以下代码段:

for (int i = 3; i <= hssfSheet.getLastRowNum(); i++) {
HSSFRow row = hssfSheet.getRow(i);
if (row != null) {
for (Cell cell : row) {
cell.setCellStyle(cellStyle);
}
}
}

最新更新