diff options
author | Nick Burch <nick@apache.org> | 2008-03-29 22:45:11 +0000 |
---|---|---|
committer | Nick Burch <nick@apache.org> | 2008-03-29 22:45:11 +0000 |
commit | 0cd7ba4ad251c391b3ba1d41c3a68b95c608106d (patch) | |
tree | 6be424ac762737c62bfa906c0b26e4cb14477032 /src/java | |
parent | b4590a5c1ef657ed2338441349633500ec9b3a60 (diff) | |
download | poi-0cd7ba4ad251c391b3ba1d41c3a68b95c608106d.tar.gz poi-0cd7ba4ad251c391b3ba1d41c3a68b95c608106d.zip |
Few little short/int tweaks, and then tests to show that FormulaEvaluator plays nicely with xssf
git-svn-id: https://svn.apache.org/repos/asf/poi/branches/ooxml@642634 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'src/java')
-rw-r--r-- | src/java/org/apache/poi/hssf/record/formula/functions/Count.java | 97 | ||||
-rw-r--r-- | src/java/org/apache/poi/hssf/usermodel/HSSFRow.java | 23 |
2 files changed, 115 insertions, 5 deletions
diff --git a/src/java/org/apache/poi/hssf/record/formula/functions/Count.java b/src/java/org/apache/poi/hssf/record/formula/functions/Count.java index 736c37c1b7..eb55fc4a42 100644 --- a/src/java/org/apache/poi/hssf/record/formula/functions/Count.java +++ b/src/java/org/apache/poi/hssf/record/formula/functions/Count.java @@ -20,6 +20,99 @@ */ package org.apache.poi.hssf.record.formula.functions; -public class Count extends NotImplementedFunction { +import org.apache.poi.hssf.record.formula.eval.AreaEval; +import org.apache.poi.hssf.record.formula.eval.BlankEval; +import org.apache.poi.hssf.record.formula.eval.ErrorEval; +import org.apache.poi.hssf.record.formula.eval.Eval; +import org.apache.poi.hssf.record.formula.eval.NumberEval; +import org.apache.poi.hssf.record.formula.eval.RefEval; +import org.apache.poi.hssf.record.formula.eval.ValueEval; -} +/** + * Counts the number of cells that contain numeric data within + * the list of arguments. + * + * Excel Syntax + * COUNT(value1,value2,...) + * Value1, value2, ... are 1 to 30 arguments representing the values or ranges to be counted. + * + * TODO: Check this properly matches excel on edge cases + * like formula cells, error cells etc + */ +public class Count implements Function { + + public Eval evaluate(Eval[] args, int srcCellRow, short srcCellCol) { + int nArgs = args.length; + if (nArgs < 1) { + // too few arguments + return ErrorEval.VALUE_INVALID; + } + + if (nArgs > 30) { + // too many arguments + return ErrorEval.VALUE_INVALID; + } + + int temp = 0; + + for(int i=0; i<nArgs; i++) { + temp += countArg(args[i]); + + } + return new NumberEval(temp); + } + + private static int countArg(Eval eval) { + if (eval instanceof AreaEval) { + AreaEval ae = (AreaEval) eval; + return countAreaEval(ae); + } + if (eval instanceof RefEval) { + RefEval refEval = (RefEval)eval; + return countValue(refEval.getInnerValueEval()); + } + if (eval instanceof NumberEval) { + return 1; + } + + throw new RuntimeException("Unexpected eval type (" + eval.getClass().getName() + ")"); + } + + private static int countAreaEval(AreaEval ae) { + + int temp = 0; + ValueEval[] values = ae.getValues(); + for (int i = 0; i < values.length; i++) { + ValueEval val = values[i]; + if(val == null) { + // seems to occur. Really we would have expected BlankEval + continue; + } + temp += countValue(val); + + } + return temp; + } + + private static int countValue(ValueEval valueEval) { + + if(valueEval == BlankEval.INSTANCE) { + return 0; + } + + if(valueEval instanceof BlankEval) { + // wouldn't need this if BlankEval was final + return 0; + } + + if(valueEval instanceof ErrorEval) { + // note - error values not counted + return 0; + } + + if(valueEval instanceof NumberEval) + return 1; + + return 0; + } +}
\ No newline at end of file diff --git a/src/java/org/apache/poi/hssf/usermodel/HSSFRow.java b/src/java/org/apache/poi/hssf/usermodel/HSSFRow.java index fa183b43ce..06a704d7f0 100644 --- a/src/java/org/apache/poi/hssf/usermodel/HSSFRow.java +++ b/src/java/org/apache/poi/hssf/usermodel/HSSFRow.java @@ -120,23 +120,40 @@ public final class HSSFRow implements Comparable, Row { * * @return HSSFCell a high level representation of the created cell. */ - public HSSFCell createCell(short column) { - return this.createCell(column,HSSFCell.CELL_TYPE_BLANK); + return this.createCell(column,HSSFCell.CELL_TYPE_BLANK); } /** * Use this to create new cells within the row and return it. * <p> * The cell that is returned is a CELL_TYPE_BLANK. The type can be changed - * either through calling setCellValue or setCellType. + * either through calling <code>setCellValue</code> or <code>setCellType</code>. * * @param column - the column number this cell represents * * @return HSSFCell a high level representation of the created cell. */ + public HSSFCell createCell(int column) + { + short shortCellNum = (short)column; + if(column > 0x7FFF) { + shortCellNum = (short)(0xffff - column); + } + return this.createCell(shortCellNum,HSSFCell.CELL_TYPE_BLANK); + } + /** + * Use this to create new cells within the row and return it. + * <p> + * The cell that is returned is a CELL_TYPE_BLANK. The type can be changed + * either through calling setCellValue or setCellType. + * + * @param column - the column number this cell represents + * + * @return HSSFCell a high level representation of the created cell. + */ public HSSFCell createCell(short column, int type) { HSSFCell cell = new HSSFCell(book, sheet, getRowNum(), column, type); |