1. evaluateInCell failed if the cell originally contained a numeric value
2. Sheet references were not handled correctly


git-svn-id: https://svn.apache.org/repos/asf/jakarta/poi/trunk@478367 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
Amol S. Deshmukh 2006-11-22 23:12:06 +00:00
parent 471bb226a4
commit 1fd5b611a3

View File

@ -10,6 +10,7 @@ import java.util.Map;
import java.util.Stack;
import org.apache.poi.hssf.model.FormulaParser;
import org.apache.poi.hssf.model.Workbook;
import org.apache.poi.hssf.record.formula.AddPtg;
import org.apache.poi.hssf.record.formula.Area3DPtg;
import org.apache.poi.hssf.record.formula.AreaPtg;
@ -100,11 +101,9 @@ public class HSSFFormulaEvaluator {
private static final Map OPERATION_EVALS_MAP = new HashMap();
/*
* If you dont like this map, join the club :) I did this becoz it was
* desired to keep the FormulaEvaluator separate from FormulaParser and
* related classes in the CVS-HEAD. So now we need some mapping between the
* Ptg tokens that the FormulaParser returns and the *Eval classes taht are
* used by the FormulaEvaluator - hence the following :)
* Following is the mapping between the Ptg tokens returned
* by the FormulaParser and the *Eval classes that are used
* by the FormulaEvaluator
*/
static {
VALUE_EVALS_MAP.put(BoolPtg.class, BoolEval.class);
@ -214,6 +213,7 @@ public class HSSFFormulaEvaluator {
cell.setCellValue(cv.getErrorValue());
break;
case HSSFCell.CELL_TYPE_NUMERIC:
cell.setCellType(HSSFCell.CELL_TYPE_NUMERIC);
cell.setCellValue(cv.getNumberValue());
break;
case HSSFCell.CELL_TYPE_STRING:
@ -326,8 +326,9 @@ public class HSSFFormulaEvaluator {
Ref3DPtg ptg = (Ref3DPtg) ptgs[i];
short colnum = ptg.getColumn();
short rownum = ptg.getRow();
HSSFSheet xsheet = workbook.getSheetAt(ptg.getExternSheetIndex());
HSSFRow row = sheet.getRow(rownum);
Workbook wb = workbook.getWorkbook();
HSSFSheet xsheet = workbook.getSheetAt(wb.getSheetIndexFromExternSheetIndex(ptg.getExternSheetIndex()));
HSSFRow row = xsheet.getRow(rownum);
HSSFCell cell = (row != null) ? row.getCell(colnum) : null;
pushRef3DEval(ptg, stack, cell, row, xsheet, workbook);
}