【问题标题】:TreeMap is missing a key from the Object RowsTreeMap 缺少对象行中的键
【发布时间】:2019-09-03 12:31:33
【问题描述】:

我正在使用 Apache POI 库将 Excel 工作表中的值读取到 Java 程序中。

我遍历表的每一行以获得我需要的值。

在对象 Row 中,有一个包含 XSSFCell 对象作为值的 TreeMap。

通常我会得到以下 TreeMap:

其中包含 key 4。该值通常是此图中选择的空字符串。

出于某种原因,对于某些对象,我得到以下 TreeMap:

键 4 丢失的地方。

两个行对象属于同一个表。

这就是我使用对象行的方式:

 XSSFSheet mySheet = myWorkBook.getSheet("nameOfSheet");
 Iterator<Row> rowIterator = mySheet.iterator();

 while (rowIterator.hasNext()) {
        Row row = rowIterator.next();
        // here I call my method
    }

【问题讨论】:

  • Excel 文件中,并非总是存储所有可能的单元格和行。否则,每个 *.xlsx Excel 文件必须存储所有 1,048,576 行,并存储 16,384 个单元格。不存储没有内容或格式的单元格。那些未存储的单元格,迭代器将没有,内部_cells 映射也不会包含。见poi.apache.org/components/spreadsheet/quick-guide.html#Iterator
  • 你的解释听起来很合理。但我不明白,为什么对于某些处于相同状态(格式和内容)但在不同行中的单元格,Row 对象的反应不同。我想我会使用 try/catch 来避免这个错误。

标签: java apache-poi


【解决方案1】:

您可以通过调用“getCell()”同时传入索引和MissingCellPolicy(可能是 Row.RETURN_BLANK_AS_NULL)来防止这种情况导致应用程序不一致。

Apache POI guide 解释:

在某些情况下,在迭代时,您需要完全控制缺失的程度 或空白行和单元格被处理,您需要确保您访问 每个单元格,而不仅仅是文件中定义的单元格。 (细胞迭代器 只会返回文件中定义的单元格,主要是那些 具有值或样式,但这取决于 Excel)。

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

// 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);
   if (r == null) {
      // This whole row is empty
      // Handle it as needed
      continue;
   }

   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
      }
   }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多