Fixed XSSFCell to properly read inline strings

git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@777834 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
Yegor Kozlov 2009-05-23 08:20:55 +00:00
parent b61446ecb0
commit e4599a03ae
5 changed files with 45 additions and 4 deletions

View File

@ -37,6 +37,7 @@
<!-- Don't forget to update status.xml too! -->
<release version="3.5-beta6" date="2009-??-??">
<action dev="POI-DEVELOPERS" type="fix">47206 - Fixed XSSFCell to properly read inline strings</action>
<action dev="POI-DEVELOPERS" type="add">47250 - Fixed FontRecord to expect unicode flags even when name length is zero</action>
<action dev="POI-DEVELOPERS" type="add">47198 - Fixed formula evaluator comparison of -0.0 and 0.0</action>
<action dev="POI-DEVELOPERS" type="add">47229 - Fixed ExternalNameRecord to handle DDE links</action>

View File

@ -34,6 +34,7 @@
<!-- Don't forget to update changes.xml too! -->
<changes>
<release version="3.5-beta6" date="2009-??-??">
<action dev="POI-DEVELOPERS" type="fix">47206 - Fixed XSSFCell to properly read inline strings</action>
<action dev="POI-DEVELOPERS" type="add">47250 - Fixed FontRecord to expect unicode flags even when name length is zero</action>
<action dev="POI-DEVELOPERS" type="add">47198 - Fixed formula evaluator comparison of -0.0 and 0.0</action>
<action dev="POI-DEVELOPERS" type="add">47229 - Fixed ExternalNameRecord to handle DDE links</action>

View File

@ -242,14 +242,24 @@ public final class XSSFCell implements Cell {
rt = new XSSFRichTextString("");
break;
case CELL_TYPE_STRING:
if (!cell.isSetV()) rt = new XSSFRichTextString("");
else {
if (cell.getT() == STCellType.INLINE_STR) {
return new XSSFRichTextString(cell.getV());
if (cell.getT() == 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 (cell.isSetV()) {
int idx = Integer.parseInt(cell.getV());
rt = new XSSFRichTextString(sharedStringSource.getEntryAt(idx));
}
else {
rt = new XSSFRichTextString("");
}
}
break;
case CELL_TYPE_FORMULA:

View File

@ -19,6 +19,7 @@ package org.apache.poi.xssf.usermodel;
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.XSSFITestDataProvider;
import org.openxmlformats.schemas.spreadsheetml.x2006.main.STCellType;
/**
* @author Yegor Kozlov
@ -50,4 +51,32 @@ public final class TestXSSFCell extends BaseTestCell {
cell.setCellFormula(null);
cell.setCellValue("456");
}
/**
* Test that we can read inline strings that are expressed directly in the cell definition
* instead of implementing the shared string table.
*
* Some programs, for example, Microsoft Excel Driver for .xlsx insert inline string
* instead of using the shared string table. See bug 47206
*/
public void testInlineString() throws Exception {
XSSFWorkbook wb = (XSSFWorkbook)_testDataProvider.openSampleWorkbook("xlsx-jdbc.xlsx");
XSSFSheet sheet = wb.getSheetAt(0);
XSSFRow row = sheet.getRow(1);
XSSFCell cell_0 = row.getCell(0);
assertEquals(STCellType.INT_INLINE_STR, cell_0.getCTCell().getT().intValue());
assertTrue(cell_0.getCTCell().isSetIs());
assertEquals("A Very large string in column 1 AAAAAAAAAAAAAAAAAAAAA", cell_0.getStringCellValue());
XSSFCell cell_1 = row.getCell(1);
assertEquals(STCellType.INT_INLINE_STR, cell_1.getCTCell().getT().intValue());
assertTrue(cell_1.getCTCell().isSetIs());
assertEquals("foo", cell_1.getStringCellValue());
XSSFCell cell_2 = row.getCell(2);
assertEquals(STCellType.INT_INLINE_STR, cell_2.getCTCell().getT().intValue());
assertTrue(cell_2.getCTCell().isSetIs());
assertEquals("bar", row.getCell(2).getStringCellValue());
}
}

Binary file not shown.