所以我想在导出到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);
}
}
}