Browse Source

[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
tags/REL_5_2_4
PJ Fanning 1 year ago
parent
commit
efc032babc

+ 33
- 27
poi-ooxml/src/main/java/org/apache/poi/xssf/usermodel/XSSFCell.java View File

@@ -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));

+ 11
- 0
poi-ooxml/src/test/java/org/apache/poi/xssf/usermodel/TestXSSFWorkbook.java View File

@@ -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) {

+ 5
- 0
src/resources/ooxml-lite-report.xsb View File

@@ -1168,3 +1168,8 @@ ctshapenonvisual6121type
ctsdtrow2f71type
ctsdtcontentrow740etype
cttableformulaf801type
sttotalsrowfunctioncb72type
ctbubblechart3ff4type
ctbubblesere172type
ctdlblpos9ce4type
stdlblpos1cf4type

BIN
test-data/spreadsheet/66365.xlsx View File


Loading…
Cancel
Save