You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@poi.apache.org by ni...@apache.org on 2008/01/22 15:49:07 UTC
svn commit: r614211 - in /poi/trunk/src: documentation/content/xdocs/
java/org/apache/poi/hssf/record/ testcases/org/apache/poi/hssf/data/
testcases/org/apache/poi/hssf/usermodel/
Author: nick
Date: Tue Jan 22 06:48:51 2008
New Revision: 614211
URL: http://svn.apache.org/viewvc?rev=614211&view=rev
Log:
Fix from bug #41726 - support signed offsets from relative areas and references
Added:
poi/trunk/src/testcases/org/apache/poi/hssf/data/SharedFormulaTest.xls (with props)
Modified:
poi/trunk/src/documentation/content/xdocs/changes.xml
poi/trunk/src/documentation/content/xdocs/status.xml
poi/trunk/src/java/org/apache/poi/hssf/record/SharedFormulaRecord.java
poi/trunk/src/testcases/org/apache/poi/hssf/usermodel/TestFormulas.java
Modified: poi/trunk/src/documentation/content/xdocs/changes.xml
URL: http://svn.apache.org/viewvc/poi/trunk/src/documentation/content/xdocs/changes.xml?rev=614211&r1=614210&r2=614211&view=diff
==============================================================================
--- poi/trunk/src/documentation/content/xdocs/changes.xml (original)
+++ poi/trunk/src/documentation/content/xdocs/changes.xml Tue Jan 22 06:48:51 2008
@@ -36,6 +36,7 @@
<!-- Don't forget to update status.xml too! -->
<release version="3.0.2-FINAL" date="2008-??-??">
+ <action dev="POI-DEVELOPERS" type="fix">41726 - Fix how we handle signed cell offsets in relative areas and references</action>
<action dev="POI-DEVELOPERS" type="add">44233 - Support for getting and setting a flag on the sheet, which tells excel to re-calculate all formulas on it at next reload</action>
<action dev="POI-DEVELOPERS" type="fix">44201 - Enable cloning of sheets with data validation rules</action>
<action dev="POI-DEVELOPERS" type="fix">44200 - Enable cloning of sheets with notes</action>
Modified: poi/trunk/src/documentation/content/xdocs/status.xml
URL: http://svn.apache.org/viewvc/poi/trunk/src/documentation/content/xdocs/status.xml?rev=614211&r1=614210&r2=614211&view=diff
==============================================================================
--- poi/trunk/src/documentation/content/xdocs/status.xml (original)
+++ poi/trunk/src/documentation/content/xdocs/status.xml Tue Jan 22 06:48:51 2008
@@ -33,6 +33,7 @@
<!-- Don't forget to update changes.xml too! -->
<changes>
<release version="3.0.2-FINAL" date="2008-??-??">
+ <action dev="POI-DEVELOPERS" type="fix">41726 - Fix how we handle signed cell offsets in relative areas and references</action>
<action dev="POI-DEVELOPERS" type="add">44233 - Support for getting and setting a flag on the sheet, which tells excel to re-calculate all formulas on it at next reload</action>
<action dev="POI-DEVELOPERS" type="fix">44201 - Enable cloning of sheets with data validation rules</action>
<action dev="POI-DEVELOPERS" type="fix">44200 - Enable cloning of sheets with notes</action>
Modified: poi/trunk/src/java/org/apache/poi/hssf/record/SharedFormulaRecord.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/hssf/record/SharedFormulaRecord.java?rev=614211&r1=614210&r2=614211&view=diff
==============================================================================
--- poi/trunk/src/java/org/apache/poi/hssf/record/SharedFormulaRecord.java (original)
+++ poi/trunk/src/java/org/apache/poi/hssf/record/SharedFormulaRecord.java Tue Jan 22 06:48:51 2008
@@ -156,8 +156,8 @@
protected void fillFields(RecordInputStream in)
{
- field_1_first_row = in.readShort();
- field_2_last_row = in.readShort();
+ field_1_first_row = in.readUShort();
+ field_2_last_row = in.readUShort();
field_3_first_column = in.readUByte();
field_4_last_column = in.readUByte();
field_5_reserved = in.readShort();
@@ -200,48 +200,48 @@
Ptg ptg = (Ptg) field_7_parsed_expr.get(k);
if (ptg instanceof RefNPtg) {
RefNPtg refNPtg = (RefNPtg)ptg;
- ptg = new ReferencePtg( (short)(formulaRow + refNPtg.getRow()),
- (byte)(formulaColumn + refNPtg.getColumn()),
+ ptg = new ReferencePtg(fixupRelativeRow(formulaRow,refNPtg.getRow(),refNPtg.isRowRelative()),
+ fixupRelativeColumn(formulaColumn,refNPtg.getColumn(),refNPtg.isColRelative()),
refNPtg.isRowRelative(),
refNPtg.isColRelative());
} else if (ptg instanceof RefNVPtg) {
RefNVPtg refNVPtg = (RefNVPtg)ptg;
- ptg = new RefVPtg( (short)(formulaRow + refNVPtg.getRow()),
- (byte)(formulaColumn + refNVPtg.getColumn()),
- refNVPtg.isRowRelative(),
- refNVPtg.isColRelative());
+ ptg = new RefVPtg(fixupRelativeRow(formulaRow,refNVPtg.getRow(),refNVPtg.isRowRelative()),
+ fixupRelativeColumn(formulaColumn,refNVPtg.getColumn(),refNVPtg.isColRelative()),
+ refNVPtg.isRowRelative(),
+ refNVPtg.isColRelative());
} else if (ptg instanceof RefNAPtg) {
RefNAPtg refNAPtg = (RefNAPtg)ptg;
- ptg = new RefAPtg( (short)(formulaRow + refNAPtg.getRow()),
- (byte)(formulaColumn + refNAPtg.getColumn()),
+ ptg = new RefAPtg( fixupRelativeRow(formulaRow,refNAPtg.getRow(),refNAPtg.isRowRelative()),
+ fixupRelativeColumn(formulaColumn,refNAPtg.getColumn(),refNAPtg.isColRelative()),
refNAPtg.isRowRelative(),
refNAPtg.isColRelative());
} else if (ptg instanceof AreaNPtg) {
AreaNPtg areaNPtg = (AreaNPtg)ptg;
- ptg = new AreaPtg((short)(formulaRow + areaNPtg.getFirstRow()),
- (short)(formulaRow + areaNPtg.getLastRow()),
- (short)(formulaColumn + areaNPtg.getFirstColumn()),
- (short)(formulaColumn + areaNPtg.getLastColumn()),
+ ptg = new AreaPtg(fixupRelativeRow(formulaRow,areaNPtg.getFirstRow(),areaNPtg.isFirstRowRelative()),
+ fixupRelativeRow(formulaRow,areaNPtg.getLastRow(),areaNPtg.isLastRowRelative()),
+ fixupRelativeColumn(formulaColumn,areaNPtg.getFirstColumn(),areaNPtg.isFirstColRelative()),
+ fixupRelativeColumn(formulaColumn,areaNPtg.getLastColumn(),areaNPtg.isLastColRelative()),
areaNPtg.isFirstRowRelative(),
areaNPtg.isLastRowRelative(),
areaNPtg.isFirstColRelative(),
areaNPtg.isLastColRelative());
} else if (ptg instanceof AreaNVPtg) {
AreaNVPtg areaNVPtg = (AreaNVPtg)ptg;
- ptg = new AreaVPtg((short)(formulaRow + areaNVPtg.getFirstRow()),
- (short)(formulaRow + areaNVPtg.getLastRow()),
- (short)(formulaColumn + areaNVPtg.getFirstColumn()),
- (short)(formulaColumn + areaNVPtg.getLastColumn()),
+ ptg = new AreaVPtg(fixupRelativeRow(formulaRow,areaNVPtg.getFirstRow(),areaNVPtg.isFirstRowRelative()),
+ fixupRelativeRow(formulaRow,areaNVPtg.getLastRow(),areaNVPtg.isLastRowRelative()),
+ fixupRelativeColumn(formulaColumn,areaNVPtg.getFirstColumn(),areaNVPtg.isFirstColRelative()),
+ fixupRelativeColumn(formulaColumn,areaNVPtg.getLastColumn(),areaNVPtg.isLastColRelative()),
areaNVPtg.isFirstRowRelative(),
areaNVPtg.isLastRowRelative(),
areaNVPtg.isFirstColRelative(),
areaNVPtg.isLastColRelative());
} else if (ptg instanceof AreaNAPtg) {
AreaNAPtg areaNAPtg = (AreaNAPtg)ptg;
- ptg = new AreaAPtg((short)(formulaRow + areaNAPtg.getFirstRow()),
- (short)(formulaRow + areaNAPtg.getLastRow()),
- (short)(formulaColumn + areaNAPtg.getFirstColumn()),
- (short)(formulaColumn + areaNAPtg.getLastColumn()),
+ ptg = new AreaAPtg(fixupRelativeRow(formulaRow,areaNAPtg.getFirstRow(),areaNAPtg.isFirstRowRelative()),
+ fixupRelativeRow(formulaRow,areaNAPtg.getLastRow(),areaNAPtg.isLastRowRelative()),
+ fixupRelativeColumn(formulaColumn,areaNAPtg.getFirstColumn(),areaNAPtg.isFirstColRelative()),
+ fixupRelativeColumn(formulaColumn,areaNAPtg.getLastColumn(),areaNAPtg.isLastColRelative()),
areaNAPtg.isFirstRowRelative(),
areaNAPtg.isLastRowRelative(),
areaNAPtg.isFirstColRelative(),
@@ -256,6 +256,21 @@
throw new RuntimeException("Shared Formula Conversion: Coding Error");
}
}
+
+ private short fixupRelativeColumn(int currentcolumn, short column, boolean relative) {
+ if(relative) {
+ if((column&128)!=0) column=(short)(column-256);
+ column+=currentcolumn;
+ }
+ return column;
+ }
+
+ private short fixupRelativeRow(int currentrow, short row, boolean relative) {
+ if(relative) {
+ row+=currentrow;
+ }
+ return row;
+ }
/**
* Mirroring formula records so it is registered in the ValueRecordsAggregate
Added: poi/trunk/src/testcases/org/apache/poi/hssf/data/SharedFormulaTest.xls
URL: http://svn.apache.org/viewvc/poi/trunk/src/testcases/org/apache/poi/hssf/data/SharedFormulaTest.xls?rev=614211&view=auto
==============================================================================
Binary file - no diff available.
Propchange: poi/trunk/src/testcases/org/apache/poi/hssf/data/SharedFormulaTest.xls
------------------------------------------------------------------------------
svn:mime-type = application/octet-stream
Modified: poi/trunk/src/testcases/org/apache/poi/hssf/usermodel/TestFormulas.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/testcases/org/apache/poi/hssf/usermodel/TestFormulas.java?rev=614211&r1=614210&r2=614211&view=diff
==============================================================================
--- poi/trunk/src/testcases/org/apache/poi/hssf/usermodel/TestFormulas.java (original)
+++ poi/trunk/src/testcases/org/apache/poi/hssf/usermodel/TestFormulas.java Tue Jan 22 06:48:51 2008
@@ -1127,6 +1127,17 @@
cell.setCellFormula("IF(A1=\"A\",1,)");
}
+ public void testSharedFormula() throws Exception {
+ String readFilename = System.getProperty("HSSF.testdata.path");
+ File inFile = new File(readFilename+"/SharedFormulaTest.xls");
+ FileInputStream fis = new FileInputStream(inFile);
+ HSSFWorkbook wb = new HSSFWorkbook(fis);
+
+ assertEquals("A$1*2", wb.getSheetAt(0).getRow(1).getCell((short)1).toString());
+ assertEquals("$A11*2", wb.getSheetAt(0).getRow(11).getCell((short)1).toString());
+ assertEquals("DZ2*2", wb.getSheetAt(0).getRow(1).getCell((short)128).toString());
+ assertEquals("B32770*2", wb.getSheetAt(0).getRow(32768).getCell((short)1).toString());
+ }
public static void main(String [] args) {
System.out
---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@poi.apache.org
For additional commands, e-mail: commits-help@poi.apache.org