Don't swap AreaPtg references from relative to absolute, by correctly processing the fields. Patch from bug #44293
git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@615255 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
parent
159a3b3bcb
commit
f57fda3af5
@ -36,6 +36,7 @@
|
|||||||
|
|
||||||
<!-- Don't forget to update status.xml too! -->
|
<!-- Don't forget to update status.xml too! -->
|
||||||
<release version="3.0.2-FINAL" date="2008-??-??">
|
<release version="3.0.2-FINAL" date="2008-??-??">
|
||||||
|
<action dev="POI-DEVELOPERS" type="fix">44293 - Avoid swapping AreaPtgs from relative to absolute</action>
|
||||||
<action dev="POI-DEVELOPERS" type="fix">44292 - Correctly process the last paragraph in a word file</action>
|
<action dev="POI-DEVELOPERS" type="fix">44292 - Correctly process the last paragraph in a word file</action>
|
||||||
<action dev="POI-DEVELOPERS" type="fix">44254 - Avoid some unread byte warnings, and properly understand DVALRecord</action>
|
<action dev="POI-DEVELOPERS" type="fix">44254 - Avoid some unread byte warnings, and properly understand DVALRecord</action>
|
||||||
<action dev="POI-DEVELOPERS" type="add">Add another formula evaluation method, evaluateFormulaCell(cell), which will re-calculate the value for a formula, without affecting the formula itself.</action>
|
<action dev="POI-DEVELOPERS" type="add">Add another formula evaluation method, evaluateFormulaCell(cell), which will re-calculate the value for a formula, without affecting the formula itself.</action>
|
||||||
|
@ -33,6 +33,7 @@
|
|||||||
<!-- Don't forget to update changes.xml too! -->
|
<!-- Don't forget to update changes.xml too! -->
|
||||||
<changes>
|
<changes>
|
||||||
<release version="3.0.2-FINAL" date="2008-??-??">
|
<release version="3.0.2-FINAL" date="2008-??-??">
|
||||||
|
<action dev="POI-DEVELOPERS" type="fix">44293 - Avoid swapping AreaPtgs from relative to absolute</action>
|
||||||
<action dev="POI-DEVELOPERS" type="fix">44292 - Correctly process the last paragraph in a word file</action>
|
<action dev="POI-DEVELOPERS" type="fix">44292 - Correctly process the last paragraph in a word file</action>
|
||||||
<action dev="POI-DEVELOPERS" type="fix">44254 - Avoid some unread byte warnings, and properly understand DVALRecord</action>
|
<action dev="POI-DEVELOPERS" type="fix">44254 - Avoid some unread byte warnings, and properly understand DVALRecord</action>
|
||||||
<action dev="POI-DEVELOPERS" type="add">Add another formula evaluation method, evaluateFormulaCell(cell), which will re-calculate the value for a formula, without affecting the formula itself.</action>
|
<action dev="POI-DEVELOPERS" type="add">Add another formula evaluation method, evaluateFormulaCell(cell), which will re-calculate the value for a formula, without affecting the formula itself.</action>
|
||||||
|
@ -43,9 +43,9 @@ public class AreaPtg
|
|||||||
private short field_3_first_column;
|
private short field_3_first_column;
|
||||||
private short field_4_last_column;
|
private short field_4_last_column;
|
||||||
|
|
||||||
private BitField rowRelative = BitFieldFactory.getInstance(0x8000);
|
private final static BitField rowRelative = BitFieldFactory.getInstance(0x8000);
|
||||||
private BitField colRelative = BitFieldFactory.getInstance(0x4000);
|
private final static BitField colRelative = BitFieldFactory.getInstance(0x4000);
|
||||||
private BitField column = BitFieldFactory.getInstance(0x3FFF);
|
private final static BitField columnMask = BitFieldFactory.getInstance(0x3FFF);
|
||||||
|
|
||||||
protected AreaPtg() {
|
protected AreaPtg() {
|
||||||
//Required for clone methods
|
//Required for clone methods
|
||||||
@ -157,7 +157,7 @@ public class AreaPtg
|
|||||||
*/
|
*/
|
||||||
public short getFirstColumn()
|
public short getFirstColumn()
|
||||||
{
|
{
|
||||||
return column.getShortValue(field_3_first_column);
|
return columnMask.getShortValue(field_3_first_column);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -204,7 +204,7 @@ public class AreaPtg
|
|||||||
*/
|
*/
|
||||||
public void setFirstColumn(short column)
|
public void setFirstColumn(short column)
|
||||||
{
|
{
|
||||||
field_3_first_column = column; // fixme
|
field_3_first_column=columnMask.setShortValue(field_3_first_column, column);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -220,7 +220,7 @@ public class AreaPtg
|
|||||||
*/
|
*/
|
||||||
public short getLastColumn()
|
public short getLastColumn()
|
||||||
{
|
{
|
||||||
return column.getShortValue(field_4_last_column);
|
return columnMask.getShortValue(field_4_last_column);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -269,7 +269,7 @@ public class AreaPtg
|
|||||||
*/
|
*/
|
||||||
public void setLastColumn(short column)
|
public void setLastColumn(short column)
|
||||||
{
|
{
|
||||||
field_4_last_column = column; // fixme
|
field_4_last_column=columnMask.setShortValue(field_4_last_column, column);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -0,0 +1,114 @@
|
|||||||
|
|
||||||
|
/* ====================================================================
|
||||||
|
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;
|
||||||
|
|
||||||
|
import junit.framework.TestCase;
|
||||||
|
|
||||||
|
import org.apache.poi.hssf.model.FormulaParser;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Tests for {@link AreaPtg}.
|
||||||
|
*
|
||||||
|
* @author Dmitriy Kumshayev
|
||||||
|
*/
|
||||||
|
public class TestAreaPtg extends TestCase
|
||||||
|
{
|
||||||
|
|
||||||
|
AreaPtg relative;
|
||||||
|
AreaPtg absolute;
|
||||||
|
|
||||||
|
protected void setUp() throws Exception
|
||||||
|
{
|
||||||
|
super.setUp();
|
||||||
|
short firstRow=5;
|
||||||
|
short lastRow=13;
|
||||||
|
short firstCol=7;
|
||||||
|
short lastCol=17;
|
||||||
|
relative = new AreaPtg(firstRow,lastRow,firstCol,lastCol,true,true,true,true);
|
||||||
|
absolute = new AreaPtg(firstRow,lastRow,firstCol,lastCol,false,false,false,false);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void testSetColumnsAbsolute()
|
||||||
|
{
|
||||||
|
resetColumns(absolute);
|
||||||
|
validateReference(true, absolute);
|
||||||
|
}
|
||||||
|
public void testSetColumnsRelative()
|
||||||
|
{
|
||||||
|
resetColumns(relative);
|
||||||
|
validateReference(false, relative);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void validateReference(boolean abs, AreaPtg ref)
|
||||||
|
{
|
||||||
|
assertEquals("First column reference is not "+(abs?"absolute":"relative"),abs,!ref.isFirstColRelative());
|
||||||
|
assertEquals("Last column reference is not "+(abs?"absolute":"relative"),abs,!ref.isLastColRelative());
|
||||||
|
assertEquals("First row reference is not "+(abs?"absolute":"relative"),abs,!ref.isFirstRowRelative());
|
||||||
|
assertEquals("Last row reference is not "+(abs?"absolute":"relative"),abs,!ref.isLastRowRelative());
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public void resetColumns(AreaPtg aptg)
|
||||||
|
{
|
||||||
|
short fc = aptg.getFirstColumn();
|
||||||
|
short lc = aptg.getLastColumn();
|
||||||
|
aptg.setFirstColumn(fc);
|
||||||
|
aptg.setLastColumn(lc);
|
||||||
|
assertEquals(fc , aptg.getFirstColumn() );
|
||||||
|
assertEquals(lc , aptg.getLastColumn() );
|
||||||
|
}
|
||||||
|
|
||||||
|
public void testFormulaParser()
|
||||||
|
{
|
||||||
|
String formula1="SUM($E$5:$E$6)";
|
||||||
|
String expectedFormula1="SUM($F$5:$F$6)";
|
||||||
|
String newFormula1 = shiftAllColumnsBy1(formula1);
|
||||||
|
assertEquals("Absolute references changed", expectedFormula1, newFormula1);
|
||||||
|
|
||||||
|
String formula2="SUM(E5:E6)";
|
||||||
|
String expectedFormula2="SUM(F5:F6)";
|
||||||
|
String newFormula2 = shiftAllColumnsBy1(formula2);
|
||||||
|
assertEquals("Relative references changed", expectedFormula2, newFormula2);
|
||||||
|
}
|
||||||
|
|
||||||
|
private String shiftAllColumnsBy1(String formula)
|
||||||
|
{
|
||||||
|
int letUsShiftColumn1By1Column=1;
|
||||||
|
|
||||||
|
FormulaParser parser = new FormulaParser(formula,null);
|
||||||
|
parser.parse();
|
||||||
|
|
||||||
|
final Ptg[] ptgs = parser.getRPNPtg();
|
||||||
|
for(int i=0; i<ptgs.length; i++)
|
||||||
|
{
|
||||||
|
Ptg ptg = ptgs[i];
|
||||||
|
if (ptg instanceof AreaPtg )
|
||||||
|
{
|
||||||
|
AreaPtg aptg = (AreaPtg)ptg;
|
||||||
|
aptg.setFirstColumn((short)(aptg.getFirstColumn()+letUsShiftColumn1By1Column));
|
||||||
|
aptg.setLastColumn((short)(aptg.getLastColumn()+letUsShiftColumn1By1Column));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
String newFormula = parser.toFormulaString(ptgs);
|
||||||
|
return newFormula;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user