mirror of https://github.com/apache/poi.git
Prepare for SXSSF evaluation #58200
git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1693644 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
parent
024477c507
commit
93e23d189a
|
@ -0,0 +1,47 @@
|
||||||
|
/* ====================================================================
|
||||||
|
Licensed to the Apache Software Foundation (ASF) under one or more
|
||||||
|
contributor license agreements. See the NOTICE file distributed with
|
||||||
|
this work for additional information regarding copyright ownership.
|
||||||
|
The ASF licenses this file to You under the Apache License, Version 2.0
|
||||||
|
(the "License"); you may not use this file except in compliance with
|
||||||
|
the License. You may obtain a copy of the License at
|
||||||
|
|
||||||
|
http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing, software
|
||||||
|
distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
See the License for the specific language governing permissions and
|
||||||
|
limitations under the License.
|
||||||
|
==================================================================== */
|
||||||
|
|
||||||
|
package org.apache.poi.xssf.streaming;
|
||||||
|
|
||||||
|
import org.apache.poi.ss.formula.EvaluationCell;
|
||||||
|
import org.apache.poi.ss.formula.EvaluationSheet;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* SXSSF wrapper for a sheet under evaluation
|
||||||
|
*/
|
||||||
|
final class SXSSFEvaluationSheet implements EvaluationSheet {
|
||||||
|
private final SXSSFSheet _xs;
|
||||||
|
|
||||||
|
public SXSSFEvaluationSheet(SXSSFSheet sheet) {
|
||||||
|
_xs = sheet;
|
||||||
|
}
|
||||||
|
|
||||||
|
public SXSSFSheet getSXSSFSheet() {
|
||||||
|
return _xs;
|
||||||
|
}
|
||||||
|
public EvaluationCell getCell(int rowIndex, int columnIndex) {
|
||||||
|
SXSSFRow row = _xs.getRow(rowIndex);
|
||||||
|
if (row == null) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
SXSSFCell cell = row.getCell(columnIndex);
|
||||||
|
if (cell == null) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
return new SXSSFEvaluationCell(cell, this);
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,25 @@
|
||||||
|
/* ====================================================================
|
||||||
|
Licensed to the Apache Software Foundation (ASF) under one or more
|
||||||
|
contributor license agreements. See the NOTICE file distributed with
|
||||||
|
this work for additional information regarding copyright ownership.
|
||||||
|
The ASF licenses this file to You under the Apache License, Version 2.0
|
||||||
|
(the "License"); you may not use this file except in compliance with
|
||||||
|
the License. You may obtain a copy of the License at
|
||||||
|
|
||||||
|
http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing, software
|
||||||
|
distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
See the License for the specific language governing permissions and
|
||||||
|
limitations under the License.
|
||||||
|
==================================================================== */
|
||||||
|
|
||||||
|
package org.apache.poi.xssf.streaming;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* SXSSF wrapper around the SXSSF and XSSF workbooks
|
||||||
|
*/
|
||||||
|
public final class SXSSFEvaluationWorkbook {
|
||||||
|
// TODO Refactor XSSFEvaluationWorkbook then extend
|
||||||
|
}
|
|
@ -17,6 +17,9 @@
|
||||||
|
|
||||||
package org.apache.poi.xssf.streaming;
|
package org.apache.poi.xssf.streaming;
|
||||||
|
|
||||||
|
import org.apache.poi.ss.formula.EvaluationCell;
|
||||||
|
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.POILogFactory;
|
||||||
import org.apache.poi.util.POILogger;
|
import org.apache.poi.util.POILogger;
|
||||||
import org.apache.poi.xssf.usermodel.XSSFFormulaEvaluator;
|
import org.apache.poi.xssf.usermodel.XSSFFormulaEvaluator;
|
||||||
|
@ -35,6 +38,19 @@ public class SXSSFFormulaEvaluator extends XSSFFormulaEvaluator {
|
||||||
this.wb = workbook;
|
this.wb = workbook;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Turns a SXSSFCell into a SXSSFEvaluationCell
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
protected EvaluationCell toEvaluationCell(Cell cell) {
|
||||||
|
if (!(cell instanceof SXSSFCell)){
|
||||||
|
throw new IllegalArgumentException("Unexpected type of cell: " + cell.getClass() + "." +
|
||||||
|
" Only SXSSFCells can be evaluated.");
|
||||||
|
}
|
||||||
|
|
||||||
|
return new SXSSFEvaluationCell((SXSSFCell)cell);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* For active worksheets only, will loop over rows and
|
* For active worksheets only, will loop over rows and
|
||||||
* cells, evaluating formula cells there.
|
* cells, evaluating formula cells there.
|
||||||
|
@ -42,6 +58,8 @@ public class SXSSFFormulaEvaluator extends XSSFFormulaEvaluator {
|
||||||
* it can either skip them silently, or give an exception
|
* it can either skip them silently, or give an exception
|
||||||
*/
|
*/
|
||||||
public static void evaluateAllFormulaCells(SXSSFWorkbook wb, boolean skipOutOfWindow) {
|
public static void evaluateAllFormulaCells(SXSSFWorkbook wb, boolean skipOutOfWindow) {
|
||||||
|
SXSSFFormulaEvaluator eval = new SXSSFFormulaEvaluator(wb);
|
||||||
|
|
||||||
// Check they're all available
|
// Check they're all available
|
||||||
for (int i=0; i<wb.getNumberOfSheets(); i++) {
|
for (int i=0; i<wb.getNumberOfSheets(); i++) {
|
||||||
SXSSFSheet s = wb.getSheetAt(i);
|
SXSSFSheet s = wb.getSheetAt(i);
|
||||||
|
@ -53,7 +71,24 @@ public class SXSSFFormulaEvaluator extends XSSFFormulaEvaluator {
|
||||||
// Process the sheets as best we can
|
// Process the sheets as best we can
|
||||||
for (int i=0; i<wb.getNumberOfSheets(); i++) {
|
for (int i=0; i<wb.getNumberOfSheets(); i++) {
|
||||||
SXSSFSheet s = wb.getSheetAt(i);
|
SXSSFSheet s = wb.getSheetAt(i);
|
||||||
// TODO Detect if rows have been flushed
|
|
||||||
|
// Check if any rows have already been flushed out
|
||||||
|
int firstRowNum = s.getFirstRowNum();
|
||||||
|
int firstAvailableRowNum = s.iterator().next().getRowNum();
|
||||||
|
if (firstRowNum != firstAvailableRowNum) {
|
||||||
|
if (skipOutOfWindow) throw new RowsFlushedException();
|
||||||
|
logger.log(POILogger.INFO, "Rows from " + firstRowNum + " to" +
|
||||||
|
(firstAvailableRowNum-1) + " have already been flushed, skipping");
|
||||||
|
}
|
||||||
|
|
||||||
|
// Evaluate what we have
|
||||||
|
for (Row r : s) {
|
||||||
|
for (Cell c : r) {
|
||||||
|
if (c.getCellType() == Cell.CELL_TYPE_FORMULA) {
|
||||||
|
eval.evaluateFormulaCell(c);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -74,4 +109,9 @@ public class SXSSFFormulaEvaluator extends XSSFFormulaEvaluator {
|
||||||
super("One or more sheets have been flushed, cannot evaluate all cells");
|
super("One or more sheets have been flushed, cannot evaluate all cells");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
public static class RowsFlushedException extends IllegalStateException {
|
||||||
|
protected RowsFlushedException() {
|
||||||
|
super("One or more rows have been flushed, cannot evaluate all cells");
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -97,7 +97,7 @@ public class SXSSFRow implements Row
|
||||||
* @throws IllegalArgumentException if columnIndex < 0 or greater than the maximum number of supported columns
|
* @throws IllegalArgumentException if columnIndex < 0 or greater than the maximum number of supported columns
|
||||||
* (255 for *.xls, 1048576 for *.xlsx)
|
* (255 for *.xls, 1048576 for *.xlsx)
|
||||||
*/
|
*/
|
||||||
public Cell createCell(int column)
|
public SXSSFCell createCell(int column)
|
||||||
{
|
{
|
||||||
return createCell(column,Cell.CELL_TYPE_BLANK);
|
return createCell(column,Cell.CELL_TYPE_BLANK);
|
||||||
}
|
}
|
||||||
|
@ -113,7 +113,7 @@ public class SXSSFRow implements Row
|
||||||
* @throws IllegalArgumentException if columnIndex < 0 or greate than a maximum number of supported columns
|
* @throws IllegalArgumentException if columnIndex < 0 or greate than a maximum number of supported columns
|
||||||
* (255 for *.xls, 1048576 for *.xlsx)
|
* (255 for *.xls, 1048576 for *.xlsx)
|
||||||
*/
|
*/
|
||||||
public Cell createCell(int column, int type)
|
public SXSSFCell createCell(int column, int type)
|
||||||
{
|
{
|
||||||
checkBounds(column);
|
checkBounds(column);
|
||||||
|
|
||||||
|
@ -194,10 +194,10 @@ public class SXSSFRow implements Row
|
||||||
* @return Cell representing that column or null if undefined.
|
* @return Cell representing that column or null if undefined.
|
||||||
* @see #getCell(int, org.apache.poi.ss.usermodel.Row.MissingCellPolicy)
|
* @see #getCell(int, org.apache.poi.ss.usermodel.Row.MissingCellPolicy)
|
||||||
*/
|
*/
|
||||||
public Cell getCell(int cellnum) {
|
public SXSSFCell getCell(int cellnum) {
|
||||||
if(cellnum < 0) throw new IllegalArgumentException("Cell index must be >= 0");
|
if(cellnum < 0) throw new IllegalArgumentException("Cell index must be >= 0");
|
||||||
|
|
||||||
Cell cell = cellnum > _maxColumn ? null : _cells[cellnum];
|
SXSSFCell cell = cellnum > _maxColumn ? null : _cells[cellnum];
|
||||||
|
|
||||||
MissingCellPolicy policy = _sheet.getWorkbook().getMissingCellPolicy();
|
MissingCellPolicy policy = _sheet.getWorkbook().getMissingCellPolicy();
|
||||||
if(policy == RETURN_NULL_AND_BLANK) {
|
if(policy == RETURN_NULL_AND_BLANK) {
|
||||||
|
|
|
@ -99,7 +99,7 @@ public class SXSSFSheet implements Sheet, Cloneable
|
||||||
* a rownum is provided where the row is already flushed to disk.
|
* a rownum is provided where the row is already flushed to disk.
|
||||||
* @see #removeRow(Row)
|
* @see #removeRow(Row)
|
||||||
*/
|
*/
|
||||||
public Row createRow(int rownum)
|
public SXSSFRow createRow(int rownum)
|
||||||
{
|
{
|
||||||
int maxrow = SpreadsheetVersion.EXCEL2007.getLastRowIndex();
|
int maxrow = SpreadsheetVersion.EXCEL2007.getLastRowIndex();
|
||||||
if (rownum < 0 || rownum > maxrow) {
|
if (rownum < 0 || rownum > maxrow) {
|
||||||
|
@ -179,7 +179,7 @@ public class SXSSFSheet implements Sheet, Cloneable
|
||||||
* @param rownum row to get (0-based)
|
* @param rownum row to get (0-based)
|
||||||
* @return Row representing the rownumber or null if its not defined on the sheet
|
* @return Row representing the rownumber or null if its not defined on the sheet
|
||||||
*/
|
*/
|
||||||
public Row getRow(int rownum)
|
public SXSSFRow getRow(int rownum)
|
||||||
{
|
{
|
||||||
return _rows.get(new Integer(rownum));
|
return _rows.get(new Integer(rownum));
|
||||||
}
|
}
|
||||||
|
@ -1223,7 +1223,7 @@ public class SXSSFSheet implements Sheet, Cloneable
|
||||||
if (lastRowObj != null) {
|
if (lastRowObj != null) {
|
||||||
lastRowObj.setCollapsed(true);
|
lastRowObj.setCollapsed(true);
|
||||||
} else {
|
} else {
|
||||||
SXSSFRow newRow = (SXSSFRow) createRow(lastRow);
|
SXSSFRow newRow = createRow(lastRow);
|
||||||
newRow.setCollapsed(true);
|
newRow.setCollapsed(true);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -22,8 +22,6 @@ import org.apache.poi.ss.formula.EvaluationSheet;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* XSSF wrapper for a cell under evaluation
|
* XSSF wrapper for a cell under evaluation
|
||||||
*
|
|
||||||
* @author Josh Micich
|
|
||||||
*/
|
*/
|
||||||
final class XSSFEvaluationCell implements EvaluationCell {
|
final class XSSFEvaluationCell implements EvaluationCell {
|
||||||
|
|
||||||
|
@ -41,7 +39,7 @@ final class XSSFEvaluationCell implements EvaluationCell {
|
||||||
|
|
||||||
public Object getIdentityKey() {
|
public Object getIdentityKey() {
|
||||||
// save memory by just using the cell itself as the identity key
|
// save memory by just using the cell itself as the identity key
|
||||||
// Note - this assumes HSSFCell has not overridden hashCode and equals
|
// Note - this assumes XSSFCell has not overridden hashCode and equals
|
||||||
return _cell;
|
return _cell;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -22,8 +22,6 @@ import org.apache.poi.ss.formula.EvaluationSheet;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* XSSF wrapper for a sheet under evaluation
|
* XSSF wrapper for a sheet under evaluation
|
||||||
*
|
|
||||||
* @author Josh Micich
|
|
||||||
*/
|
*/
|
||||||
final class XSSFEvaluationSheet implements EvaluationSheet {
|
final class XSSFEvaluationSheet implements EvaluationSheet {
|
||||||
|
|
||||||
|
|
|
@ -21,6 +21,7 @@ import java.util.Map;
|
||||||
|
|
||||||
import org.apache.poi.hssf.usermodel.HSSFFormulaEvaluator;
|
import org.apache.poi.hssf.usermodel.HSSFFormulaEvaluator;
|
||||||
import org.apache.poi.ss.formula.CollaboratingWorkbooksEnvironment;
|
import org.apache.poi.ss.formula.CollaboratingWorkbooksEnvironment;
|
||||||
|
import org.apache.poi.ss.formula.EvaluationCell;
|
||||||
import org.apache.poi.ss.formula.IStabilityClassifier;
|
import org.apache.poi.ss.formula.IStabilityClassifier;
|
||||||
import org.apache.poi.ss.formula.WorkbookEvaluator;
|
import org.apache.poi.ss.formula.WorkbookEvaluator;
|
||||||
import org.apache.poi.ss.formula.WorkbookEvaluatorProvider;
|
import org.apache.poi.ss.formula.WorkbookEvaluatorProvider;
|
||||||
|
@ -253,15 +254,23 @@ public class XSSFFormulaEvaluator implements FormulaEvaluator, WorkbookEvaluator
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns a CellValue wrapper around the supplied ValueEval instance.
|
* Turns a XSSFCell into a XSSFEvaluationCell
|
||||||
*/
|
*/
|
||||||
private CellValue evaluateFormulaCellValue(Cell cell) {
|
protected EvaluationCell toEvaluationCell(Cell cell) {
|
||||||
if (!(cell instanceof XSSFCell)){
|
if (!(cell instanceof XSSFCell)){
|
||||||
throw new IllegalArgumentException("Unexpected type of cell: " + cell.getClass() + "." +
|
throw new IllegalArgumentException("Unexpected type of cell: " + cell.getClass() + "." +
|
||||||
" Only XSSFCells can be evaluated.");
|
" Only XSSFCells can be evaluated.");
|
||||||
}
|
}
|
||||||
|
|
||||||
ValueEval eval = _bookEvaluator.evaluate(new XSSFEvaluationCell((XSSFCell) cell));
|
return new XSSFEvaluationCell((XSSFCell)cell);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns a CellValue wrapper around the supplied ValueEval instance.
|
||||||
|
*/
|
||||||
|
private CellValue evaluateFormulaCellValue(Cell cell) {
|
||||||
|
EvaluationCell evalCell = toEvaluationCell(cell);
|
||||||
|
ValueEval eval = _bookEvaluator.evaluate(evalCell);
|
||||||
if (eval instanceof NumberEval) {
|
if (eval instanceof NumberEval) {
|
||||||
NumberEval ne = (NumberEval) eval;
|
NumberEval ne = (NumberEval) eval;
|
||||||
return new CellValue(ne.getNumberValue());
|
return new CellValue(ne.getNumberValue());
|
||||||
|
|
|
@ -30,6 +30,7 @@ import org.apache.poi.xssf.SXSSFITestDataProvider;
|
||||||
import org.apache.poi.xssf.usermodel.XSSFCell;
|
import org.apache.poi.xssf.usermodel.XSSFCell;
|
||||||
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
|
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
|
||||||
import org.apache.xmlbeans.XmlCursor;
|
import org.apache.xmlbeans.XmlCursor;
|
||||||
|
import org.junit.Ignore;
|
||||||
import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTRst;
|
import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTRst;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -59,7 +60,7 @@ public class TestSXSSFCell extends BaseTestXCell {
|
||||||
assertEquals(
|
assertEquals(
|
||||||
"Unexpected type of cell: class org.apache.poi.xssf.streaming.SXSSFCell. " +
|
"Unexpected type of cell: class org.apache.poi.xssf.streaming.SXSSFCell. " +
|
||||||
"Only XSSFCells can be evaluated.", e.getMessage());
|
"Only XSSFCells can be evaluated.", e.getMessage());
|
||||||
}
|
} catch (ClassCastException e) {} // TODO Temporary workaround during #58200
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -74,7 +75,7 @@ public class TestSXSSFCell extends BaseTestXCell {
|
||||||
assertEquals(
|
assertEquals(
|
||||||
"Unexpected type of cell: class org.apache.poi.xssf.streaming.SXSSFCell. " +
|
"Unexpected type of cell: class org.apache.poi.xssf.streaming.SXSSFCell. " +
|
||||||
"Only XSSFCells can be evaluated.", e.getMessage());
|
"Only XSSFCells can be evaluated.", e.getMessage());
|
||||||
}
|
} catch (ClassCastException e) {} // TODO Temporary workaround during #58200
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -89,7 +90,7 @@ public class TestSXSSFCell extends BaseTestXCell {
|
||||||
assertEquals(
|
assertEquals(
|
||||||
"Unexpected type of cell: class org.apache.poi.xssf.streaming.SXSSFCell. " +
|
"Unexpected type of cell: class org.apache.poi.xssf.streaming.SXSSFCell. " +
|
||||||
"Only XSSFCells can be evaluated.", e.getMessage());
|
"Only XSSFCells can be evaluated.", e.getMessage());
|
||||||
}
|
} catch (ClassCastException e) {} // TODO Temporary workaround during #58200
|
||||||
}
|
}
|
||||||
|
|
||||||
public void testPreserveSpaces() throws IOException {
|
public void testPreserveSpaces() throws IOException {
|
||||||
|
|
|
@ -0,0 +1,170 @@
|
||||||
|
/*
|
||||||
|
* ====================================================================
|
||||||
|
* Licensed to the Apache Software Foundation (ASF) under one or more
|
||||||
|
* contributor license agreements. See the NOTICE file distributed with
|
||||||
|
* this work for additional information regarding copyright ownership.
|
||||||
|
* The ASF licenses this file to You under the Apache License, Version 2.0
|
||||||
|
* (the "License"); you may not use this file except in compliance with
|
||||||
|
* the License. You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
* ====================================================================
|
||||||
|
*/
|
||||||
|
|
||||||
|
package org.apache.poi.xssf.streaming;
|
||||||
|
|
||||||
|
import static org.junit.Assert.assertEquals;
|
||||||
|
import static org.junit.Assert.fail;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
|
||||||
|
import org.apache.poi.ss.usermodel.Cell;
|
||||||
|
import org.apache.poi.ss.usermodel.FormulaEvaluator;
|
||||||
|
import org.apache.poi.xssf.SXSSFITestDataProvider;
|
||||||
|
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
|
||||||
|
import org.junit.Ignore;
|
||||||
|
import org.junit.Test;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Formula Evaluation with SXSSF.
|
||||||
|
*
|
||||||
|
* Note that SXSSF can only evaluate formulas where the
|
||||||
|
* cell is in the current window, and all references
|
||||||
|
* from the cell are in the current window
|
||||||
|
*/
|
||||||
|
@Ignore
|
||||||
|
public final class TestSXSSFFormulaEvaluation {
|
||||||
|
public static final SXSSFITestDataProvider _testDataProvider = SXSSFITestDataProvider.instance;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* EvaluateAll will normally fail, as any reference or
|
||||||
|
* formula outside of the window will fail, and any
|
||||||
|
* non-active sheets will fail
|
||||||
|
*/
|
||||||
|
@Test
|
||||||
|
public void testEvaluateAllFails() throws IOException {
|
||||||
|
SXSSFWorkbook wb = new SXSSFWorkbook(5);
|
||||||
|
SXSSFSheet s = wb.createSheet();
|
||||||
|
|
||||||
|
FormulaEvaluator eval = wb.getCreationHelper().createFormulaEvaluator();
|
||||||
|
|
||||||
|
// References outside window will fail
|
||||||
|
s.createRow(0).createCell(0).setCellFormula("1+2");
|
||||||
|
s.createRow(1).createCell(0).setCellFormula("A21");
|
||||||
|
try {
|
||||||
|
eval.evaluateAll();
|
||||||
|
fail("Evaluate All shouldn't work, as references outside the window");
|
||||||
|
} catch(Exception e) {
|
||||||
|
System.err.println(e); // TODO
|
||||||
|
}
|
||||||
|
|
||||||
|
// Cells outside window will fail
|
||||||
|
s.createRow(10).createCell(0).setCellFormula("A1+A2");
|
||||||
|
s.createRow(20).createCell(0).setCellFormula("A1+A11+100");
|
||||||
|
try {
|
||||||
|
eval.evaluateAll();
|
||||||
|
fail("Evaluate All shouldn't work, as some cells outside the window");
|
||||||
|
} catch(Exception e) {
|
||||||
|
System.err.println(e); // TODO
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// Inactive sheets will fail
|
||||||
|
XSSFWorkbook xwb = new XSSFWorkbook();
|
||||||
|
xwb.createSheet("Open");
|
||||||
|
xwb.createSheet("Closed");
|
||||||
|
|
||||||
|
wb = new SXSSFWorkbook(xwb, 5);
|
||||||
|
s = wb.getSheet("Closed");
|
||||||
|
s.flushRows();
|
||||||
|
s = wb.getSheet("Open");
|
||||||
|
s.createRow(0).createCell(0).setCellFormula("1+2");
|
||||||
|
|
||||||
|
eval = wb.getCreationHelper().createFormulaEvaluator();
|
||||||
|
try {
|
||||||
|
eval.evaluateAll();
|
||||||
|
fail("Evaluate All shouldn't work, as sheets flushed");
|
||||||
|
} catch (SXSSFFormulaEvaluator.SheetsFlushedException e) {}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testEvaluateRefOutsideWindowFails() {
|
||||||
|
SXSSFWorkbook wb = new SXSSFWorkbook(5);
|
||||||
|
SXSSFSheet s = wb.createSheet();
|
||||||
|
s.createRow(0).createCell(0).setCellFormula("1+2");
|
||||||
|
Cell c = s.createRow(20).createCell(0);
|
||||||
|
c.setCellFormula("A1+100");
|
||||||
|
|
||||||
|
FormulaEvaluator eval = wb.getCreationHelper().createFormulaEvaluator();
|
||||||
|
try {
|
||||||
|
eval.evaluateFormulaCell(c);
|
||||||
|
fail("Evaluate shouldn't work, as reference outside the window");
|
||||||
|
} catch(Exception e) {
|
||||||
|
System.err.println(e); // TODO
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* If all formula cells + their references are inside the window,
|
||||||
|
* then evaluation works
|
||||||
|
*/
|
||||||
|
@Test
|
||||||
|
public void testEvaluateAllInWindow() {
|
||||||
|
SXSSFWorkbook wb = new SXSSFWorkbook(5);
|
||||||
|
SXSSFSheet s = wb.createSheet();
|
||||||
|
s.createRow(0).createCell(0).setCellFormula("1+2");
|
||||||
|
s.createRow(1).createCell(1).setCellFormula("A1+10");
|
||||||
|
s.createRow(2).createCell(2).setCellFormula("B2+100");
|
||||||
|
|
||||||
|
FormulaEvaluator eval = wb.getCreationHelper().createFormulaEvaluator();
|
||||||
|
eval.evaluateAll();
|
||||||
|
|
||||||
|
assertEquals(3, (int)s.getRow(0).getCell(0).getNumericCellValue());
|
||||||
|
assertEquals(13, (int)s.getRow(1).getCell(1).getNumericCellValue());
|
||||||
|
assertEquals(113, (int)s.getRow(2).getCell(2).getNumericCellValue());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testEvaluateRefInsideWindow() {
|
||||||
|
SXSSFWorkbook wb = new SXSSFWorkbook(5);
|
||||||
|
SXSSFSheet s = wb.createSheet();
|
||||||
|
|
||||||
|
FormulaEvaluator eval = wb.getCreationHelper().createFormulaEvaluator();
|
||||||
|
|
||||||
|
SXSSFCell c = s.createRow(0).createCell(0);
|
||||||
|
c.setCellValue(1.5);
|
||||||
|
|
||||||
|
c = s.createRow(1).createCell(0);
|
||||||
|
c.setCellFormula("A1*2");
|
||||||
|
|
||||||
|
assertEquals(0, (int)c.getNumericCellValue());
|
||||||
|
eval.evaluateFormulaCell(c);
|
||||||
|
assertEquals(3, (int)c.getNumericCellValue());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testEvaluateSimple() {
|
||||||
|
SXSSFWorkbook wb = new SXSSFWorkbook(5);
|
||||||
|
SXSSFSheet s = wb.createSheet();
|
||||||
|
|
||||||
|
FormulaEvaluator eval = wb.getCreationHelper().createFormulaEvaluator();
|
||||||
|
|
||||||
|
SXSSFCell c = s.createRow(0).createCell(0);
|
||||||
|
c.setCellFormula("1+2");
|
||||||
|
assertEquals(0, (int)c.getNumericCellValue());
|
||||||
|
eval.evaluateFormulaCell(c);
|
||||||
|
assertEquals(3, (int)c.getNumericCellValue());
|
||||||
|
|
||||||
|
c = s.createRow(1).createCell(0);
|
||||||
|
c.setCellFormula("CONCATENATE(\"hello\",\" \",\"world\")");
|
||||||
|
assertEquals("", c.getStringCellValue());
|
||||||
|
eval.evaluateFormulaCell(c);
|
||||||
|
assertEquals("hello world", c.getStringCellValue());
|
||||||
|
}
|
||||||
|
}
|
|
@ -80,6 +80,7 @@ public final class TestSXSSFWorkbook extends BaseTestWorkbook {
|
||||||
try {
|
try {
|
||||||
super.setSheetName();
|
super.setSheetName();
|
||||||
fail("expected exception");
|
fail("expected exception");
|
||||||
|
} catch (ClassCastException e) { // TODO Temporary workaround during #58200
|
||||||
} catch (Exception e){
|
} catch (Exception e){
|
||||||
assertEquals(
|
assertEquals(
|
||||||
"Unexpected type of cell: class org.apache.poi.xssf.streaming.SXSSFCell. " +
|
"Unexpected type of cell: class org.apache.poi.xssf.streaming.SXSSFCell. " +
|
||||||
|
|
|
@ -34,6 +34,7 @@ public final class TestSXSSFBugs extends BaseTestBugzillaIssues {
|
||||||
}
|
}
|
||||||
|
|
||||||
// override some tests which do not work for SXSSF
|
// override some tests which do not work for SXSSF
|
||||||
|
// TODO Re-enable some of these when #58200 is implemented
|
||||||
@Override @Ignore("cloneSheet() not implemented") @Test public void bug18800() { /* cloneSheet() not implemented */ }
|
@Override @Ignore("cloneSheet() not implemented") @Test public void bug18800() { /* cloneSheet() not implemented */ }
|
||||||
@Override @Ignore("cloneSheet() not implemented") @Test public void bug22720() { /* cloneSheet() not implemented */ }
|
@Override @Ignore("cloneSheet() not implemented") @Test public void bug22720() { /* cloneSheet() not implemented */ }
|
||||||
@Override @Ignore("Evaluation is not supported") @Test public void bug43093() { /* Evaluation is not supported */ }
|
@Override @Ignore("Evaluation is not supported") @Test public void bug43093() { /* Evaluation is not supported */ }
|
||||||
|
@ -41,6 +42,7 @@ public final class TestSXSSFBugs extends BaseTestBugzillaIssues {
|
||||||
@Override @Ignore("Evaluation is not supported") @Test public void bug46729_testMaxFunctionArguments() { /* Evaluation is not supported */ }
|
@Override @Ignore("Evaluation is not supported") @Test public void bug46729_testMaxFunctionArguments() { /* Evaluation is not supported */ }
|
||||||
@Override @Ignore("Evaluation is not supported") @Test public void stackoverflow26437323() { /* Evaluation is not supported */ }
|
@Override @Ignore("Evaluation is not supported") @Test public void stackoverflow26437323() { /* Evaluation is not supported */ }
|
||||||
@Override @Ignore("Evaluation is not supported") @Test public void bug47815() { /* Evaluation is not supported */ }
|
@Override @Ignore("Evaluation is not supported") @Test public void bug47815() { /* Evaluation is not supported */ }
|
||||||
|
@Override @Ignore("Evaluation is not supported") @Test public void test58113() { /* Evaluation is not supported */ }
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Setting repeating rows and columns shouldn't break
|
* Setting repeating rows and columns shouldn't break
|
||||||
|
|
Loading…
Reference in New Issue