From d7028dcf09b672be3751521c5ec8d07af7e9c65f Mon Sep 17 00:00:00 2001 From: Dominik Stadler Date: Mon, 3 Feb 2014 19:46:41 +0000 Subject: [PATCH] Bug 55926: Handle numeric formula values when exporting to XML git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1564028 13f79535-47bb-0310-9956-ffa450edef68 --- .../poi/xssf/extractor/XSSFExportToXml.java | 11 ++++++- .../xssf/extractor/TestXSSFExportToXML.java | 31 ++++++++++++++++++ test-data/spreadsheet/55926.xlsx | Bin 0 -> 12650 bytes 3 files changed, 41 insertions(+), 1 deletion(-) create mode 100644 test-data/spreadsheet/55926.xlsx diff --git a/src/ooxml/java/org/apache/poi/xssf/extractor/XSSFExportToXml.java b/src/ooxml/java/org/apache/poi/xssf/extractor/XSSFExportToXml.java index 807a584181..49b095eded 100644 --- a/src/ooxml/java/org/apache/poi/xssf/extractor/XSSFExportToXml.java +++ b/src/ooxml/java/org/apache/poi/xssf/extractor/XSSFExportToXml.java @@ -43,6 +43,7 @@ import javax.xml.validation.SchemaFactory; import javax.xml.validation.Validator; import org.apache.poi.openxml4j.exceptions.InvalidFormatException; +import org.apache.poi.ss.usermodel.Cell; import org.apache.poi.ss.usermodel.DateUtil; import org.apache.poi.xssf.usermodel.XSSFCell; import org.apache.poi.xssf.usermodel.XSSFMap; @@ -283,7 +284,14 @@ public class XSSFExportToXml implements Comparator{ case XSSFCell.CELL_TYPE_STRING: value = cell.getStringCellValue(); break; case XSSFCell.CELL_TYPE_BOOLEAN: value += cell.getBooleanCellValue(); break; case XSSFCell.CELL_TYPE_ERROR: value = cell.getErrorCellString(); break; - case XSSFCell.CELL_TYPE_FORMULA: value = cell.getStringCellValue(); break; + case XSSFCell.CELL_TYPE_FORMULA: + if (cell.getCachedFormulaResultType() == Cell.CELL_TYPE_STRING) { + value = cell.getStringCellValue(); + } else { + value += cell.getNumericCellValue(); + } + break; + case XSSFCell.CELL_TYPE_NUMERIC: if (DateUtil.isCellDateFormatted(cell)) { DateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); @@ -292,6 +300,7 @@ public class XSSFExportToXml implements Comparator{ value += cell.getRawValue(); } break; + default: ; } diff --git a/src/ooxml/testcases/org/apache/poi/xssf/extractor/TestXSSFExportToXML.java b/src/ooxml/testcases/org/apache/poi/xssf/extractor/TestXSSFExportToXML.java index 6bcb71943f..fbbf1e0eb5 100644 --- a/src/ooxml/testcases/org/apache/poi/xssf/extractor/TestXSSFExportToXML.java +++ b/src/ooxml/testcases/org/apache/poi/xssf/extractor/TestXSSFExportToXML.java @@ -241,4 +241,35 @@ public final class TestXSSFExportToXML extends TestCase { assertEquals("2012-01-13", date); } } + + public void testFormulaCells_Bugzilla_55926() throws Exception { + XSSFWorkbook wb = XSSFTestDataSamples.openSampleWorkbook("55926.xlsx"); + + for (POIXMLDocumentPart p : wb.getRelations()) { + + if (!(p instanceof MapInfo)) { + continue; + } + MapInfo mapInfo = (MapInfo) p; + + XSSFMap map = mapInfo.getXSSFMapById(1); + + assertNotNull("XSSFMap is null", map); + + XSSFExportToXml exporter = new XSSFExportToXml(map); + ByteArrayOutputStream os = new ByteArrayOutputStream(); + exporter.exportToXML(os, true); + String xmlData = os.toString("UTF-8"); + + assertNotNull(xmlData); + assertFalse(xmlData.equals("")); + + String a = xmlData.split("")[1].split("")[0].trim(); + String doubleValue = a.split("")[1].split("")[0].trim(); + String stringValue = a.split("")[1].split("")[0].trim(); + + assertEquals("Hello World", stringValue); + assertEquals("5.1", doubleValue); + } + } } diff --git a/test-data/spreadsheet/55926.xlsx b/test-data/spreadsheet/55926.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..23907c1d5817b661f3e6cb101131818879a90b3d GIT binary patch literal 12650 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