118 lines
4.3 KiB
Java
118 lines
4.3 KiB
Java
package org.apache.poi.hssf.usermodel;
|
|
|
|
import java.util.Iterator;
|
|
|
|
import junit.framework.TestCase;
|
|
|
|
/**
|
|
* Tests to show that our documentation at
|
|
* http://poi.apache.org/hssf/eval.html
|
|
* all actually works as we'd expect them to
|
|
*/
|
|
public class TestFormulaEvaluatorDocs extends TestCase {
|
|
protected void setUp() throws Exception {
|
|
super.setUp();
|
|
}
|
|
|
|
/**
|
|
* http://poi.apache.org/hssf/eval.html#EvaluateAll
|
|
*/
|
|
public void testEvaluateAll() throws Exception {
|
|
HSSFWorkbook wb = new HSSFWorkbook();
|
|
HSSFSheet s1 = wb.createSheet();
|
|
HSSFSheet s2 = wb.createSheet();
|
|
wb.setSheetName(0, "S1");
|
|
wb.setSheetName(1, "S2");
|
|
|
|
HSSFRow s1r1 = s1.createRow(0);
|
|
HSSFRow s1r2 = s1.createRow(1);
|
|
HSSFRow s2r1 = s2.createRow(0);
|
|
|
|
HSSFCell s1r1c1 = s1r1.createCell((short)0);
|
|
HSSFCell s1r1c2 = s1r1.createCell((short)1);
|
|
HSSFCell s1r1c3 = s1r1.createCell((short)2);
|
|
s1r1c1.setCellValue(22.3);
|
|
s1r1c2.setCellValue(33.4);
|
|
s1r1c3.setCellFormula("SUM(A1:B1)");
|
|
|
|
HSSFCell s1r2c1 = s1r2.createCell((short)0);
|
|
HSSFCell s1r2c2 = s1r2.createCell((short)1);
|
|
HSSFCell s1r2c3 = s1r2.createCell((short)2);
|
|
s1r2c1.setCellValue(-1.2);
|
|
s1r2c2.setCellValue(-3.4);
|
|
s1r2c3.setCellFormula("SUM(A2:B2)");
|
|
|
|
HSSFCell s2r1c1 = s2r1.createCell((short)0);
|
|
s2r1c1.setCellFormula("S1!A1");
|
|
|
|
// Not evaluated yet
|
|
assertEquals(0.0, s1r1c3.getNumericCellValue(), 0);
|
|
assertEquals(0.0, s1r2c3.getNumericCellValue(), 0);
|
|
assertEquals(0.0, s2r1c1.getNumericCellValue(), 0);
|
|
|
|
// Do a full evaluate, as per our docs
|
|
// uses evaluateFormulaCell()
|
|
for(int sheetNum = 0; sheetNum < wb.getNumberOfSheets(); sheetNum++) {
|
|
HSSFSheet sheet = wb.getSheetAt(sheetNum);
|
|
HSSFFormulaEvaluator evaluator = new HSSFFormulaEvaluator(sheet, wb);
|
|
|
|
for(Iterator rit = sheet.rowIterator(); rit.hasNext();) {
|
|
HSSFRow r = (HSSFRow)rit.next();
|
|
evaluator.setCurrentRow(r);
|
|
|
|
for(Iterator cit = r.cellIterator(); cit.hasNext();) {
|
|
HSSFCell c = (HSSFCell)cit.next();
|
|
if(c.getCellType() == HSSFCell.CELL_TYPE_FORMULA) {
|
|
evaluator.evaluateFormulaCell(c);
|
|
|
|
// For testing - all should be numeric
|
|
assertEquals(HSSFCell.CELL_TYPE_NUMERIC, evaluator.evaluateFormulaCell(c));
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
// Check now as expected
|
|
assertEquals(55.7, wb.getSheetAt(0).getRow(0).getCell((short)2).getNumericCellValue(), 0);
|
|
assertEquals("SUM(A1:B1)", wb.getSheetAt(0).getRow(0).getCell((short)2).getCellFormula());
|
|
assertEquals(HSSFCell.CELL_TYPE_FORMULA, wb.getSheetAt(0).getRow(0).getCell((short)2).getCellType());
|
|
|
|
assertEquals(-4.6, wb.getSheetAt(0).getRow(1).getCell((short)2).getNumericCellValue(), 0);
|
|
assertEquals("SUM(A2:B2)", wb.getSheetAt(0).getRow(1).getCell((short)2).getCellFormula());
|
|
assertEquals(HSSFCell.CELL_TYPE_FORMULA, wb.getSheetAt(0).getRow(1).getCell((short)2).getCellType());
|
|
|
|
assertEquals(22.3, wb.getSheetAt(1).getRow(0).getCell((short)0).getNumericCellValue(), 0);
|
|
assertEquals("S1!A1", wb.getSheetAt(1).getRow(0).getCell((short)0).getCellFormula());
|
|
assertEquals(HSSFCell.CELL_TYPE_FORMULA, wb.getSheetAt(1).getRow(0).getCell((short)0).getCellType());
|
|
|
|
|
|
// Now do the alternate call, which zaps the formulas
|
|
// uses evaluateInCell()
|
|
for(int sheetNum = 0; sheetNum < wb.getNumberOfSheets(); sheetNum++) {
|
|
HSSFSheet sheet = wb.getSheetAt(sheetNum);
|
|
HSSFFormulaEvaluator evaluator = new HSSFFormulaEvaluator(sheet, wb);
|
|
|
|
for(Iterator rit = sheet.rowIterator(); rit.hasNext();) {
|
|
HSSFRow r = (HSSFRow)rit.next();
|
|
evaluator.setCurrentRow(r);
|
|
|
|
for(Iterator cit = r.cellIterator(); cit.hasNext();) {
|
|
HSSFCell c = (HSSFCell)cit.next();
|
|
if(c.getCellType() == HSSFCell.CELL_TYPE_FORMULA) {
|
|
evaluator.evaluateInCell(c);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
assertEquals(55.7, wb.getSheetAt(0).getRow(0).getCell((short)2).getNumericCellValue(), 0);
|
|
assertEquals(HSSFCell.CELL_TYPE_NUMERIC, wb.getSheetAt(0).getRow(0).getCell((short)2).getCellType());
|
|
|
|
assertEquals(-4.6, wb.getSheetAt(0).getRow(1).getCell((short)2).getNumericCellValue(), 0);
|
|
assertEquals(HSSFCell.CELL_TYPE_NUMERIC, wb.getSheetAt(0).getRow(1).getCell((short)2).getCellType());
|
|
|
|
assertEquals(22.3, wb.getSheetAt(1).getRow(0).getCell((short)0).getNumericCellValue(), 0);
|
|
assertEquals(HSSFCell.CELL_TYPE_NUMERIC, wb.getSheetAt(1).getRow(0).getCell((short)0).getCellType());
|
|
}
|
|
}
|