aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--poi-ooxml/src/main/java/org/apache/poi/xssf/usermodel/XSSFCell.java60
-rw-r--r--poi-ooxml/src/test/java/org/apache/poi/xssf/usermodel/TestXSSFWorkbook.java11
-rw-r--r--src/resources/ooxml-lite-report.xsb5
-rw-r--r--test-data/spreadsheet/66365.xlsxbin0 -> 4753 bytes
4 files changed, 49 insertions, 27 deletions
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
--- /dev/null
+++ b/test-data/spreadsheet/66365.xlsx
Binary files differ