aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorYegor Kozlov <yegor@apache.org>2009-09-26 10:41:01 +0000
committerYegor Kozlov <yegor@apache.org>2009-09-26 10:41:01 +0000
commit4669ec9f5dad0bcd81c8a2b41439be2e283f0fd9 (patch)
treec0bb2e4ea934e1a9fb773304f321fc0da599c29b
parent49d360bcd840ee034f7dc3818f028c3e14b94449 (diff)
downloadpoi-4669ec9f5dad0bcd81c8a2b41439be2e283f0fd9.tar.gz
poi-4669ec9f5dad0bcd81c8a2b41439be2e283f0fd9.zip
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
-rw-r--r--src/documentation/content/xdocs/status.xml1
-rw-r--r--src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFCell.java16
-rw-r--r--src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFCell.java61
-rw-r--r--test-data/spreadsheet/47889.xlsxbin0 -> 3555 bytes
4 files changed, 73 insertions, 5 deletions
diff --git a/src/documentation/content/xdocs/status.xml b/src/documentation/content/xdocs/status.xml
index d44bc902ad..446790656c 100644
--- a/src/documentation/content/xdocs/status.xml
+++ b/src/documentation/content/xdocs/status.xml
@@ -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>
diff --git a/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFCell.java b/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFCell.java
index e76f22a97b..aee0405b2f 100644
--- a/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFCell.java
+++ b/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFCell.java
@@ -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);
}
diff --git a/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFCell.java b/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFCell.java
index 194a983e25..e097bfd140 100644
--- a/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFCell.java
+++ b/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFCell.java
@@ -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());
+ }
}
diff --git a/test-data/spreadsheet/47889.xlsx b/test-data/spreadsheet/47889.xlsx
new file mode 100644
index 0000000000..d4b23abc21
--- /dev/null
+++ b/test-data/spreadsheet/47889.xlsx
Binary files differ