Author: fanningpj
Date: Wed Nov 10 10:34:09 2021
New Revision: 1894902
URL: http://svn.apache.org/viewvc?rev=1894902&view=rev
Log:
[bug-65676] issue in XSSFReader where string builder is not always cleared
between cells
Modified:
poi/trunk/poi-ooxml/src/main/java/org/apache/poi/xssf/eventusermodel/XSSFSheetXMLHandler.java
poi/trunk/poi-ooxml/src/test/java/org/apache/poi/xssf/eventusermodel/TestXSSFReader.java
Modified:
poi/trunk/poi-ooxml/src/main/java/org/apache/poi/xssf/eventusermodel/XSSFSheetXMLHandler.java
URL:
http://svn.apache.org/viewvc/poi/trunk/poi-ooxml/src/main/java/org/apache/poi/xssf/eventusermodel/XSSFSheetXMLHandler.java?rev=1894902&r1=1894901&r2=1894902&view=diff
==============================================================================
---
poi/trunk/poi-ooxml/src/main/java/org/apache/poi/xssf/eventusermodel/XSSFSheetXMLHandler.java
(original)
+++
poi/trunk/poi-ooxml/src/main/java/org/apache/poi/xssf/eventusermodel/XSSFSheetXMLHandler.java
Wed Nov 10 10:34:09 2021
@@ -315,6 +315,7 @@ public class XSSFSheetXMLHandler extends
if (!isIsOpen) {
outputCell();
+ value.setLength(0);
}
} else if ("f".equals(localName)) {
fIsOpen = false;
Modified:
poi/trunk/poi-ooxml/src/test/java/org/apache/poi/xssf/eventusermodel/TestXSSFReader.java
URL:
http://svn.apache.org/viewvc/poi/trunk/poi-ooxml/src/test/java/org/apache/poi/xssf/eventusermodel/TestXSSFReader.java?rev=1894902&r1=1894901&r2=1894902&view=diff
==============================================================================
---
poi/trunk/poi-ooxml/src/test/java/org/apache/poi/xssf/eventusermodel/TestXSSFReader.java
(original)
+++
poi/trunk/poi-ooxml/src/test/java/org/apache/poi/xssf/eventusermodel/TestXSSFReader.java
Wed Nov 10 10:34:09 2021
@@ -19,12 +19,7 @@ package org.apache.poi.xssf.eventusermod
import static org.apache.poi.POITestCase.assertContains;
import static org.apache.poi.POITestCase.assertNotContained;
-import static org.junit.jupiter.api.Assertions.assertEquals;
-import static org.junit.jupiter.api.Assertions.assertFalse;
-import static org.junit.jupiter.api.Assertions.assertNotNull;
-import static org.junit.jupiter.api.Assertions.assertNull;
-import static org.junit.jupiter.api.Assertions.assertThrows;
-import static org.junit.jupiter.api.Assertions.assertTrue;
+import static org.junit.jupiter.api.Assertions.*;
import java.io.IOException;
import java.io.InputStream;
@@ -35,23 +30,31 @@ import java.util.Iterator;
import java.util.List;
import java.util.Set;
+import org.apache.commons.io.output.UnsynchronizedByteArrayOutputStream;
import org.apache.poi.POIDataSamples;
import org.apache.poi.ooxml.POIXMLException;
import org.apache.poi.openxml4j.exceptions.InvalidFormatException;
import org.apache.poi.openxml4j.opc.OPCPackage;
import org.apache.poi.poifs.crypt.CryptoFunctions;
import org.apache.poi.poifs.crypt.HashAlgorithm;
+import org.apache.poi.ss.usermodel.DataFormatter;
import org.apache.poi.ss.usermodel.Name;
+import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.util.IOUtils;
+import org.apache.poi.util.XMLHelper;
import org.apache.poi.xssf.XSSFTestDataSamples;
import org.apache.poi.xssf.model.Comments;
import org.apache.poi.xssf.model.CommentsTable;
import org.apache.poi.xssf.model.StylesTable;
+import org.apache.poi.xssf.streaming.SXSSFWorkbook;
+import org.apache.poi.xssf.usermodel.XSSFComment;
import org.apache.poi.xssf.usermodel.XSSFShape;
import org.apache.poi.xssf.usermodel.XSSFSimpleShape;
import org.junit.jupiter.api.Disabled;
import org.junit.jupiter.api.Test;
+import org.xml.sax.InputSource;
+import org.xml.sax.XMLReader;
/**
* Tests for {@link XSSFReader}
@@ -356,6 +359,51 @@ public final class TestXSSFReader {
}
}
+ @Test
+ void testBug65676() throws Exception {
+ try (UnsynchronizedByteArrayOutputStream output = new
UnsynchronizedByteArrayOutputStream()) {
+ try(Workbook wb = new SXSSFWorkbook()) {
+ Row r = wb.createSheet("Sheet").createRow(0);
+ r.createCell(0).setCellValue(1.2); /* A1: Number 1.2 */
+ r.createCell(1).setCellValue("ABC"); /* B1: Inline string
"ABC" */
+ wb.write(output);
+ }
+ /* Minimal stream reader processor */
+ XSSFSheetXMLHandler.SheetContentsHandler reader = new
XSSFSheetXMLHandler.SheetContentsHandler() {
+ @Override public void startRow(int rowNum) {}
+ @Override public void endRow(int rowNum) {}
+ @Override public void cell(String cellReference,
+ String formattedValue, XSSFComment
comment) {
+ if (cellReference.equals("A1")) {
+ assertEquals("1.2", formattedValue);
+ } else if (cellReference.equals("B1")) {
+ assertEquals("ABC", formattedValue);
+ } else {
+ fail("Unexpected cell " + cellReference);
+ }
+ }
+ };
+
+ /* Stream reading workbook from byte array */
+ try (OPCPackage xlsxPackage =
OPCPackage.open(output.toInputStream())) {
+ XSSFReader xssfReader = new XSSFReader(xlsxPackage);
+ try (InputStream stream = xssfReader.getSheetsData().next()) {
+ XMLReader sheetParser = XMLHelper.newXMLReader();
+ sheetParser.setContentHandler(new XSSFSheetXMLHandler(
+ xssfReader.getStylesTable(),
+ null,
+ new ReadOnlySharedStringsTable(xlsxPackage),
+ reader,
+ new DataFormatter(),
+ false
+ ));
+ sheetParser.parse(new InputSource(stream));
+ }
+ }
+ }
+
+ }
+
private static String hash(XSSFReader reader) throws IOException {
Iterable<InputStream> iter = () -> {
try {
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]