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 0000000000..e308de27c3 Binary files /dev/null and b/test-data/spreadsheet/66365.xlsx differ