如何在Apache POI中获取Excel空白单元格值?

我有一个巨大的excel文件,其中列的吨像这样:

Column1 Column2 Column3 Column4 Column5 abc def ghi mno pqr ...... 

这是我写的打印这些值的代码:

 try { FileInputStream inputStr = new FileInputStream(fileName); XSSFWorkbook xssfWork = new XSSFWorkbook(inputStr) ; XSSFSheet sheet1 = xssfWork.getSheetAt(0); Iterator rowItr = sheet1.rowIterator(); while ( rowItr.hasNext() ) { XSSFRow row = (XSSFRow) rowItr.next(); System.out.println("ROW:-->"); Iterator cellItr = row.cellIterator(); while ( cellItr.hasNext() ) { XSSFCell cell = (XSSFCell) cellItr.next(); System.out.println("CELL:-->"+cell.toString()); } } } catch (Exception e) { e.printStackTrace(); } 

这个代码生成的输出是:

 ROW:--> CELL:-->Column1 CELL:-->Column2 CELL:-->Column3 CELL:-->Column4 CELL:-->Column5 ROW:--> CELL:-->abc CELL:-->def CELL:-->ghi ROW:--> CELL:-->mno CELL:-->pqr 

所以,如果我们看上面的输出,我们可以注意到,我留下空白值的单元格没有被POI库拾取,是否有一种方法可以将这些值作为空值。 或者一种方法来识别提供的值跳过空白单元格?

谢谢。

如果你想得到所有的单元格,不pipe它们是否存在,那么迭代器就不适合你。 相反,您需要手动获取适当的单元格,可能会丢失单元格策略

 for(Row row : sheet) { for(int cn=0; cn<row.getLastCellNum(); cn++) { // If the cell is missing from the file, generate a blank one // (Works by specifying a MissingCellPolicy) Cell cell = row.getCell(cn, Row.CREATE_NULL_AS_BLANK); // Print the cell for debugging System.out.println("CELL: " + cn + " --> " + cell.toString()); } } 

关于遍历单元格的Apache POI文档中有关于所有这些的更多详细信息

我也为这个问题感到沮丧。 这是我用poi-3.7-20101029和poi-3.8发现的。

RowIterator和CellIterator不支持遍历NULL单元格或行 – 只有物理定义的单元格(可以是BLANK)。

该解决scheme返回我所期望的需要使用基于0的Row.getCell([int], Row.CREATE_NULL_AS_BLANK) ,就像Chavira的答案所暗示的那样(假设8个单元行)。 或者您可以使用Cell.columnIndex值迭代检查跳跃数字…

令人烦恼的是,使用方法#1创build空白单元格后,迭代器将返回现在创build的BLANK单元格。 我认为这是一个CellIterator忽略MissingCellPolicy的错误。

原因很简单:Excel文件可以包含尽可能多的行和尽可能多的列,因此返回所有可用的空白行和列将使单元格变得庞大且占用大量内存。

假设你有一个10×10工作表,在Excel中,它不是“完全”10×10,因为你可以非常容易地添加11×10与空白单元格,所以应该POI返回第11列?

一种做你要求的方法是使用HSSFCell.getColumnIndex()

例:

 //Assuming your have a 2 dimensional array. String[][] values = ......;// It is assigned POIFSFileSystem fileSystem = new POIFSFileSystem(new FileInputStream(fileName)); HSSFWorkbook workbook = new HSSFWorkbook(fileSystem); //Going through every worksheet. for (int sheetPos = 0; sheetPos < workbook.getNumberOfSheets(); sheetPos++) { HSSFSheet sheet = workbook.getSheetAt(sheetPos); int rowPos = 0; Iterator<Row> rows = sheet.rowIterator(); while (rows.hasNext()) { HSSFRow row = (HSSFRow) rows.next(); Iterator<Cell> cells = row.cellIterator(); while (cells.hasNext()) { HSSFCell cell = (HSSFCell) cells.next(); String value = ""; switch (cell.getCellType()) { case HSSFCell.CELL_TYPE_NUMERIC: value = BigDecimal.valueOf(cell.getNumericCellValue()).toPlainString(); break; case HSSFCell.CELL_TYPE_STRING: value = cell.getStringCellValue(); break; case HSSFCell.CELL_TYPE_BLANK: value = ""; break; case HSSFCell.CELL_TYPE_FORMULA: value = cell.getCellFormula(); break; default: break; } values[rowPos][cell.getColumnIndex()] = value; } rowPos++; } } 
  for(org.apache.poi.ss.usermodel.Row tmp : hssfSheet){ for(int i = 0; i<8;i++){ System.out.println(tmp.getCell(i)); } } 

下面是我的工作。 “row.CREATE_NULL_AS_BLANK”似乎不是有效的,但可能缺乏NPOI的知识。

 HSSFCell dataCell= (HSSFCell)row.GetCell(column, NPOI.SS.UserModel.MissingCellPolicy.CREATE_NULL_AS_BLANK); 

这对我工作….

 int rowNumber; int previousCell; int currentCell; int currentRowNumber; HSSFCell cell; while (rows.hasNext()) { previousCell = -1; currentCell = 0; while (cellIterator.hasNext()) { cell = (HSSFCell) cellIterator.next(); currentCell = cell.getColumnIndex(); if (previousCell == currentCell-1) { //... } else { System.out.println("Blank cell found"); } previousCell = currentCell; } } 
 List cellDataList = new ArrayList(); int lineNumber = 0; while (rowIterator.hasNext()) { HSSFRow hssfRow = (HSSFRow) rowIterator.next(); //System.out.println("Befor If"); lineNumber++; if(lineNumber==1){continue;} //System.out.println("Out side if "); Iterator<Cell> iterator = hssfRow.cellIterator(); List<Cell> cellTempList = new ArrayList(); int current = 0, next = 1; while (iterator.hasNext()) { Cell hssfCell = iterator.next(); current = hssfCell.getColumnIndex(); if(current<next){ System.out.println("Condition Satisfied"); } else{ int loop = current-next; System.out.println("inside else Loop value : "+(loop)); for(int k=0;k<loop+1;k++){ System.out.println("Adding nulls"); cellTempList.add(null); next = next + 1; } } cellTempList.add(hssfCell); next = next + 1; System.out.println("At End next value is : "+next); } cellDataList.add(cellTempList); } 
 public String[] rowToString(Row row) { Iterator<Cell> cells = row.cellIterator() ; String[] data = new String[row.getLastCellNum()] ; int previousCell = 0 ; Cell cell = cells.next() ; int currentCell = cell.getColumnIndex(); while (true) { if (previousCell == currentCell) { switch (cell.getCellType()) { case Cell.CELL_TYPE_NUMERIC: data[previousCell] = cell.getNumericCellValue()+"" ; break; case Cell.CELL_TYPE_STRING: data[previousCell] = cell.getStringCellValue() ; break; /* // there could be other cases here. case Cell.CELL_TYPE_FORMULA: data[previousCell] =eval.evaluateFormulaCell(cell); break; case Cell.CELL_TYPE_BOOLEAN: data[previousCell] = cell.getBooleanCellValue(); break; case Cell.CELL_TYPE_BLANK: data[previousCell] = ""; break; case Cell.CELL_TYPE_ERROR: data[previousCell] = "ERROR"; break; */ } if(cells.hasNext()){ cell = cells.next() ; currentCell = cell.getColumnIndex(); } else { break ; } } else { data[previousCell] = ""; } previousCell++ ; } return data ; }