diff --git a/src/ooxml/java/org/apache/poi/xssf/streaming/SXSSFCell.java b/src/ooxml/java/org/apache/poi/xssf/streaming/SXSSFCell.java index f871f597b..c95430bfc 100644 --- a/src/ooxml/java/org/apache/poi/xssf/streaming/SXSSFCell.java +++ b/src/ooxml/java/org/apache/poi/xssf/streaming/SXSSFCell.java @@ -908,7 +908,9 @@ public class SXSSFCell implements Cell { } private String convertCellValueToString() { int cellType = getCellType(); - + return convertCellValueToString(cellType); + } + private String convertCellValueToString(int cellType) { switch (cellType) { case CELL_TYPE_BLANK: return ""; @@ -922,6 +924,12 @@ public class SXSSFCell implements Cell { byte errVal = getErrorCellValue(); return FormulaError.forInt(errVal).getString(); case CELL_TYPE_FORMULA: + if (_value != null) { + FormulaValue fv = (FormulaValue)_value; + if (fv.getFormulaType() != CELL_TYPE_FORMULA) { + return convertCellValueToString(fv.getFormulaType()); + } + } return ""; default: throw new IllegalStateException("Unexpected cell type (" + cellType + ")"); diff --git a/src/ooxml/java/org/apache/poi/xssf/streaming/SXSSFCreationHelper.java b/src/ooxml/java/org/apache/poi/xssf/streaming/SXSSFCreationHelper.java index d641583fd..128803bfe 100644 --- a/src/ooxml/java/org/apache/poi/xssf/streaming/SXSSFCreationHelper.java +++ b/src/ooxml/java/org/apache/poi/xssf/streaming/SXSSFCreationHelper.java @@ -17,6 +17,11 @@ package org.apache.poi.xssf.streaming; +import org.apache.poi.ss.usermodel.ClientAnchor; +import org.apache.poi.ss.usermodel.CreationHelper; +import org.apache.poi.ss.usermodel.DataFormat; +import org.apache.poi.ss.usermodel.ExtendedColor; +import org.apache.poi.ss.usermodel.Hyperlink; import org.apache.poi.util.POILogFactory; import org.apache.poi.util.POILogger; import org.apache.poi.xssf.usermodel.XSSFCreationHelper; @@ -27,13 +32,14 @@ import org.apache.poi.xssf.usermodel.XSSFRichTextString; * based on the Streaming Workbook, and some on the related * regular XSSF Workbook */ -public class SXSSFCreationHelper extends XSSFCreationHelper { +public class SXSSFCreationHelper implements CreationHelper { private static POILogger logger = POILogFactory.getLogger(SXSSFCreationHelper.class); private SXSSFWorkbook wb; + private XSSFCreationHelper helper; public SXSSFCreationHelper(SXSSFWorkbook workbook) { - super(workbook.getXSSFWorkbook()); + this.helper = new XSSFCreationHelper(workbook.getXSSFWorkbook()); this.wb = workbook; } @@ -45,4 +51,18 @@ public class SXSSFCreationHelper extends XSSFCreationHelper { public SXSSFFormulaEvaluator createFormulaEvaluator() { return new SXSSFFormulaEvaluator(wb); } + + // Pass-through methods + public DataFormat createDataFormat() { + return helper.createDataFormat(); + } + public Hyperlink createHyperlink(int type) { + return helper.createHyperlink(type); + } + public ExtendedColor createExtendedColor() { + return helper.createExtendedColor(); + } + public ClientAnchor createClientAnchor() { + return helper.createClientAnchor(); + } } diff --git a/src/ooxml/java/org/apache/poi/xssf/streaming/SXSSFFormulaEvaluator.java b/src/ooxml/java/org/apache/poi/xssf/streaming/SXSSFFormulaEvaluator.java index 40abe9fe8..ff81cd357 100644 --- a/src/ooxml/java/org/apache/poi/xssf/streaming/SXSSFFormulaEvaluator.java +++ b/src/ooxml/java/org/apache/poi/xssf/streaming/SXSSFFormulaEvaluator.java @@ -25,13 +25,13 @@ import org.apache.poi.ss.usermodel.Cell; import org.apache.poi.ss.usermodel.Row; import org.apache.poi.util.POILogFactory; import org.apache.poi.util.POILogger; -import org.apache.poi.xssf.usermodel.XSSFFormulaEvaluator; +import org.apache.poi.xssf.usermodel.BaseXSSFFormulaEvaluator; /** * Streaming-specific Formula Evaluator, which is able to * lookup cells within the current Window. */ -public class SXSSFFormulaEvaluator extends XSSFFormulaEvaluator { +public final class SXSSFFormulaEvaluator extends BaseXSSFFormulaEvaluator { private static POILogger logger = POILogFactory.getLogger(SXSSFFormulaEvaluator.class); private SXSSFWorkbook wb; @@ -43,7 +43,7 @@ public class SXSSFFormulaEvaluator extends XSSFFormulaEvaluator { this(workbook, new WorkbookEvaluator(SXSSFEvaluationWorkbook.create(workbook), stabilityClassifier, udfFinder)); } private SXSSFFormulaEvaluator(SXSSFWorkbook workbook, WorkbookEvaluator bookEvaluator) { - super(workbook.getXSSFWorkbook(), bookEvaluator); + super(bookEvaluator); this.wb = workbook; } @@ -70,6 +70,26 @@ public class SXSSFFormulaEvaluator extends XSSFFormulaEvaluator { return new SXSSFEvaluationCell((SXSSFCell)cell); } + /** + * If cell contains formula, it evaluates the formula, and + * puts the formula result back into the cell, in place + * of the old formula. + * Else if cell does not contain formula, this method leaves + * the cell unchanged. + * Note that the same instance of SXSSFCell is returned to + * allow chained calls like: + *
+     * int evaluatedCellType = evaluator.evaluateInCell(cell).getCellType();
+     * 
+ * Be aware that your cell value will be changed to hold the + * result of the formula. If you simply want the formula + * value computed for you, use {@link #evaluateFormulaCell(org.apache.poi.ss.usermodel.Cell)} } + */ + public SXSSFCell evaluateInCell(Cell cell) { + doEvaluateInCell(cell); + return (SXSSFCell)cell; + } + /** * For active worksheets only, will loop over rows and * cells, evaluating formula cells there. diff --git a/src/ooxml/testcases/org/apache/poi/xssf/streaming/TestSXSSFCell.java b/src/ooxml/testcases/org/apache/poi/xssf/streaming/TestSXSSFCell.java index 86fda394c..25f1d1917 100644 --- a/src/ooxml/testcases/org/apache/poi/xssf/streaming/TestSXSSFCell.java +++ b/src/ooxml/testcases/org/apache/poi/xssf/streaming/TestSXSSFCell.java @@ -30,7 +30,6 @@ import org.apache.poi.xssf.SXSSFITestDataProvider; import org.apache.poi.xssf.usermodel.XSSFCell; import org.apache.poi.xssf.usermodel.XSSFWorkbook; import org.apache.xmlbeans.XmlCursor; -import org.junit.Ignore; import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTRst; /** @@ -48,51 +47,6 @@ public class TestSXSSFCell extends BaseTestXCell { SXSSFITestDataProvider.instance.cleanup(); } - /** - * this test involves evaluation of formulas which isn't supported for SXSSF - */ - @Override - public void testConvertStringFormulaCell() { - try { - super.testConvertStringFormulaCell(); - fail("expected exception"); - } catch (IllegalArgumentException e){ - assertEquals( - "Unexpected type of cell: class org.apache.poi.xssf.streaming.SXSSFCell. " + - "Only XSSFCells can be evaluated.", e.getMessage()); - } catch (ClassCastException e) {} // TODO Temporary workaround during #58200 - } - - /** - * this test involves evaluation of formulas which isn't supported for SXSSF - */ - @Override - public void testSetTypeStringOnFormulaCell() { - try { - super.testSetTypeStringOnFormulaCell(); - fail("expected exception"); - } catch (IllegalArgumentException e){ - assertEquals( - "Unexpected type of cell: class org.apache.poi.xssf.streaming.SXSSFCell. " + - "Only XSSFCells can be evaluated.", e.getMessage()); - } catch (ClassCastException e) {} // TODO Temporary workaround during #58200 - } - - /** - * this test involves evaluation of formulas which isn't supported for SXSSF - */ - @Override - public void testGetErrorCellValueFromFormulaCell() { - try { - super.testConvertStringFormulaCell(); - fail("expected exception"); - } catch (IllegalArgumentException e){ - assertEquals( - "Unexpected type of cell: class org.apache.poi.xssf.streaming.SXSSFCell. " + - "Only XSSFCells can be evaluated.", e.getMessage()); - } catch (ClassCastException e) {} // TODO Temporary workaround during #58200 - } - public void testPreserveSpaces() throws IOException { String[] samplesWithSpaces = { " POI",