[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
This commit is contained in:
PJ Fanning 2022-11-28 13:05:45 +00:00
parent 17bcceb615
commit efc032babc
4 changed files with 49 additions and 27 deletions

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

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

View File

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

Binary file not shown.