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
This commit is contained in:
parent
52756862f5
commit
ecb5344937
@ -33,6 +33,7 @@
|
||||
|
||||
<changes>
|
||||
<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 version="3.5-FINAL" date="2009-09-28">
|
||||
<action dev="POI-DEVELOPERS" type="fix">47747 - fixed logic for locating shared formula records</action>
|
||||
|
@ -249,6 +249,9 @@ public final class XSSFCell implements Cell {
|
||||
} else {
|
||||
rt = new XSSFRichTextString("");
|
||||
}
|
||||
} else if (_cell.getT() == STCellType.STR) {
|
||||
//cached formula value
|
||||
rt = new XSSFRichTextString(_cell.isSetV() ? _cell.getV() : "");
|
||||
} else {
|
||||
if (_cell.isSetV()) {
|
||||
int idx = Integer.parseInt(_cell.getV());
|
||||
@ -411,12 +414,15 @@ public final class XSSFCell implements Cell {
|
||||
/**
|
||||
* 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() {
|
||||
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;
|
||||
}
|
||||
|
||||
/**
|
||||
@ -629,7 +635,7 @@ public final class XSSFCell implements Cell {
|
||||
private void setBlank(){
|
||||
CTCell blank = CTCell.Factory.newInstance();
|
||||
blank.setR(_cell.getR());
|
||||
blank.setS(_cell.getS());
|
||||
if(_cell.isSetS()) blank.setS(_cell.getS());
|
||||
_cell.set(blank);
|
||||
}
|
||||
|
||||
|
@ -21,6 +21,7 @@ import org.apache.poi.ss.usermodel.*;
|
||||
import org.apache.poi.xssf.XSSFITestDataProvider;
|
||||
import org.apache.poi.xssf.model.SharedStringsTable;
|
||||
import org.openxmlformats.schemas.spreadsheetml.x2006.main.STCellType;
|
||||
import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTCell;
|
||||
|
||||
/**
|
||||
* @author Yegor Kozlov
|
||||
@ -105,4 +106,64 @@ public final class TestXSSFCell extends BaseTestCell {
|
||||
assertEquals(0, sst.getCount());
|
||||
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
Normal file
BIN
test-data/spreadsheet/47889.xlsx
Normal file
Binary file not shown.
Loading…
Reference in New Issue
Block a user