如何用Apache POI读取空的,但格式化的Excel单元格?

我有一个使用Apache POI读取Excel单元格的方法,它工作正常。 那么…几乎没事。

public static ArrayList readXLsXFile() throws FileNotFoundException, IOException { ArrayList outListaExcel = new ArrayList(); FileInputStream fis; ptxf= new FileInputStream(pathToExcelFile); XSSFWorkbook workbook = new XSSFWorkbook(ptxf); XSSFSheet sheetAr = workbook.getSheetAt(0); Iterator rowsAr = sheetAr.rowIterator(); while (rowsAr.hasNext()) { XSSFRow row1 = (XSSFRow) rowsAr.next(); Iterator cellsAr = row1.cellIterator(); ArrayList<String> arr; arr = new ArrayList(); while (cellsAr.hasNext()) { XSSFCell cell1 = (XSSFCell) cellsAr.next(); arr.add(String.valueOf(cell1)); } outListaExcel.add(arr); } return outListaExcel; } 

如果单元格被格式化,例如如果整个A列有边框,那么它将继续读空单元格给我空string。 如何忽略那些空的(格式化的)单元格?

所以readXLsXFile会给我一个ArryList

 [0] -> [1][2] [1] -> [3][4] 

但是它也会给出十个以上空string的节点,因为A是用边界格式化的。

Gagravarr回答后编辑

我可以避免检查是否subList是空的,然后不要把它添加到mainList 。 但是在一些非常大的.xls文件的情况下,如果它们中的很多文件需要很长的时间,我认为这不是一个好的做法。

我的问题是,如果有行的东西,就像我忽略的细胞

  ArrayList<ArrayList<String>>mainLista = new ArrayList<ArrayList<String>>(); for (int rowNum = rowStart; rowNum < rowEnd; rowNum++) { Row r = sheet.getRow(rowNum); int lastColumn = r.getLastCellNum(); ArrayList<String> subList = new ArrayList<String>(); for (int cn = 0; cn < lastColumn; cn++) { Cell c = r.getCell(cn, Row.RETURN_BLANK_AS_NULL); if (c != null) { subList.add(c.getStringCellValue()); } else { } } if (!subList.isEmpty() ){ // I think it is not good way mainLista.add(subList);} // to do this, because it still reads } // an empty rows 

正如在关于迭代行和单元格的Apache POI文档中所解释的那样,迭代器只会给你定义的行和单元格以及有/有内容。

如果您想要完全控制空单元或空单元来获取单元格,则需要使用如下所示的内容:

 // 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); 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 } } } 

如果您想要获取空白单元格(通常是带有样式但没有值的单元格),请使用其他缺失单元策略,例如RETURN_NULL_AND_BLANK