From 4c8f3ab160ca612632b6708414f8fac9463592bb Mon Sep 17 00:00:00 2001 From: Nick Burch Date: Fri, 25 Jul 2014 14:15:56 +0000 Subject: [PATCH] More tests for #55906, and provide a new eval that lets you get at evals for many sheets git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1613438 13f79535-47bb-0310-9956-ffa450edef68 --- .../poi/ss/formula/SheetRangeEvaluator.java | 57 ++++++++++++++++++ .../poi/ss/formula/SheetRefEvaluator.java | 4 +- .../usermodel/TestXSSFFormulaEvaluation.java | 31 +++++++++- .../spreadsheet/55906-MultiSheetRefs.xls | Bin 24064 -> 24064 bytes .../spreadsheet/55906-MultiSheetRefs.xlsx | Bin 9494 -> 9507 bytes 5 files changed, 88 insertions(+), 4 deletions(-) create mode 100644 src/java/org/apache/poi/ss/formula/SheetRangeEvaluator.java diff --git a/src/java/org/apache/poi/ss/formula/SheetRangeEvaluator.java b/src/java/org/apache/poi/ss/formula/SheetRangeEvaluator.java new file mode 100644 index 000000000..9157a1d0d --- /dev/null +++ b/src/java/org/apache/poi/ss/formula/SheetRangeEvaluator.java @@ -0,0 +1,57 @@ +/* ==================================================================== + 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.ss.formula; + +import org.apache.poi.ss.formula.eval.ValueEval; + +/** + * Evaluator for returning cells or sheets for a range of sheets + */ +final class SheetRangeEvaluator { + private final int _firstSheetIndex; + private final int _lastSheetIndex; + private SheetRefEvaluator[] _sheetEvaluators; + + public SheetRangeEvaluator(int firstSheetIndex, int lastSheetIndex, SheetRefEvaluator[] sheetEvaluators) { + if (firstSheetIndex < 0) { + throw new IllegalArgumentException("Invalid firstSheetIndex: " + firstSheetIndex + "."); + } + if (lastSheetIndex < firstSheetIndex) { + throw new IllegalArgumentException("Invalid lastSheetIndex: " + lastSheetIndex + " for firstSheetIndex: " + firstSheetIndex + "."); + } + _firstSheetIndex = firstSheetIndex; + _lastSheetIndex = lastSheetIndex; + _sheetEvaluators = sheetEvaluators; + } + + public SheetRefEvaluator getSheetEvaluator(int sheetIndex) { + if (sheetIndex < _firstSheetIndex || sheetIndex > _lastSheetIndex) { + throw new IllegalArgumentException("Invalid SheetIndex: " + sheetIndex + + " - Outside range " + _firstSheetIndex + " : " + _lastSheetIndex); + } + return _sheetEvaluators[sheetIndex-_firstSheetIndex]; + } + + public String getSheetName(int sheetIndex) { + return getSheetEvaluator(sheetIndex).getSheetName(); + } + + public ValueEval getEvalForCell(int sheetIndex, int rowIndex, int columnIndex) { + return getSheetEvaluator(sheetIndex).getEvalForCell(rowIndex, columnIndex); + } +} diff --git a/src/java/org/apache/poi/ss/formula/SheetRefEvaluator.java b/src/java/org/apache/poi/ss/formula/SheetRefEvaluator.java index 7452d5ab5..bc4c86262 100644 --- a/src/java/org/apache/poi/ss/formula/SheetRefEvaluator.java +++ b/src/java/org/apache/poi/ss/formula/SheetRefEvaluator.java @@ -23,9 +23,7 @@ import org.apache.poi.ss.formula.ptg.Ptg; import org.apache.poi.ss.usermodel.Cell; /** - * - * - * @author Josh Micich + * Evaluator for cells within a specific Sheet */ final class SheetRefEvaluator { private final WorkbookEvaluator _bookEvaluator; diff --git a/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFFormulaEvaluation.java b/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFFormulaEvaluation.java index 4e92fda69..9199058ff 100644 --- a/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFFormulaEvaluation.java +++ b/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFFormulaEvaluation.java @@ -212,7 +212,7 @@ public final class TestXSSFFormulaEvaluation extends BaseTestFormulaEvaluator { Cell minF = s1.getRow(3).getCell(1); assertNotNull(minF); - assertEquals("MIX(Sheet1:Sheet3!A$1)", minF.getCellFormula()); + assertEquals("MIN(Sheet1:Sheet3!A$1)", minF.getCellFormula()); assertEquals("11.0", evaluator.evaluate(minF).formatAsString()); Cell maxF = s1.getRow(4).getCell(1); @@ -241,6 +241,35 @@ public final class TestXSSFFormulaEvaluation extends BaseTestFormulaEvaluator { assertNotNull(countA_3F); assertEquals("COUNTA(Sheet1:Sheet3!E1)", countA_3F.getCellFormula()); assertEquals("3.0", evaluator.evaluate(countA_3F).formatAsString()); + + + // SUM over a range + Cell sumFA = s1.getRow(2).getCell(7); + assertNotNull(sumFA); + assertEquals("SUM(Sheet1:Sheet3!A1:B2)", sumFA.getCellFormula()); + assertEquals("110.0", evaluator.evaluate(sumFA).formatAsString()); + + + // Various Stats formulas on ranges of numbers + Cell avgFA = s1.getRow(2).getCell(7); + assertNotNull(avgFA); + assertEquals("AVERAGE(Sheet1:Sheet3!A1:B2)", avgFA.getCellFormula()); + assertEquals("27.5", evaluator.evaluate(avgFA).formatAsString()); + + Cell minFA = s1.getRow(3).getCell(8); + assertNotNull(minFA); + assertEquals("MIN(Sheet1:Sheet3!A$1:B$2)", minFA.getCellFormula()); + assertEquals("11.0", evaluator.evaluate(minFA).formatAsString()); + + Cell maxFA = s1.getRow(4).getCell(8); + assertNotNull(maxFA); + assertEquals("MAX(Sheet1:Sheet3!A$1:B$2)", maxFA.getCellFormula()); + assertEquals("44.0", evaluator.evaluate(maxFA).formatAsString()); + + Cell countFA = s1.getRow(5).getCell(8); + assertNotNull(countFA); + assertEquals("COUNT(Sheet1:Sheet3!$A$1:$B$2)", countFA.getCellFormula()); + assertEquals("4.0", evaluator.evaluate(countFA).formatAsString()); } } } diff --git a/test-data/spreadsheet/55906-MultiSheetRefs.xls b/test-data/spreadsheet/55906-MultiSheetRefs.xls index 565330810ad9d0b496a4e2f62a85ffd148a228fa..c31728d820ecaae1b4f1809ba0d795341a030231 100644 GIT binary patch delta 200 zcmZqJ!`QHgaYLv+W60(({p(DO3X}DWHZev|erO~n%*4RPpvu6+z`?-J00s@#levs% zF)_GJUS{meC@}epaU>rLP?~{(k%0vWIXEW&HF@xZj<+#i!<_1HZ&0xVU^uY3 d)U26#lGRBTo}_Al&1bE&l^E4F|BPX01OO(^D~?=`gK_N4 zLtF9dtoWXBQJ2$v{%AOa7cm>hy+PcLe}(&|;wcdV7*L~eCh4<>TQH{LH#yzd--$^f z0mX^1FOy`~Ap5r@&>1*zX)jA)mvr*{h^J59cD)*{9w8OMA2 z6Y77H&;}K=d=u^g4j#n2-I4+T0NVxt02lz1t|Jmi4g zRHVFIjnVzx<;i#CC{4Z+*NJa=pq0P^K17};+T05F7Z&}W$W+{{jIVSx}As)@e z1YUW-sO$y9NT}u;Hf4D}M#(8u@Q>AiB?#a~p}pRzUD|^El1|Dp@|5cvvAtq^wbmdD zOg8i&eVH*up#UK4_ARR=oe@o

