From efc032babcad23fd84fc0ffce0560c86771a486f Mon Sep 17 00:00:00 2001 From: PJ Fanning Date: Mon, 28 Nov 2022 13:05:45 +0000 Subject: [PATCH] [bug-66365] rework XSSFCell getRichStringCellValue and getStringCellValue to better support array formula results. Thanks to Espen Amble Kolstad. git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1905571 13f79535-47bb-0310-9956-ffa450edef68 --- .../apache/poi/xssf/usermodel/XSSFCell.java | 60 ++++++++++-------- .../poi/xssf/usermodel/TestXSSFWorkbook.java | 11 ++++ src/resources/ooxml-lite-report.xsb | 5 ++ test-data/spreadsheet/66365.xlsx | Bin 0 -> 4753 bytes 4 files changed, 49 insertions(+), 27 deletions(-) create mode 100644 test-data/spreadsheet/66365.xlsx 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 bbdb2c35e5..13c1e7848c 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 @@ -297,39 +297,14 @@ public final class XSSFCell extends CellBase { rt = new XSSFRichTextString(""); break; case STRING: - STCellType.Enum xmlbeanCellType = _cell.getT(); - if (xmlbeanCellType == STCellType.INLINE_STR) { - if(_cell.isSetIs()) { - //string is expressed directly in the cell definition instead of implementing the shared string table. - rt = new XSSFRichTextString(_cell.getIs()); - } else if (_cell.isSetV()) { - //cached result of a formula - rt = new XSSFRichTextString(_cell.getV()); - } else { - rt = new XSSFRichTextString(""); - } - } else if (xmlbeanCellType == STCellType.STR) { - //cached formula value - rt = new XSSFRichTextString(_cell.isSetV() ? _cell.getV() : ""); - } else { - if (_cell.isSetV()) { - try { - int idx = Integer.parseInt(_cell.getV()); - rt = (XSSFRichTextString)_sharedStringSource.getItemAt(idx); - } catch(Throwable t) { - rt = new XSSFRichTextString(""); - } - } else { - rt = new XSSFRichTextString(""); - } - } + rt = findStringValue(); break; case FORMULA: { CellType cachedValueType = getBaseCellType(false); if (cachedValueType != CellType.STRING) { throw typeMismatch(CellType.STRING, cachedValueType, true); } - rt = new XSSFRichTextString(_cell.isSetV() ? _cell.getV() : ""); + rt = findStringValue(); break; } default: @@ -339,6 +314,37 @@ public final class XSSFCell extends CellBase { return rt; } + private XSSFRichTextString findStringValue() { + XSSFRichTextString rt; + STCellType.Enum xmlbeanCellType = _cell.getT(); + if (xmlbeanCellType == STCellType.INLINE_STR) { + if(_cell.isSetIs()) { + //string is expressed directly in the cell definition instead of implementing the shared string table. + rt = new XSSFRichTextString(_cell.getIs()); + } else if (_cell.isSetV()) { + //cached result of a formula + rt = new XSSFRichTextString(_cell.getV()); + } else { + rt = new XSSFRichTextString(""); + } + } else if (xmlbeanCellType == STCellType.STR) { + //cached formula value + rt = new XSSFRichTextString(_cell.isSetV() ? _cell.getV() : ""); + } else { + if (_cell.isSetV()) { + try { + int idx = Integer.parseInt(_cell.getV()); + rt = (XSSFRichTextString)_sharedStringSource.getItemAt(idx); + } catch(Throwable t) { + rt = new XSSFRichTextString(""); + } + } else { + rt = new XSSFRichTextString(""); + } + } + return rt; + } + @Override protected void setCellValueImpl(String value) { setCellValueImpl(new XSSFRichTextString(value)); diff --git a/poi-ooxml/src/test/java/org/apache/poi/xssf/usermodel/TestXSSFWorkbook.java b/poi-ooxml/src/test/java/org/apache/poi/xssf/usermodel/TestXSSFWorkbook.java index ab606f93dc..ac903cc661 100644 --- a/poi-ooxml/src/test/java/org/apache/poi/xssf/usermodel/TestXSSFWorkbook.java +++ b/poi-ooxml/src/test/java/org/apache/poi/xssf/usermodel/TestXSSFWorkbook.java @@ -754,6 +754,17 @@ public final class TestXSSFWorkbook extends BaseTestXWorkbook { } } + @Test + void bug66365() throws Exception { + try (XSSFWorkbook wb = openSampleWorkbook("66365.xlsx")) { + XSSFSheet sheet1 = wb.getSheetAt(0); + assertEquals(sheet1.getRow(0).getCell(0).getStringCellValue(), + sheet1.getRow(0).getCell(1).getStringCellValue()); + assertEquals(sheet1.getRow(1).getCell(0).getStringCellValue(), + sheet1.getRow(1).getCell(1).getStringCellValue()); + } + } + private static final int INDEX_NOT_FOUND = -1; private static boolean isEmpty(CharSequence cs) { diff --git a/src/resources/ooxml-lite-report.xsb b/src/resources/ooxml-lite-report.xsb index 252580de10..352d650408 100644 --- a/src/resources/ooxml-lite-report.xsb +++ b/src/resources/ooxml-lite-report.xsb @@ -1168,3 +1168,8 @@ ctshapenonvisual6121type ctsdtrow2f71type ctsdtcontentrow740etype cttableformulaf801type +sttotalsrowfunctioncb72type +ctbubblechart3ff4type +ctbubblesere172type +ctdlblpos9ce4type +stdlblpos1cf4type diff --git a/test-data/spreadsheet/66365.xlsx b/test-data/spreadsheet/66365.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..e308de27c3e71d7159e17afdffcc4b9ff6e22bc9 GIT binary patch literal 4753 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 literal 0 HcmV?d00001 -- 2.39.5