diff --git a/src/java/org/apache/poi/hssf/record/formula/AreaPtg.java b/src/java/org/apache/poi/hssf/record/formula/AreaPtg.java index 40aadc524..afbd0464c 100644 --- a/src/java/org/apache/poi/hssf/record/formula/AreaPtg.java +++ b/src/java/org/apache/poi/hssf/record/formula/AreaPtg.java @@ -63,7 +63,8 @@ package org.apache.poi.hssf.record.formula; import org.apache.poi.util.LittleEndian; import org.apache.poi.util.BitField; -import org.apache.poi.hssf.util.ReferenceUtil; +import org.apache.poi.hssf.util.AreaReference; +import org.apache.poi.hssf.util.CellReference; /** * Specifies a rectangular area of cells A1:A4 for instance. @@ -87,15 +88,17 @@ public class AreaPtg protected AreaPtg(String arearef) { - int[] xyxy = ReferenceUtil.getXYXYFromAreaRef(arearef); - setFirstRow((short)xyxy[0]); - setFirstColumn((short)xyxy[1]); - setLastRow((short)xyxy[2]); - setLastColumn((short)xyxy[3]); - setFirstColRelative(true); - setLastColRelative(true); - setFirstRowRelative(true); - setLastRowRelative(true); + //int[] xyxy = ReferenceUtil.getXYXYFromAreaRef(arearef); + AreaReference ar = new AreaReference(arearef); + + setFirstRow((short)ar.getCells()[0].getRow()); + setFirstColumn((short)ar.getCells()[0].getCol()); + setLastRow((short)ar.getCells()[1].getRow()); + setLastColumn((short)ar.getCells()[1].getCol()); + setFirstColRelative(!ar.getCells()[0].isColAbsolute()); + setLastColRelative(!ar.getCells()[1].isColAbsolute()); + setFirstRowRelative(!ar.getCells()[0].isRowAbsolute()); + setLastRowRelative(!ar.getCells()[1].isRowAbsolute()); } @@ -302,12 +305,8 @@ public class AreaPtg public String toFormulaString() { - String firstrow = "" + (getFirstRow() + 1); - String lastrow = null; - // String firstcol = ""+ - // String lastcol - return ReferenceUtil.getReferenceFromXY(getFirstRow(),getFirstColumn()) + ":" - + ReferenceUtil.getReferenceFromXY(getLastRow(),getLastColumn()); + return (new CellReference(getFirstRow(),getFirstColumn(),!isFirstRowRelative(),!isFirstColRelative())).toString() + ":" + + (new CellReference(getLastRow(),getLastColumn(),!isLastRowRelative(),!isLastColRelative())).toString(); } } diff --git a/src/java/org/apache/poi/hssf/util/AreaReference.java b/src/java/org/apache/poi/hssf/util/AreaReference.java index 5c1a8152b..33a10a978 100644 --- a/src/java/org/apache/poi/hssf/util/AreaReference.java +++ b/src/java/org/apache/poi/hssf/util/AreaReference.java @@ -76,6 +76,10 @@ private int dim; public int getDim() { return dim; } + /** return the cell references that define this area */ + public CellReference[] getCells() { + return cells; + } public String toString() { StringBuffer retval = new StringBuffer(); diff --git a/src/testcases/org/apache/poi/hssf/usermodel/TestFormulas.java b/src/testcases/org/apache/poi/hssf/usermodel/TestFormulas.java index 05ba984a2..d4006cc42 100644 --- a/src/testcases/org/apache/poi/hssf/usermodel/TestFormulas.java +++ b/src/testcases/org/apache/poi/hssf/usermodel/TestFormulas.java @@ -678,7 +678,8 @@ extends TestCase { c = r.createCell((short) 0); c.setCellFormula(function+"(A2:A4,B2:B4)"); - + c=r.createCell((short) 1); + c.setCellFormula(function+"($A$2:$A4,B$2:B4)"); wb.write(out); out.close(); @@ -693,6 +694,11 @@ extends TestCase { assertTrue("function ="+function+"(A2:A4,B2:B4)", ( (function+"(A2:A4,B2:B4)").equals(c.getCellFormula()) ) ); + + c=r.getCell((short) 1); + assertTrue("function ="+function+"($A$2:$A4,B$2:B4)", + ( (function+"($A$2:$A4,B$2:B4)").equals(c.getCellFormula()) ) + ); in.close(); } diff --git a/src/testcases/org/apache/poi/hssf/util/TestAreaReference.java b/src/testcases/org/apache/poi/hssf/util/TestAreaReference.java new file mode 100644 index 000000000..3156a40b8 --- /dev/null +++ b/src/testcases/org/apache/poi/hssf/util/TestAreaReference.java @@ -0,0 +1,80 @@ +/* ==================================================================== + * The Apache Software License, Version 1.1 + * + * Copyright (c) 2002 The Apache Software Foundation. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, + * if any, must include the following acknowledgment: + * "This product includes software developed by the + * Apache Software Foundation (http://www.apache.org/)." + * Alternately, this acknowledgment may appear in the software itself, + * if and wherever such third-party acknowledgments normally appear. + * + * 4. The names "Apache" and "Apache Software Foundation" and + * "Apache POI" must not be used to endorse or promote products + * derived from this software without prior written permission. For + * written permission, please contact apache@apache.org. + * + * 5. Products derived from this software may not be called "Apache", + * "Apache POI", nor may "Apache" appear in their name, without + * prior written permission of the Apache Software Foundation. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * . + */ + +package org.apache.poi.hssf.util; + +import junit.framework.TestCase; + +public class TestAreaReference extends TestCase { + public TestAreaReference(String s) { + super(s); + } + public void testAreaRef1() { + AreaReference ar = new AreaReference("$A$1:$B$2"); + assertTrue("Two cells expected",ar.getCells().length == 2); + CellReference cf = ar.getCells()[0]; + assertTrue("row is 4",cf.getRow()==0); + assertTrue("col is 1",cf.getCol()==0); + assertTrue("row is abs",cf.isRowAbsolute()); + assertTrue("col is abs",cf.isColAbsolute()); + assertTrue("string is $A$1",cf.toString().equals("$A$1")); + + cf = ar.getCells()[1]; + assertTrue("row is 4",cf.getRow()==1); + assertTrue("col is 1",cf.getCol()==1); + assertTrue("row is abs",cf.isRowAbsolute()); + assertTrue("col is abs",cf.isColAbsolute()); + assertTrue("string is $B$2",cf.toString().equals("$B$2")); + } +} \ No newline at end of file diff --git a/src/testcases/org/apache/poi/hssf/util/TestCellReference.java b/src/testcases/org/apache/poi/hssf/util/TestCellReference.java index 5482ccd80..fb970ec4e 100644 --- a/src/testcases/org/apache/poi/hssf/util/TestCellReference.java +++ b/src/testcases/org/apache/poi/hssf/util/TestCellReference.java @@ -97,6 +97,42 @@ public class TestCellReference extends TestCase { assertTrue("col is rel",!cf.isColAbsolute()); assertTrue("string is B$5",cf.toString().equals("B$5")); } + + public void testAbsRef5(){ + CellReference cf = new CellReference("$B5"); + assertTrue("row is 4",cf.getRow()==4); + assertTrue("col is 1",cf.getCol()==1); + assertTrue("row is abs",!cf.isRowAbsolute()); + assertTrue("col is rel",cf.isColAbsolute()); + assertTrue("string is B$5",cf.toString().equals("$B5")); + } + + public void testAbsRef6(){ + CellReference cf = new CellReference(4,1,false,true); + assertTrue("row is 4",cf.getRow()==4); + assertTrue("col is 1",cf.getCol()==1); + assertTrue("row is abs",!cf.isRowAbsolute()); + assertTrue("col is rel",cf.isColAbsolute()); + assertTrue("string is B$5",cf.toString().equals("$B5")); + } + + public void testAbsRef7(){ + CellReference cf = new CellReference("B5"); + assertTrue("row is 4",cf.getRow()==4); + assertTrue("col is 1",cf.getCol()==1); + assertTrue("row is abs",!cf.isRowAbsolute()); + assertTrue("col is rel",!cf.isColAbsolute()); + assertTrue("string is B$5",cf.toString().equals("B5")); + } + + public void testAbsRef8(){ + CellReference cf = new CellReference(4,1,false,false); + assertTrue("row is 4",cf.getRow()==4); + assertTrue("col is 1",cf.getCol()==1); + assertTrue("row is abs",!cf.isRowAbsolute()); + assertTrue("col is rel",!cf.isColAbsolute()); + assertTrue("string is B$5",cf.toString().equals("B5")); + } public static void main(String [] args) {