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

rt = new XSSFRichTextString(""); rt = new XSSFRichTextString("");
break; break;
case STRING: 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; break;
case FORMULA: { case FORMULA: {
CellType cachedValueType = getBaseCellType(false); CellType cachedValueType = getBaseCellType(false);
if (cachedValueType != CellType.STRING) { if (cachedValueType != CellType.STRING) {
throw typeMismatch(CellType.STRING, cachedValueType, true); throw typeMismatch(CellType.STRING, cachedValueType, true);
} }
rt = new XSSFRichTextString(_cell.isSetV() ? _cell.getV() : "");
rt = findStringValue();
break; break;
} }
default: default:
return rt; 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 @Override
protected void setCellValueImpl(String value) { protected void setCellValueImpl(String value) {
setCellValueImpl(new XSSFRichTextString(value)); setCellValueImpl(new XSSFRichTextString(value));

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

} }
} }


@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 final int INDEX_NOT_FOUND = -1;


private static boolean isEmpty(CharSequence cs) { private static boolean isEmpty(CharSequence cs) {

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

ctsdtrow2f71type ctsdtrow2f71type
ctsdtcontentrow740etype ctsdtcontentrow740etype
cttableformulaf801type cttableformulaf801type
sttotalsrowfunctioncb72type
ctbubblechart3ff4type
ctbubblesere172type
ctdlblpos9ce4type
stdlblpos1cf4type

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


Loading…
Cancel
Save