aboutsummaryrefslogtreecommitdiffstats
path: root/src/java
diff options
context:
space:
mode:
authorNick Burch <nick@apache.org>2008-03-29 22:45:11 +0000
committerNick Burch <nick@apache.org>2008-03-29 22:45:11 +0000
commit0cd7ba4ad251c391b3ba1d41c3a68b95c608106d (patch)
tree6be424ac762737c62bfa906c0b26e4cb14477032 /src/java
parentb4590a5c1ef657ed2338441349633500ec9b3a60 (diff)
downloadpoi-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.java97
-rw-r--r--src/java/org/apache/poi/hssf/usermodel/HSSFRow.java23
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);