如何处理POI中的空数字单元格

时间:2018-05-28 00:05:26

标签: java excel apache-poi

有没有特殊原因POI创建一个数字单元格,实际上它实际上是空的?会发生什么事情,当我到达那个单元格时,我显然得到一个运行时错误,因为我无法得到字符串值(毕竟它是一个数字单元格),我也无法得到数值(不能从空字符串中获取一个数字)所以我的两个问题是:

  1. POI如何到达那里?
  2. 我是否有办法处理这种情况而无需明确转到我的Excel文件?
  3. 更新I: 在读取/解析我的excel文件后,POI为此特定单元格生成以下XML:

      <x:c r="AA2" t="n">
          <x:v/>
      </x:c>
    

    我的方法是这样的:

        final FileInputStream inputStream = new FileInputStream(new File("PATH/TO/FILE.xml"));
        final XSSFWorkbook workbook = new XSSFWorkbook(inputStream);
        final XSSFSheet sheet = workbook.getSheet("SHEET_NAME");
    
        final int columnCount = sheet.getRow(0).getLastCellNum();
        for (int rowNumber = 0; rowNumber <= sheet.getLastRowNum(); rowNumber++)
        {
            final XSSFRow row = sheet.getRow(rowNumber);
            for (int column = 0; column < columnCount; column++)
            {
                // By now my cell would throw an exception if I attempt cell.getStringCellValue() or cell.getNumericCellValue() as cell.getCellType() returns "0" / NUMERIC
                final XSSFCell cell = row.getCell(column);
                ...
            }
        }
    

    我正在考虑添加一个额外的验证,以通过使用getRawValue()方法确定该单元格是否为空,但不确定是否有更好的方法来处理它,因为它显然被错误地解析了。

    更新II 我已经能够通过添加它作为单元测试的一部分来重现这种情况(我仍然不明白为什么POI会陷入这种情况):

        final XLSXSheetConverterImpl xlsxSheetConverter = new XLSXSheetConverterImpl();
        xlsxSheetConverter.setSheetName(SHEET_NAME);
        xlsxSheetConverter.setFilePrefix(FILE_PREFIX);
    
        XSSFWorkbook workbook = new XSSFWorkbook();
        final XSSFSheet sheet = workbook.createSheet(SHEET_NAME);
    
        final XSSFRow row = sheet.createRow(0);
        XSSFCell cell = row.createCell(0);
        final CTCellImpl ctCell = (CTCellImpl) cell.getCTCell();
        ctCell.setT(STCellType.N);
        ctCell.setV("");
    

    提前致谢!

1 个答案:

答案 0 :(得分:1)

这是旧版POI中的已知错误,请参阅:https://bz.apache.org/bugzilla/show_bug.cgi?id=56702

自3.11版以来已修复

谢谢大家的帮助!!