blob: 0839fe801a877e45a72c413e06a7654b74efd62d [file] [log] [blame]
/*
* ====================================================================
* 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.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
*/
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();
s.createRow(0).createCell(0).setCellFormula("1+2");
s.createRow(1).createCell(0).setCellFormula("A21");
for (int i=2; i<19; i++) { s.createRow(i); }
// Cells outside window will fail, whether referenced or not
s.createRow(19).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(SXSSFFormulaEvaluator.RowFlushedException e) {
// Expected
}
// Inactive sheets will fail
XSSFWorkbook xwb = new XSSFWorkbook();
xwb.createSheet("Open");
xwb.createSheet("Closed");
wb.close();
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) {}
wb.close();
}
@Test
public void testEvaluateRefOutsideWindowFails() throws IOException {
SXSSFWorkbook wb = new SXSSFWorkbook(5);
SXSSFSheet s = wb.createSheet();
s.createRow(0).createCell(0).setCellFormula("1+2");
assertEquals(false, s.areAllRowsFlushed());
assertEquals(-1, s.getLastFlushedRowNum());
for (int i=1; i<=19; i++) { s.createRow(i); }
Cell c = s.createRow(20).createCell(0);
c.setCellFormula("A1+100");
assertEquals(false, s.areAllRowsFlushed());
assertEquals(15, s.getLastFlushedRowNum());
FormulaEvaluator eval = wb.getCreationHelper().createFormulaEvaluator();
try {
eval.evaluateFormulaCellEnum(c);
fail("Evaluate shouldn't work, as reference outside the window");
} catch(SXSSFFormulaEvaluator.RowFlushedException e) {
// Expected
}
wb.close();
}
/**
* If all formula cells + their references are inside the window,
* then evaluation works
* @throws IOException
*/
@Test
public void testEvaluateAllInWindow() throws IOException {
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());
wb.close();
}
@Test
public void testEvaluateRefInsideWindow() throws IOException {
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.evaluateFormulaCellEnum(c);
assertEquals(3, (int)c.getNumericCellValue());
wb.close();
}
@Test
public void testEvaluateSimple() throws IOException {
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.evaluateFormulaCellEnum(c);
assertEquals(3, (int)c.getNumericCellValue());
c = s.createRow(1).createCell(0);
c.setCellFormula("CONCATENATE(\"hello\",\" \",\"world\")");
eval.evaluateFormulaCellEnum(c);
assertEquals("hello world", c.getStringCellValue());
wb.close();
}
}