导出 XML 地图时无法从 BOOLEAN 单元格中获取数字值

Receiving Cannot get a NUMERIC value from a BOOLEAN cell when exporting XML map

我有一个定义了 XML 映射的工作簿(我使用的是 POI 4.1.2)。

映射的单元格包含计算结果为布尔值的公式:=AND(B70="";B71=""; B50="No")

我尝试使用以下代码导出 XML 映射:

// First ensure that all formulas are evaluated
wb.getCreationHelper().createFormulaEvaluator().evaluateAll();
// Export XML map
String file = "path/to/file.xml";
XSSFWorkbook xssfWorkbook = (XSSFWorkbook) wb;
XSSFMap xssfMap = xssfWorkbook.getCustomXMLMappings().stream().findFirst().get();
XSSFExportToXml exporter = new XSSFExportToXml(xssfMap);
OutputStream out = new FileOutputStream(file);
exporter.exportToXML(out, false);

最后一行导致以下异常:

java.lang.IllegalStateException: Cannot get a NUMERIC value from a BOOLEAN cell at org.apache.poi.xssf.usermodel.XSSFCell.typeMismatch(XSSFCell.java:1035) at org.apache.poi.xssf.usermodel.XSSFCell.getNumericCellValue(XSSFCell.java:319) at org.apache.poi.ss.usermodel.DateUtil.isCellDateFormatted(DateUtil.java:765) at org.apache.poi.ss.usermodel.DateUtil.isCellDateFormatted(DateUtil.java:744) at org.apache.poi.xssf.extractor.XSSFExportToXml.mapCellOnNode(XSSFExportToXml.java:281)

当我查看 XSSFExportToXml.mapCellOnNode(XSSFCell, Node) 时,我看到以下代码:

private void mapCellOnNode(XSSFCell cell, Node node) {

    String value ="";
    switch (cell.getCellType()) {

    case STRING: value = cell.getStringCellValue(); break;
    case BOOLEAN: value += cell.getBooleanCellValue(); break;
    case ERROR: value = cell.getErrorCellString();  break;
    case FORMULA:
       if (cell.getCachedFormulaResultType() == CellType.STRING) { // cell.getCachedFormulaResultType() returns BOOLEAN
           value = cell.getStringCellValue();
       } else {
           if (DateUtil.isCellDateFormatted(cell)) { // Results in Exception
              value = getFormattedDate(cell);
           } else {
              value += cell.getNumericCellValue();
           }
       }
       break;
    
    case NUMERIC: 
         if (DateUtil.isCellDateFormatted(cell)) {
              value = getFormattedDate(cell);
          } else {
             value += cell.getRawValue();
          }
        break;

    default:

    }
    if (node instanceof Element) {
        Element currentElement = (Element) node;
        currentElement.setTextContent(value);
    } else {
        node.setNodeValue(value);
    }
}

据我所知,mapCellOnNode 中存在错误。在 case FORMULA 内,表达式 cell.getCachedFormulaResultType() returns BOOLEAN 但在该块内,仅考虑 STRINGNUMERIC。这导致执行 DateUtil.isCellDateFormatted(cell) 导致异常。

所以我的问题是:我说得对吗?这是一个错误吗?还是我遗漏了什么?

我已经修复了 POI 代码 - 请参阅 https://bz.apache.org/bugzilla/show_bug.cgi?id=65492 - 这将包含在下一个 POI 版本中