Extend named range support in formulas to include non-contiguous named ranges
git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@610026 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
parent
b67b9cb0ce
commit
808d3ad9eb
@ -36,7 +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="add">43510 - Add support for named ranges in formulas</action>
|
<action dev="POI-DEVELOPERS" type="add">43510 - Add support for named ranges in formulas, including non-contiguous named ranges</action>
|
||||||
<action dev="POI-DEVELOPERS" type="add">43937 - Add support for hiding and un-hiding sheets, and checking their current hidden status</action>
|
<action dev="POI-DEVELOPERS" type="add">43937 - Add support for hiding and un-hiding sheets, and checking their current hidden status</action>
|
||||||
<action dev="POI-DEVELOPERS" type="fix">44167 - Fix for non-contiguous named ranges</action>
|
<action dev="POI-DEVELOPERS" type="fix">44167 - Fix for non-contiguous named ranges</action>
|
||||||
<action dev="POI-DEVELOPERS" type="fix">44070 - Fix for shifting comments when shifting rows</action>
|
<action dev="POI-DEVELOPERS" type="fix">44070 - Fix for shifting comments when shifting rows</action>
|
||||||
|
@ -33,7 +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="add">43510 - Add support for named ranges in formulas</action>
|
<action dev="POI-DEVELOPERS" type="add">43510 - Add support for named ranges in formulas, including non-contiguous named ranges</action>
|
||||||
<action dev="POI-DEVELOPERS" type="add">43937 - Add support for hiding and un-hiding sheets, and checking their current hidden status</action>
|
<action dev="POI-DEVELOPERS" type="add">43937 - Add support for hiding and un-hiding sheets, and checking their current hidden status</action>
|
||||||
<action dev="POI-DEVELOPERS" type="fix">44167 - Fix for non-contiguous named ranges</action>
|
<action dev="POI-DEVELOPERS" type="fix">44167 - Fix for non-contiguous named ranges</action>
|
||||||
<action dev="POI-DEVELOPERS" type="fix">44070 - Fix for shifting comments when shifting rows</action>
|
<action dev="POI-DEVELOPERS" type="fix">44070 - Fix for shifting comments when shifting rows</action>
|
||||||
|
@ -24,6 +24,7 @@ import java.util.Iterator;
|
|||||||
|
|
||||||
import org.apache.poi.hssf.model.Workbook;
|
import org.apache.poi.hssf.model.Workbook;
|
||||||
import org.apache.poi.hssf.record.formula.*;
|
import org.apache.poi.hssf.record.formula.*;
|
||||||
|
import org.apache.poi.hssf.util.AreaReference;
|
||||||
import org.apache.poi.hssf.util.RangeAddress;
|
import org.apache.poi.hssf.util.RangeAddress;
|
||||||
import org.apache.poi.util.HexDump;
|
import org.apache.poi.util.HexDump;
|
||||||
import org.apache.poi.util.LittleEndian;
|
import org.apache.poi.util.LittleEndian;
|
||||||
@ -712,19 +713,32 @@ public class NameRecord extends Record {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (ra.hasRange()) {
|
if (ra.hasRange()) {
|
||||||
ptg = new Area3DPtg();
|
// Is it contiguous or not?
|
||||||
((Area3DPtg) ptg).setExternSheetIndex(externSheetIndex);
|
AreaReference[] refs =
|
||||||
((Area3DPtg) ptg).setArea(ref);
|
AreaReference.generateContiguous(ref);
|
||||||
this.setDefinitionTextLength((short)ptg.getSize());
|
this.setDefinitionTextLength((short)0);
|
||||||
|
|
||||||
|
// Add the area reference(s)
|
||||||
|
for(int i=0; i<refs.length; i++) {
|
||||||
|
ptg = new Area3DPtg();
|
||||||
|
((Area3DPtg) ptg).setExternSheetIndex(externSheetIndex);
|
||||||
|
((Area3DPtg) ptg).setArea(refs[i].toString());
|
||||||
|
field_13_name_definition.push(ptg);
|
||||||
|
this.setDefinitionTextLength( (short)(getDefinitionLength() + ptg.getSize()) );
|
||||||
|
}
|
||||||
|
// And then a union if we had more than one area
|
||||||
|
if(refs.length > 1) {
|
||||||
|
ptg = new UnionPtg();
|
||||||
|
field_13_name_definition.push(ptg);
|
||||||
|
this.setDefinitionTextLength( (short)(getDefinitionLength() + ptg.getSize()) );
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
ptg = new Ref3DPtg();
|
ptg = new Ref3DPtg();
|
||||||
((Ref3DPtg) ptg).setExternSheetIndex(externSheetIndex);
|
((Ref3DPtg) ptg).setExternSheetIndex(externSheetIndex);
|
||||||
((Ref3DPtg) ptg).setArea(ref);
|
((Ref3DPtg) ptg).setArea(ref);
|
||||||
|
field_13_name_definition.push(ptg);
|
||||||
this.setDefinitionTextLength((short)ptg.getSize());
|
this.setDefinitionTextLength((short)ptg.getSize());
|
||||||
}
|
}
|
||||||
|
|
||||||
field_13_name_definition.push(ptg);
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -858,6 +872,15 @@ public class NameRecord extends Record {
|
|||||||
.append("\n");
|
.append("\n");
|
||||||
buffer.append(" .Name (Unicode text) = ").append( getNameText() )
|
buffer.append(" .Name (Unicode text) = ").append( getNameText() )
|
||||||
.append("\n");
|
.append("\n");
|
||||||
|
|
||||||
|
buffer.append(" .Parts (" + field_13_name_definition.size() +"):")
|
||||||
|
.append("\n");
|
||||||
|
Iterator it = field_13_name_definition.iterator();
|
||||||
|
while(it.hasNext()) {
|
||||||
|
Ptg ptg = (Ptg)it.next();
|
||||||
|
buffer.append(" " + ptg.toString()).append("\n");
|
||||||
|
}
|
||||||
|
|
||||||
buffer.append(" .Menu text (Unicode string without length field) = ").append( field_14_custom_menu_text )
|
buffer.append(" .Menu text (Unicode string without length field) = ").append( field_14_custom_menu_text )
|
||||||
.append("\n");
|
.append("\n");
|
||||||
buffer.append(" .Description text (Unicode string without length field) = ").append( field_15_description_text )
|
buffer.append(" .Description text (Unicode string without length field) = ").append( field_15_description_text )
|
||||||
|
@ -243,16 +243,22 @@ public class Area3DPtg extends Ptg
|
|||||||
public void setArea( String ref )
|
public void setArea( String ref )
|
||||||
{
|
{
|
||||||
AreaReference ar = new AreaReference( ref );
|
AreaReference ar = new AreaReference( ref );
|
||||||
|
CellReference[] crs = ar.getCells();
|
||||||
|
|
||||||
setFirstRow( (short) ar.getCells()[0].getRow() );
|
CellReference firstCell = crs[0];
|
||||||
setFirstColumn( (short) ar.getCells()[0].getCol() );
|
CellReference lastCell = firstCell;
|
||||||
setLastRow( (short) ar.getCells()[1].getRow() );
|
if(crs.length > 1) {
|
||||||
setLastColumn( (short) ar.getCells()[1].getCol() );
|
lastCell = crs[1];
|
||||||
setFirstColRelative( !ar.getCells()[0].isColAbsolute() );
|
}
|
||||||
setLastColRelative( !ar.getCells()[1].isColAbsolute() );
|
|
||||||
setFirstRowRelative( !ar.getCells()[0].isRowAbsolute() );
|
|
||||||
setLastRowRelative( !ar.getCells()[1].isRowAbsolute() );
|
|
||||||
|
|
||||||
|
setFirstRow( (short) firstCell.getRow() );
|
||||||
|
setFirstColumn( (short) firstCell.getCol() );
|
||||||
|
setLastRow( (short) lastCell.getRow() );
|
||||||
|
setLastColumn( (short) lastCell.getCol() );
|
||||||
|
setFirstColRelative( !firstCell.isColAbsolute() );
|
||||||
|
setLastColRelative( !lastCell.isColAbsolute() );
|
||||||
|
setFirstRowRelative( !firstCell.isRowAbsolute() );
|
||||||
|
setLastRowRelative( !lastCell.isRowAbsolute() );
|
||||||
}
|
}
|
||||||
|
|
||||||
public String toFormulaString(Workbook book)
|
public String toFormulaString(Workbook book)
|
||||||
|
@ -382,6 +382,15 @@ public class TestFormulaParser extends TestCase {
|
|||||||
assertTrue("two tokens expected, got "+ptgs.length,ptgs.length == 2);
|
assertTrue("two tokens expected, got "+ptgs.length,ptgs.length == 2);
|
||||||
assertEquals(NamePtg.class, ptgs[0].getClass());
|
assertEquals(NamePtg.class, ptgs[0].getClass());
|
||||||
assertEquals(FuncVarPtg.class, ptgs[1].getClass());
|
assertEquals(FuncVarPtg.class, ptgs[1].getClass());
|
||||||
|
|
||||||
|
// And make it non-contiguous
|
||||||
|
name.setReference("A1:A2,C3");
|
||||||
|
fp = HSSFFormulaEvaluator.getUnderlyingParser(workbook, "SUM(testName)");
|
||||||
|
fp.parse();
|
||||||
|
ptgs = fp.getRPNPtg();
|
||||||
|
assertTrue("two tokens expected, got "+ptgs.length,ptgs.length == 2);
|
||||||
|
assertEquals(NamePtg.class, ptgs[0].getClass());
|
||||||
|
assertEquals(FuncVarPtg.class, ptgs[1].getClass());
|
||||||
}
|
}
|
||||||
|
|
||||||
public void testLookupAndMatchFunctionArgs()
|
public void testLookupAndMatchFunctionArgs()
|
||||||
|
Loading…
Reference in New Issue
Block a user