From 7db6081827449c013c133ea42e30881c3ed51264 Mon Sep 17 00:00:00 2001 From: Dominik Stadler Date: Sat, 1 Feb 2014 20:54:09 +0000 Subject: [PATCH] Bug 56011: Use default style if the cell style attribute is not present git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1563470 13f79535-47bb-0310-9956-ffa450edef68 --- .../eventusermodel/XSSFSheetXMLHandler.java | 26 +++++++++----- .../TestXSSFEventBasedExcelExtractor.java | 32 +++++++++++++++--- test-data/spreadsheet/56011.xlsx | Bin 0 -> 26911 bytes 3 files changed, 45 insertions(+), 13 deletions(-) create mode 100644 test-data/spreadsheet/56011.xlsx 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 0c470f8e6c..f0f01bb851 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 1b0e6c4797..0fb28ef9dc 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 0000000000000000000000000000000000000000..7b5f70eba233f61d6decd2370c8ec3120c2a6f35 GIT binary patch literal 26911 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 LybX9rECT}oSZ$?8 literal 0 HcmV?d00001 -- 2.39.5