导出 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
但在该块内,仅考虑 STRING
和 NUMERIC
。这导致执行 DateUtil.isCellDateFormatted(cell)
导致异常。
所以我的问题是:我说得对吗?这是一个错误吗?还是我遗漏了什么?
我已经修复了 POI 代码 - 请参阅 https://bz.apache.org/bugzilla/show_bug.cgi?id=65492 - 这将包含在下一个 POI 版本中
我有一个定义了 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
但在该块内,仅考虑 STRING
和 NUMERIC
。这导致执行 DateUtil.isCellDateFormatted(cell)
导致异常。
所以我的问题是:我说得对吗?这是一个错误吗?还是我遗漏了什么?
我已经修复了 POI 代码 - 请参阅 https://bz.apache.org/bugzilla/show_bug.cgi?id=65492 - 这将包含在下一个 POI 版本中