From 70078d42c8ac4084b0cdfab570520fabb0f6e3b2 Mon Sep 17 00:00:00 2001 From: PJ Fanning Date: Tue, 5 Aug 2025 10:20:24 +0100 Subject: [PATCH 1/3] tolerate whitespace in ints --- .../poi/xssf/eventusermodel/XSSFSheetXMLHandler.java | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/poi-ooxml/src/main/java/org/apache/poi/xssf/eventusermodel/XSSFSheetXMLHandler.java b/poi-ooxml/src/main/java/org/apache/poi/xssf/eventusermodel/XSSFSheetXMLHandler.java index dbe3bcdee6a..d0468a25c4f 100644 --- a/poi-ooxml/src/main/java/org/apache/poi/xssf/eventusermodel/XSSFSheetXMLHandler.java +++ b/poi-ooxml/src/main/java/org/apache/poi/xssf/eventusermodel/XSSFSheetXMLHandler.java @@ -253,7 +253,7 @@ public void startElement(String uri, String localName, String qName, } else if ("row".equals(localName)) { String rowNumStr = attributes.getValue("r"); if (rowNumStr != null) { - rowNum = Integer.parseInt(rowNumStr) - 1; + rowNum = parseInt(rowNumStr) - 1; } else { rowNum = nextRowNum; } @@ -284,7 +284,7 @@ else if ("str".equals(cellType)) XSSFCellStyle style = null; if (stylesTable != null) { if (cellStyleStr != null) { - int styleIndex = Integer.parseInt(cellStyleStr); + int styleIndex = parseInt(cellStyleStr); style = stylesTable.getStyleAt(styleIndex); } else if (stylesTable.getNumCellStyles() > 0) { style = stylesTable.getStyleAt(0); @@ -419,7 +419,7 @@ private void outputCell() { String sstIndex = value.toString(); if (!sstIndex.isEmpty()) { try { - int idx = Integer.parseInt(sstIndex); + int idx = parseInt(sstIndex); RichTextString rtss = sharedStringsTable.getItemAt(idx); thisStr = rtss.toString(); } catch (NumberFormatException ex) { @@ -515,7 +515,6 @@ private void checkForEmptyCellComments(EmptyCellCommentsCheckType type) { } } - /** * Output an empty-cell comment. */ @@ -524,6 +523,10 @@ private void outputEmptyCellComment(CellAddress cellRef) { output.cell(cellRef.formatAsString(), null, comment); } + private int parseInt(String value) throws NumberFormatException { + return Integer.parseInt(value.trim()); + } + private enum EmptyCellCommentsCheckType { CELL, END_OF_ROW, From 0cbc1cc6db6f80782e578dd7d8bb3a29a0503613 Mon Sep 17 00:00:00 2001 From: PJ Fanning Date: Tue, 5 Aug 2025 11:22:47 +0100 Subject: [PATCH 2/3] try to workaround stray whitespace in sst index --- .../eventusermodel/XSSFSheetXMLHandler.java | 12 ++++-- .../apache/poi/xssf/usermodel/XSSFCell.java | 23 ++++++++--- .../TestXSSFSheetXMLHandler.java | 37 ++++++++++++++++++ .../poi/xssf/usermodel/TestXSSFBugs.java | 28 +++++++++++++ test-data/spreadsheet/bug69769.xlsx | Bin 0 -> 13976 bytes 5 files changed, 91 insertions(+), 9 deletions(-) create mode 100644 test-data/spreadsheet/bug69769.xlsx diff --git a/poi-ooxml/src/main/java/org/apache/poi/xssf/eventusermodel/XSSFSheetXMLHandler.java b/poi-ooxml/src/main/java/org/apache/poi/xssf/eventusermodel/XSSFSheetXMLHandler.java index d0468a25c4f..110d343d7b1 100644 --- a/poi-ooxml/src/main/java/org/apache/poi/xssf/eventusermodel/XSSFSheetXMLHandler.java +++ b/poi-ooxml/src/main/java/org/apache/poi/xssf/eventusermodel/XSSFSheetXMLHandler.java @@ -392,7 +392,7 @@ private void outputCell() { if (this.formatString != null) { try { // Try to use the value as a formattable number - double d = Double.parseDouble(fv); + double d = parseDouble(fv); thisStr = formatter.formatRawCellContents(d, this.formatIndex, this.formatString); } catch (Exception e) { // Formula is a String result not a Numeric one @@ -416,7 +416,7 @@ private void outputCell() { break; case SST_STRING: - String sstIndex = value.toString(); + String sstIndex = value.toString().trim(); if (!sstIndex.isEmpty()) { try { int idx = parseInt(sstIndex); @@ -433,7 +433,7 @@ private void outputCell() { if (this.formatString != null && !n.isEmpty()) { try { thisStr = formatter.formatRawCellContents( - Double.parseDouble(n), this.formatIndex, this.formatString); + parseDouble(n), this.formatIndex, this.formatString); } catch (Exception e) { LOG.atInfo().log( "Error formatting cell '{}' - will use its raw value instead (format '{}')", @@ -523,10 +523,14 @@ private void outputEmptyCellComment(CellAddress cellRef) { output.cell(cellRef.formatAsString(), null, comment); } - private int parseInt(String value) throws NumberFormatException { + private static int parseInt(String value) throws NumberFormatException { return Integer.parseInt(value.trim()); } + private static double parseDouble(String value) throws NumberFormatException { + return Double.parseDouble(value.trim()); + } + private enum EmptyCellCommentsCheckType { CELL, END_OF_ROW, diff --git a/poi-ooxml/src/main/java/org/apache/poi/xssf/usermodel/XSSFCell.java b/poi-ooxml/src/main/java/org/apache/poi/xssf/usermodel/XSSFCell.java index 29088a5b482..d23375fda55 100644 --- a/poi-ooxml/src/main/java/org/apache/poi/xssf/usermodel/XSSFCell.java +++ b/poi-ooxml/src/main/java/org/apache/poi/xssf/usermodel/XSSFCell.java @@ -21,6 +21,8 @@ Licensed to the Apache Software Foundation (ASF) under one or more import java.util.Calendar; import java.util.Date; +import org.apache.logging.log4j.Logger; +import org.apache.poi.logging.PoiLogManager; import org.apache.poi.ss.SpreadsheetVersion; import org.apache.poi.ss.formula.FormulaParser; import org.apache.poi.ss.formula.FormulaRenderer; @@ -73,6 +75,7 @@ Licensed to the Apache Software Foundation (ASF) under one or more */ public final class XSSFCell extends CellBase { + private static final Logger LOG = PoiLogManager.getLogger(XSSFCell.class); private static final String FALSE_AS_STRING = "0"; private static final String TRUE_AS_STRING = "1"; private static final String FALSE = "FALSE"; @@ -244,7 +247,7 @@ public double getNumericCellValue() { return 0.0; } try { - return Double.parseDouble(v); + return parseDouble(v); } catch(NumberFormatException e) { throw typeMismatch(CellType.NUMERIC, CellType.STRING, false); } @@ -330,12 +333,13 @@ private XSSFRichTextString findStringValue() { } else { if (_cell.isSetV()) { try { - int idx = Integer.parseInt(_cell.getV()); + int idx = parseInt(_cell.getV()); rt = (XSSFRichTextString)_sharedStringSource.getItemAt(idx); } catch (Throwable t) { if (ExceptionUtil.isFatal(t)) { ExceptionUtil.rethrow(t); } + LOG.atError().withThrowable(t).log("Failed to parse SST index '{}'", _cell.getV()); rt = new XSSFRichTextString(""); } } else { @@ -1122,12 +1126,12 @@ private boolean convertCellValueToBoolean() { case BOOLEAN: return TRUE_AS_STRING.equals(_cell.getV()); case STRING: - int sstIndex = Integer.parseInt(_cell.getV()); + int sstIndex = parseInt(_cell.getV()); RichTextString rt = _sharedStringSource.getItemAt(sstIndex); String text = rt.getString(); return Boolean.parseBoolean(text); case NUMERIC: - return Double.parseDouble(_cell.getV()) != 0; + return parseDouble(_cell.getV()) != 0; case ERROR: // fall-through @@ -1149,13 +1153,14 @@ private String convertCellValueToString() { return TRUE_AS_STRING.equals(_cell.getV()) ? TRUE : FALSE; case STRING: try { - int sstIndex = Integer.parseInt(_cell.getV()); + int sstIndex = parseInt(_cell.getV()); RichTextString rt = _sharedStringSource.getItemAt(sstIndex); return rt.getString(); } catch (Throwable t) { if (ExceptionUtil.isFatal(t)) { ExceptionUtil.rethrow(t); } + LOG.atError().withThrowable(t).log("Failed to parse SST index '{}'", _cell.getV()); return ""; } case NUMERIC: @@ -1227,4 +1232,12 @@ public void updateCellReferencesForShifting(String msg){ ctCell.setR(r); } + private static int parseInt(String value) throws NumberFormatException { + return Integer.parseInt(value.trim()); + } + + private static double parseDouble(String value) throws NumberFormatException { + return Double.parseDouble(value.trim()); + } + } diff --git a/poi-ooxml/src/test/java/org/apache/poi/xssf/eventusermodel/TestXSSFSheetXMLHandler.java b/poi-ooxml/src/test/java/org/apache/poi/xssf/eventusermodel/TestXSSFSheetXMLHandler.java index b3f12159256..7e5a3071f2c 100644 --- a/poi-ooxml/src/test/java/org/apache/poi/xssf/eventusermodel/TestXSSFSheetXMLHandler.java +++ b/poi-ooxml/src/test/java/org/apache/poi/xssf/eventusermodel/TestXSSFSheetXMLHandler.java @@ -26,7 +26,9 @@ Licensed to the Apache Software Foundation (ASF) under one or more import org.xml.sax.XMLReader; import java.io.InputStream; +import java.util.HashMap; import java.util.Iterator; +import java.util.Map; import static org.junit.jupiter.api.Assertions.assertDoesNotThrow; import static org.junit.jupiter.api.Assertions.assertEquals; @@ -100,4 +102,39 @@ public void cell(final String cellReference, final String formattedValue, } } } + + @Test + void testSstStrayWhitespace() throws Exception { + try (OPCPackage xlsxPackage = OPCPackage.open(_ssTests.openResourceAsStream("bug69769.xlsx"))) { + final XSSFReader reader = new XSSFReader(xlsxPackage); + final Iterator iter = reader.getSheetsData(); + final Map cellValues = new HashMap<>(); + + try (InputStream stream = iter.next()) { + final XMLReader sheetParser = XMLHelper.getSaxParserFactory().newSAXParser().getXMLReader(); + + sheetParser.setContentHandler(new XSSFSheetXMLHandler(reader.getStylesTable(), + new ReadOnlySharedStringsTable(xlsxPackage), new SheetContentsHandler() { + @Override + public void startRow(final int rowNum) { + } + + @Override + public void endRow(final int rowNum) { + } + + @Override + public void cell(final String cellReference, final String formattedValue, + final XSSFComment comment) { + cellValues.put(cellReference, formattedValue); + } + }, false)); + + assertDoesNotThrow(() -> sheetParser.parse(new InputSource(stream))); + + assertEquals(4, cellValues.size()); + assertEquals("Mustermann", cellValues.get("B2")); + } + } + } } diff --git a/poi-ooxml/src/test/java/org/apache/poi/xssf/usermodel/TestXSSFBugs.java b/poi-ooxml/src/test/java/org/apache/poi/xssf/usermodel/TestXSSFBugs.java index ef8c8542a08..22a9ec10e23 100644 --- a/poi-ooxml/src/test/java/org/apache/poi/xssf/usermodel/TestXSSFBugs.java +++ b/poi-ooxml/src/test/java/org/apache/poi/xssf/usermodel/TestXSSFBugs.java @@ -3910,6 +3910,34 @@ void testBug66827() throws Exception { } } + @Test + void testBug69769() throws Exception { + final int expectedCount = 3; + try (XSSFWorkbook wb = openSampleWorkbook("bug69769.xlsx")) { + SharedStringsTable sst = wb.getSharedStringSource(); + assertNotNull(sst); + assertEquals(expectedCount, sst.getCount()); + for (int i = 0; i < expectedCount; i++) { + assertNotNull(sst.getItemAt(i)); + } + XSSFSheet ws = wb.getSheetAt(0); + int nRowCount = ws.getLastRowNum(); + DataFormatter df = new DataFormatter(); + for (int r = 0; r <= nRowCount; r++) { + XSSFRow row = ws.getRow(r); + if (row != null) { + for (Cell cell : row) { + String cellValue = df.formatCellValue(cell); + assertNotNull(cellValue, "Cell value should not be null"); + if (cell.getRowIndex() == 1 && cell.getColumnIndex() == 1) { + assertEquals("Mustermann", cellValue); + } + } + } + } + } + } + private static void readByCommonsCompress(File temp_excel_poi) throws IOException { /* read by commons-compress*/ try (ZipFile zipFile = ZipFile.builder().setFile(temp_excel_poi).get()) { diff --git a/test-data/spreadsheet/bug69769.xlsx b/test-data/spreadsheet/bug69769.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..39262dfff3a63c1c8b0ade40c9f7cb5c2b0e1a3f GIT binary patch literal 13976 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 literal 0 HcmV?d00001 From 6b2e3656778543095b98b6d74ad4254909bc68f7 Mon Sep 17 00:00:00 2001 From: PJ Fanning Date: Tue, 5 Aug 2025 11:44:41 +0100 Subject: [PATCH 3/3] Update TestAllFiles.java --- .../src/test/java/org/apache/poi/stress/TestAllFiles.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/poi-integration/src/test/java/org/apache/poi/stress/TestAllFiles.java b/poi-integration/src/test/java/org/apache/poi/stress/TestAllFiles.java index 957b804ff59..8988c8a1804 100644 --- a/poi-integration/src/test/java/org/apache/poi/stress/TestAllFiles.java +++ b/poi-integration/src/test/java/org/apache/poi/stress/TestAllFiles.java @@ -100,6 +100,9 @@ public class TestAllFiles { // stress docs "document/deep-table-cell.docx", + // invalid files + "spreadsheet/bug69769.xlsx", + // NOTE: Expected failures should usually be added in file "stress.xls" instead // of being listed here in order to also verify the expected exception details! };