缺少Apache POI Java的单元策略

时间:2016-04-21 17:35:04

标签: java apache-poi

有人可以解释一下Missing cell policy的{​​{1}}吗?究竟缺少什么细胞?我没有发现Apache POI文档link对于究竟缺少的单元格是不言自明的。

2 个答案:

答案 0 :(得分:13)

您是否阅读了Apache POI Excel Busy Developer's Guide

  

在某些情况下,在迭代时,您需要完全控制缺失或空白行和单元格的处理方式,并且您需要确保访问每个单元格而不仅仅是文件中定义的单元格。 (CellIterator将仅返回文件中定义的单元格,主要是具有值或样式的单元格,但它取决于Excel)。

     

在这些情况下,您应该获取一行的第一个和最后一个列信息,然后调用getCell(int,MissingCellPolicy)来获取该单元格。使用MissingCellPolicy控制处理空白或空单元格的方式。

如果你在一行中重复迭代,那么一些空白的单元格甚至可能不存在,这可能会导致毫无疑问的代码抛出NullPointerExceptionMissingCellPolicy传递给getCell时,会引导并简化代码,告知Apache POI如何处理这些类型的单元格。

  • CREATE_NULL_AS_BLANK - 如果返回的Cell不存在,则创建新的null,而不是返回Cell,而是创建一个新的NullPointerException,其单元格类型为"空白&#34 ;.这有助于方便地避免null
  • RETURN_BLANK_AS_NULL - 即使单元格存在但单元格类型为"空白",也请返回null。这可以让您忽略容易存在的空白单元格。
  • RETURN_NULL_AND_BLANK - 不要修改现有结构;对于不存在的单元格返回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);
}