有人可以解释一下Missing cell policy
的{{1}}吗?究竟缺少什么细胞?我没有发现Apache POI
文档link对于究竟缺少的单元格是不言自明的。
答案 0 :(得分:13)
您是否阅读了Apache POI Excel Busy Developer's Guide?
在某些情况下,在迭代时,您需要完全控制缺失或空白行和单元格的处理方式,并且您需要确保访问每个单元格而不仅仅是文件中定义的单元格。 (CellIterator将仅返回文件中定义的单元格,主要是具有值或样式的单元格,但它取决于Excel)。
在这些情况下,您应该获取一行的第一个和最后一个列信息,然后调用getCell(int,MissingCellPolicy)来获取该单元格。使用MissingCellPolicy控制处理空白或空单元格的方式。
如果你在一行中重复迭代,那么一些空白的单元格甚至可能不存在,这可能会导致毫无疑问的代码抛出NullPointerException
。 MissingCellPolicy
传递给getCell
时,会引导并简化代码,告知Apache POI如何处理这些类型的单元格。
Cell
不存在,则创建新的null
,而不是返回Cell
,而是创建一个新的NullPointerException
,其单元格类型为"空白&#34 ;.这有助于方便地避免null
。null
。这可以让您忽略容易存在的空白单元格。Cell
,如果存在,则返回空白SSLv3
,但其单元格类型为空。这是getCell
overload that doesn't take a MissingCellPolicy
。答案 1 :(得分:0)
我正在使用Java中的代码,如下所示,它对我有好处:)希望对您有所帮助。
ArrayList<ArrayList<String>> cellArrayListHolder = new ArrayList<ArrayList<String>>();
FileInputStream excelFile = new FileInputStream(new File(fileName));
Workbook workbook = new XSSFWorkbook(excelFile);
Sheet datatypeSheet = workbook.getSheetAt(0);
Iterator<Row> iterator = datatypeSheet.iterator();
while (iterator.hasNext())
{
ArrayList<String> cellStoreArrayList = new ArrayList<String>();
Row currentRow = iterator.next();
Iterator<Cell> cellIterator = currentRow.iterator();
int column_counting = 0;
int patched_count = 0;
while (cellIterator.hasNext() && column_counting < read_column_size) {
column_counting ++;
Cell currentCell = cellIterator.next();
int missed_column = 1 - column_counting + currentCell.getColumnIndex() - patched_count;
for(int i=0; i<missed_column; i++){
cellStoreArrayList.add("");
patched_count++;
}
switch (currentCell.getCellType()){
case Cell.CELL_TYPE_STRING:
cellStoreArrayList.add(String.valueOf(currentCell).trim());
break;
case Cell.CELL_TYPE_NUMERIC:
if (DateUtil.isCellDateFormatted(currentCell)) {
DateFormat db_df = new SimpleDateFormat("EEE MMM dd HH:mm:ss yyyy");
cellStoreArrayList.add(db_df.format(currentCell.getDateCellValue()));
} else {
cellStoreArrayList.add(String.valueOf(currentCell.getNumericCellValue()));
}
break;
case Cell.CELL_TYPE_BOOLEAN:
cellStoreArrayList.add(String.valueOf(currentCell.getBooleanCellValue()));
break;
default:
cellStoreArrayList.add("");
break;
}
}
cellArrayListHolder.add(cellStoreArrayList);
}