diff --git a/src/ooxml/java/org/apache/poi/xssf/eventusermodel/XSSFSheetXMLHandler.java b/src/ooxml/java/org/apache/poi/xssf/eventusermodel/XSSFSheetXMLHandler.java index 0c470f8e6..f0f01bb85 100644 --- a/src/ooxml/java/org/apache/poi/xssf/eventusermodel/XSSFSheetXMLHandler.java +++ b/src/ooxml/java/org/apache/poi/xssf/eventusermodel/XSSFSheetXMLHandler.java @@ -132,6 +132,7 @@ public class XSSFSheetXMLHandler extends DefaultHandler { return false; } + @Override public void startElement(String uri, String localName, String name, Attributes attributes) throws SAXException { @@ -207,18 +208,26 @@ public class XSSFSheetXMLHandler extends DefaultHandler { nextDataType = xssfDataType.SST_STRING; else if ("str".equals(cellType)) nextDataType = xssfDataType.FORMULA; - else if (cellStyleStr != null) { - // Number, but almost certainly with a special style or format - int styleIndex = Integer.parseInt(cellStyleStr); - XSSFCellStyle style = stylesTable.getStyleAt(styleIndex); - this.formatIndex = style.getDataFormat(); - this.formatString = style.getDataFormatString(); - if (this.formatString == null) - this.formatString = BuiltinFormats.getBuiltinFormat(this.formatIndex); + else { + // Number, but almost certainly with a special style or format + XSSFCellStyle style = null; + if (cellStyleStr != null) { + int styleIndex = Integer.parseInt(cellStyleStr); + style = stylesTable.getStyleAt(styleIndex); + } else if (stylesTable.getNumCellStyles() > 0) { + style = stylesTable.getStyleAt(0); + } + if (style != null) { + this.formatIndex = style.getDataFormat(); + this.formatString = style.getDataFormatString(); + if (this.formatString == null) + this.formatString = BuiltinFormats.getBuiltinFormat(this.formatIndex); + } } } } + @Override public void endElement(String uri, String localName, String name) throws SAXException { String thisStr = null; @@ -316,6 +325,7 @@ public class XSSFSheetXMLHandler extends DefaultHandler { * Captures characters only if a suitable element is open. * Originally was just "v"; extended for inlineStr also. */ + @Override public void characters(char[] ch, int start, int length) throws SAXException { if (vIsOpen) { diff --git a/src/ooxml/testcases/org/apache/poi/xssf/extractor/TestXSSFEventBasedExcelExtractor.java b/src/ooxml/testcases/org/apache/poi/xssf/extractor/TestXSSFEventBasedExcelExtractor.java index 1b0e6c479..0fb28ef9d 100644 --- a/src/ooxml/testcases/org/apache/poi/xssf/extractor/TestXSSFEventBasedExcelExtractor.java +++ b/src/ooxml/testcases/org/apache/poi/xssf/extractor/TestXSSFEventBasedExcelExtractor.java @@ -17,7 +17,6 @@ package org.apache.poi.xssf.extractor; -import java.util.List; import java.util.regex.Matcher; import java.util.regex.Pattern; @@ -26,11 +25,7 @@ import junit.framework.TestCase; import org.apache.poi.POITextExtractor; import org.apache.poi.hssf.HSSFTestDataSamples; import org.apache.poi.hssf.extractor.ExcelExtractor; -import org.apache.poi.openxml4j.opc.OPCPackage; import org.apache.poi.xssf.XSSFTestDataSamples; -import org.apache.poi.xssf.eventusermodel.XSSFReader; -import org.apache.poi.xssf.usermodel.XSSFShape; -import org.apache.poi.xssf.usermodel.XSSFSimpleShape; /** * Tests for {@link XSSFEventBasedExcelExtractor} @@ -187,4 +182,31 @@ public class TestXSSFEventBasedExcelExtractor extends TestCase { assertTrue(text.indexOf("Line 3") > -1); } + + /** + * Test that we return the same output for unstyled numbers as the + * non-event-based XSSFExcelExtractor. + */ + public void testUnstyledNumbersComparedToNonEventBasedExtractor() + throws Exception { + + String expectedOutput = "Sheet1\n99.99\n"; + + XSSFExcelExtractor extractor = new XSSFExcelExtractor( + XSSFTestDataSamples.openSampleWorkbook("56011.xlsx")); + try { + assertEquals(expectedOutput, extractor.getText().replace(",", ".")); + } finally { + extractor.close(); + } + + XSSFEventBasedExcelExtractor fixture = + new XSSFEventBasedExcelExtractor( + XSSFTestDataSamples.openSamplePackage("56011.xlsx")); + try { + assertEquals(expectedOutput, fixture.getText().replace(",", ".")); + } finally { + fixture.close(); + } + } } diff --git a/test-data/spreadsheet/56011.xlsx b/test-data/spreadsheet/56011.xlsx new file mode 100644 index 000000000..7b5f70eba Binary files /dev/null and b/test-data/spreadsheet/56011.xlsx differ