Browse Source

fixed XSSFCell.getStringCellValue() to properly handle cached formula results

git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@819106 13f79535-47bb-0310-9956-ffa450edef68
tags/REL_3_6
Yegor Kozlov 14 years ago
parent
commit
4669ec9f5d

+ 1
- 0
src/documentation/content/xdocs/status.xml View File



<changes> <changes>
<release version="3.6-beta1" date="2009-??-??"> <release version="3.6-beta1" date="2009-??-??">
<action dev="POI-DEVELOPERS" type="fix">47889 - fixed XSSFCell.getStringCellValue() to properly handle cached formula results</action>
</release> </release>
<release version="3.5-FINAL" date="2009-09-28"> <release version="3.5-FINAL" date="2009-09-28">
<action dev="POI-DEVELOPERS" type="fix">47747 - fixed logic for locating shared formula records</action> <action dev="POI-DEVELOPERS" type="fix">47747 - fixed logic for locating shared formula records</action>

+ 11
- 5
src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFCell.java View File

} else { } else {
rt = new XSSFRichTextString(""); rt = new XSSFRichTextString("");
} }
} else if (_cell.getT() == STCellType.STR) {
//cached formula value
rt = new XSSFRichTextString(_cell.isSetV() ? _cell.getV() : "");
} else { } else {
if (_cell.isSetV()) { if (_cell.isSetV()) {
int idx = Integer.parseInt(_cell.getV()); int idx = Integer.parseInt(_cell.getV());
/** /**
* Return the cell's style. * Return the cell's style.
* *
* @return the cell's style. Always not-null. Default cell style has zero index and can be obtained as
* <code>workbook.getCellStyleAt(0)</code>
* @return the cell's style.</code>
*/ */
public XSSFCellStyle getCellStyle() { public XSSFCellStyle getCellStyle() {
long idx = _cell.isSetS() ? _cell.getS() : 0;
return _stylesSource.getStyleAt((int)idx);
XSSFCellStyle style = null;
if(_stylesSource.getNumCellStyles() > 0){
long idx = _cell.isSetS() ? _cell.getS() : 0;
style = _stylesSource.getStyleAt((int)idx);
}
return style;
} }


/** /**
private void setBlank(){ private void setBlank(){
CTCell blank = CTCell.Factory.newInstance(); CTCell blank = CTCell.Factory.newInstance();
blank.setR(_cell.getR()); blank.setR(_cell.getR());
blank.setS(_cell.getS());
if(_cell.isSetS()) blank.setS(_cell.getS());
_cell.set(blank); _cell.set(blank);
} }



+ 61
- 0
src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFCell.java View File

import org.apache.poi.xssf.XSSFITestDataProvider; import org.apache.poi.xssf.XSSFITestDataProvider;
import org.apache.poi.xssf.model.SharedStringsTable; import org.apache.poi.xssf.model.SharedStringsTable;
import org.openxmlformats.schemas.spreadsheetml.x2006.main.STCellType; import org.openxmlformats.schemas.spreadsheetml.x2006.main.STCellType;
import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTCell;


/** /**
* @author Yegor Kozlov * @author Yegor Kozlov
assertEquals(0, sst.getCount()); assertEquals(0, sst.getCount());
assertEquals(XSSFCell.CELL_TYPE_BLANK, cell_1.getCellType()); assertEquals(XSSFCell.CELL_TYPE_BLANK, cell_1.getCellType());
} }

public void testFormulaString() {
XSSFWorkbook wb = new XSSFWorkbook();
XSSFCell cell = wb.createSheet().createRow(0).createCell(0);
CTCell ctCell = cell.getCTCell(); //low-level bean holding cell's xml

cell.setCellFormula("A2");
assertEquals(XSSFCell.CELL_TYPE_FORMULA, cell.getCellType());
//the value is not set and cell's type='N' which means blank
assertEquals(STCellType.N, ctCell.getT());

//set cached formula value
cell.setCellValue("t='str'");
//we are still of 'formula' type
assertEquals(XSSFCell.CELL_TYPE_FORMULA, cell.getCellType());
//cached formula value is set and cell's type='STR'
assertEquals(STCellType.STR, ctCell.getT());
assertEquals("t='str'", cell.getStringCellValue());

//now remove the formula, the cached formula result remains
cell.setCellFormula(null);
assertEquals(XSSFCell.CELL_TYPE_STRING, cell.getCellType());
assertEquals(STCellType.STR, ctCell.getT());
//the line below failed prior to fix of Bug #47889
assertEquals("t='str'", cell.getStringCellValue());

//revert to a blank cell
cell.setCellValue((String)null);
assertEquals(XSSFCell.CELL_TYPE_BLANK, cell.getCellType());
assertEquals(STCellType.N, ctCell.getT());
assertEquals("", cell.getStringCellValue());
}

/**
* Bug 47889: problems when calling XSSFCell.getStringCellValue() on a workbook created in Gnumeric
*/
public void test47889() {
XSSFWorkbook wb = (XSSFWorkbook)_testDataProvider.openSampleWorkbook("47889.xlsx");
XSSFSheet sh = wb.getSheetAt(0);

XSSFCell cell;

//try a string cell
cell = sh.getRow(0).getCell(0);
assertEquals(XSSFCell.CELL_TYPE_STRING, cell.getCellType());
assertEquals("a", cell.getStringCellValue());
assertEquals("a", cell.toString());
//Gnumeric produces spreadsheets without styles
//make sure we return null for that instead of throwing OutOfBounds
assertEquals(null, cell.getCellStyle());

//try a numeric cell
cell = sh.getRow(1).getCell(0);
assertEquals(XSSFCell.CELL_TYPE_NUMERIC, cell.getCellType());
assertEquals(1.0, cell.getNumericCellValue());
assertEquals("1.0", cell.toString());
//Gnumeric produces spreadsheets without styles
//make sure we return null for that instead of throwing OutOfBounds
assertEquals(null, cell.getCellStyle());
}
} }

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


Loading…
Cancel
Save