From d4ec8ceb1120c574b2a1623a178ffa8db8fb3658 Mon Sep 17 00:00:00 2001 From: Josh Micich Date: Tue, 13 Jan 2009 22:02:52 +0000 Subject: [PATCH] Bugzilla 46523 - added implementation for SUMIF git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@734252 13f79535-47bb-0310-9956-ffa450edef68 --- src/documentation/content/xdocs/changes.xml | 1 + src/documentation/content/xdocs/status.xml | 1 + .../hssf/record/formula/functions/Sumif.java | 140 +++++++++++++++--- .../poi/hssf/data/FormulaEvalTestData.xls | Bin 157184 -> 157184 bytes 4 files changed, 121 insertions(+), 21 deletions(-) diff --git a/src/documentation/content/xdocs/changes.xml b/src/documentation/content/xdocs/changes.xml index 139b48f9a..0502ddc4b 100644 --- a/src/documentation/content/xdocs/changes.xml +++ b/src/documentation/content/xdocs/changes.xml @@ -37,6 +37,7 @@ + 46523 - added implementation for SUMIF function Support for reading HSSF column styles Hook up POIXMLTextExtractor.getMetadataTextExtractor() to the already written POIXMLPropertiesTextExtractor 46472 - Avoid NPE in HPSFPropertiesExtractor when no properties exist diff --git a/src/documentation/content/xdocs/status.xml b/src/documentation/content/xdocs/status.xml index 1af660ed7..aaab68a12 100644 --- a/src/documentation/content/xdocs/status.xml +++ b/src/documentation/content/xdocs/status.xml @@ -34,6 +34,7 @@ + 46523 - added implementation for SUMIF function Support for reading HSSF column styles Hook up POIXMLTextExtractor.getMetadataTextExtractor() to the already written POIXMLPropertiesTextExtractor 46472 - Avoid NPE in HPSFPropertiesExtractor when no properties exist diff --git a/src/java/org/apache/poi/hssf/record/formula/functions/Sumif.java b/src/java/org/apache/poi/hssf/record/formula/functions/Sumif.java index 11cb02315..5255cda28 100644 --- a/src/java/org/apache/poi/hssf/record/formula/functions/Sumif.java +++ b/src/java/org/apache/poi/hssf/record/formula/functions/Sumif.java @@ -1,25 +1,123 @@ -/* -* 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. -*/ -/* - * Created on May 15, 2005 - * - */ +/* ==================================================================== + 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.hssf.record.formula.functions; -public class Sumif extends NotImplementedFunction { +import org.apache.poi.hssf.record.formula.eval.AreaEval; +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.EvaluationException; +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; +import org.apache.poi.hssf.record.formula.functions.CountUtils.I_MatchPredicate; + +/** + * Implementation for the Excel function SUMIF

+ * + * Syntax :
+ * SUMIF ( range, criteria, sum_range )
+ * + * + * + * + *
rangeThe range over which criteria is applied. Also used for addend values when the third parameter is not present
criteriaThe value or expression used to filter rows from range
sum_rangeLocates the top-left corner of the corresponding range of addends - values to be added (after being selected by the criteria)

+ *

+ * @author Josh Micich + */ +public final class Sumif implements Function { + + public Eval evaluate(Eval[] args, int srcRowIndex, short srcColumnIndex) { + if (args.length < 2) { + return ErrorEval.VALUE_INVALID; + } + + AreaEval aeRange; + AreaEval aeSum; + try { + aeRange = convertRangeArg(args[0]); + + switch (args.length) { + case 2: + aeSum = aeRange; + break; + case 3: + aeSum = createSumRange(args[2], aeRange); + break; + default: + return ErrorEval.VALUE_INVALID; + } + } catch (EvaluationException e) { + return e.getErrorEval(); + } + I_MatchPredicate mp = Countif.createCriteriaPredicate(args[1], srcRowIndex, srcRowIndex); + double result = sumMatchingCells(aeRange, mp, aeSum); + return new NumberEval(result); + } + + private static double sumMatchingCells(AreaEval aeRange, I_MatchPredicate mp, AreaEval aeSum) { + int height=aeRange.getHeight(); + int width= aeRange.getWidth(); + + double result = 0.0; + for (int r=0; rMgh!$lv$ij-SDzXa_T#bZPV5Noxlubv|HVB$(DHEyMniw;z z|EVR4eaNGdhUZ9#ZQ2a7Q`a%E-DX6=;)t!a&V*R)q!mnsg(fD1$oAYtqs{ns9`AeK zIp;g~oO{n3JlzIQx1r9>#y~A8X1_RIZNhd|#q`zg_a}G#MA<0zFmA7d=q9VVn|)ko&MkZ1np7 zm;Ix0T$cWNdBj#5yYQ(}vvBHTRXUkC3Q9MZZ{Ae&!wUBcn>KIS4Uw?xTZ(t#O+4sr zdSXjX%}@Z~#(x2heGYJb3}Askm=%U_Ee0Vh4q@;ygf=sRW}#wI5LVAZC`m*3TP8y3 z0)!7-2$PBtnpYyc_5#8Wsu4DBM!=U5{_Q~s>>_(D!k&W&`x_9_T1e+@gregJFP_49 zC_0NUa)qkAhLHL%gu|bZVF2NcAyj+f*#>X?)YM`ns1 zDZA{{bm{A@Jhdk(@-Fo}NcY`fFzEg2-0?&N<=s9FgWlr)#UiAs+)n2n%68^<7H>R}EA=)Mk+fCPe*WdQyBMt?yVgn{tu{p5ZZjF5uR1<>IQO zN{nRuSfUyu+C&S5`r3_{o5uY|ZR)4l_*Z_N!1?+3PjQmA+Slg56H`SSLA7!PT6qk~ z9a@3&x#vHX>cti45RF;QT#YEjd7?+6C8d}ltl5ONl%iW4lOh*OaX3m`{&OZ*JIXPe zm#JJGE62x0iS(OafmYEb*R-YrXNm3vLUj@yYqSaVbOrgj>2#=fD)3eA_Gs!)*I*`( z-LCoGS%a={Q71({`w^xKzYI;SqQYL13x2K&(?qpgz`iP6o6Zwy?L&vr&Fi;oYGD%= zijy+5z6qCd>kiF#tqDy+6w1&qo2gbi`Onm-*2_CIwM?U0JEebg!bdmXq=cw}`c zXYm=nnrvInVj)LjJ~)d-qD_`G=^W;XfLzzAbC@lhQd2pH-w`nmLbuOR9*_}pIX_Ww_1alw+g|PLX324tl>KGucV16D7Ox6=z!dHa`FqyvCPS{3+#91^XQ`&eZbll53PCcyb(=OsjgwSM#zxoj4 zMWaNgKg0x4C(%D7YLOkoUOGRoNiMyYIJ-n8gm__!P5p5%ZCj#jPHQi1b2T;nQZLRG zR_Vn)LW@Y0$SRRZqGvwB9>eY!`WWDD$n>RN!?z3~Mp}AqlBS2cICK-!c^?5wA00%G z+zodhW(rR_rPFq)4Q>{do3Gri1wuS(mu*)*j!T@G)Db4PF7fwL`lGTzk)f8xZXGNJywBF7vvQbxbj>J>{;}4JbYWCjQJ%?axAWS zu8e|t_UwWs_W9#CS(fIJVX@0mu-NW$*)#0&w!3`4d7e!{-yh1@Q>f!+`d7{uUCxHZ F{{SgS*3$q0 delta 2397 zcmZuzdrVYk7C-0vJ{~hX#4YkzM;%A%P61&C6bFSmmWSA&%sOO);uZyrV9AyUn_93s zYSpBR6?LK;eVgvu&Y+!deN^9+wsjFxQ( zo91G)vKbUEAQqYt00c}28fX8wykdxsOhyC;d?B8ATrn(sB4IE-7K_uC7-v!y%^+je zk198eG2sZSeyR~2S@m<-zZoCP($y!!8dAmB_uAeS@pF$TP8jkGXw!-b_WcnTUahF*kM(tvcS#O<` zF#u(beLHO?!SUOJ3j9s=Ypzp*)ny=N~HFU~D>|J2h6H#&RJ${2Hm!wF5e18AMihkda01}0X)XbEdjdX_{S=e+DO}Q1 zxMbA#k%VHCuk~(Jlq#fl>1Pa>q-q%rF!C@8Hxg=Mw33i)OY-W~M*OvUkE!!){D9G@ z5mQwMA-_2cS0zhxZ=+tm9RDeu1RM^$scNam{`r~M8Lw&x>i^k*R@p&v(v8cdbKI?G zyV0Q_)~oc_+?cLH8FjePuA&&-a$~WoVv+1(oQP1?1*btzFUJhoP%QMCa$Kh3*zZ(1 zT2&YC=}I|1r%EKDDMr@z6sadwkY7JN7QM0pUzaT(SSz7H{_k0&UUKR$>{g(RBH*R`l=lx7D*^=)dw!% z3gx-bsPwrP(Iu~w+V3vnt1>`f=psHZJ=I?Qxl6cRfkx%ET*CDdlD+z^OIRS8v2|mi zs^ywI-I$|_d1Kw(n4#KO6npSDs(_Q1_E4hFTPecZgD&M_ztJA*f{U%@%eX4Sv(YR0 z)rbw6^XOOl)MZ?#AGwSl%ND9^WiKV}r}~?Eu_P#w$9+){5BMaFFs~AVc=&hIOg~=D z*!+9@@NSqYypCLMmUO!9(lRx+xo-(LpwtO-~nnP4m z-w>uq*yPo5nC7CNdy_tlX{w7mS3QhNrHwMT4O3<-2mWgq7t3h!pJM+6rfeg)SZ(2L zZ5p9%nQ2=GM{tR>lGkS=QIo>Xz1GjRe_Lgj}PPzyyrVk5UL;r`6C-b^Re$|3x&<3O-2#v2FIx3}yaf zQ6e@X_}nuB#$x>xGhe7^?n~bSQK~>uO{r#KRRONJ)GT(YaOSRr4>k3&cIpD|1AZeFGH18rT4CkZp0;9qF0&%(R)4_%%7% smi(Ojyu6&{%j`M%c6%=WYtnnn*aa+