QVs#RQkCBBnL`;QSCW3aPmp``~{Q`F@Bu;EMi# zdp!jX&`|c!dwn)GgRp-8HEdeLra$km@8S+>+KBxR$!g7xfMyM-o1-J3c?0SwUDcp{i3leB zT`qjTqm|UKL&<1C`)BTHlaW{T8h)UEUX!7%*CM&@q%iI^k#+kiIf4l$y;gAh{h3ec zy)8XCt^LKn5BnQ*QV$=f>A}T5OxxdZxZmICBmPEK%XZ-rhmDZ!LKsoT;66|f@*ebB zN$h&8=T1E$Dzah=B3HarPR=qrN6wHV>p|nWu-2k7)8!0uz7$%EVz*nvPlUk{%1?mc;2VsUmCg`}VibVpm5_R! zq4#1DPElYT(}Ilk%GK%D}6sYA{ZM4LnI(%IgemoU19umTy2Y8+nKJ z;;J%=Ie&jNYg{wFWoy7m9N%FDjtS-%Zh>Ll6VVANc#o`irtAQMV<vKfe%HG70$}X=<%sopgf7m zIE?SZWLzXMB@c8=zS_qx?zbV219gh`dt_SA|rwe4Ig8iDj|Xz!OD=~1db{_e|jq; zrG5}$@*unUk~N~t^N+$x?f62d{972<_gcXQ)!u@O3&ewwk@SaAPhq85^%k6!ez%`4 z6xxXpTWxea%}~y)s-6aiUTzKfel9MhTG?~*3U9UY7_g5S;lv{JwdWggBZ$=2ohAoq z?94;o@VlaVD7a|rc|Jci9K(y4f2DD65qGKZ)HOUOLI49Q8E29{2e=1g8vanyi~X9J z6cSLJi7(@o{y0C-SI;`=<=(_^c>D}{7$a@N6&X&xtM0UcplIOKI4iHtGB+~Hw)S{r z^mqmJon%^tqWbU6wpQuiyMpu|+On+0fmEqK$M?jb9$_vP|JG=mb^ACcyg(I$FVEo+Y04=Z3%br(p(_%}GNQr1TJlou z*m8OfT~6d`U0zU;mq0P+8P~6t6gfHd<3%APnP*Vp+u_NK!+=% z?`yus*BF?>AmLDfiQSPb9iYhb<37S+VDo=@=4`7PYe$p$Bg+`oEP-o6j){LR#LB!F z!y^|Mm3_f55~}%zjaZfq&|Md9@Q>AiB?#bJp}F3v-P#NLC7pz&WS!{;vAtt_vD6^j zg8)npe)2kIioykeaJ$p1ZI6j2VIalUfy)G!swAd0JpcL_G7PABH}b&$CiJ`jZ@_;Q z{r7kT9H61>p}T)JX`XfKGYsmr1ylOj7P_F4hL5x9*GJRWo^OA;Un1{YfKy|y->+q? z>tO|no+l5{kI7M3r?U?mRj|>|+5J;=fEv|eZzWl+@d?nl1|4Q}0yL>X2TIT-$Aa*O zonu+V73x?P4P+yZz011%z-0|Dt;c_9e1DK%)T+xmY^L}G#viuo${M&mf6)DBH`B0J z`HOxZ_t!nhJwAbH`fK3!{PjQLuW$X?7Chl_zi(kana21Zs0F$EtwxA%wN)Ogp;OI= zk}TMi$OSKyld;qekt^iLYRb56SZh(5(Q*Zu&xO_^-|d$01z|8S+&28TQy~iUZes>p z{Y?u00+Z1O6tg-QU;_mT9f7e)v!5F#0e@dl!Y~xY-%b1uOW(Kd4=6U5$o zZ%uoFhP7MT;^5ocZ7@gh!N=Zn`s+D2P3H$$df%Xps8oicAVeN0R&k*=8G0|4{tS7> zQpIUmDagnQJGucJhv6NTU@51T;uh%F0}-8&oDIl&ugea=8HN%hC~I&OMEKWhK}+-Jg-#hc zrLf1^bvnfzvpMUiMm!>I>EGiUG<~&Ir>$ZKd-U!FJwa zuh}-mqj9^!k{Y{m+g=Oci{pj!T0(Wqu0jt6?zvE;uW(jAlE