diff options
author | Ugo Cei <ugo@apache.org> | 2008-01-24 10:16:35 +0000 |
---|---|---|
committer | Ugo Cei <ugo@apache.org> | 2008-01-24 10:16:35 +0000 |
commit | 05863eecef1bbf9e1d935ef474827eb81f6387a1 (patch) | |
tree | b8dd7390e520f333537a9010fbe50492a8ab5aed /src/java/org/apache/poi/hssf | |
parent | 1dda0ecda1eff8c48ad6b026291d407d907dc0d7 (diff) | |
download | poi-05863eecef1bbf9e1d935ef474827eb81f6387a1.tar.gz poi-05863eecef1bbf9e1d935ef474827eb81f6387a1.zip |
Merged revisions 614211 via svnmerge from
https://svn.apache.org/repos/asf/poi/trunk
........
r614211 | nick | 2008-01-22 15:48:51 +0100 (Tue, 22 Jan 2008) | 1 line
Fix from bug #41726 - support signed offsets from relative areas and references
........
git-svn-id: https://svn.apache.org/repos/asf/poi/branches/ooxml@614831 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'src/java/org/apache/poi/hssf')
-rwxr-xr-x | src/java/org/apache/poi/hssf/record/SharedFormulaRecord.java | 59 |
1 files changed, 37 insertions, 22 deletions
diff --git a/src/java/org/apache/poi/hssf/record/SharedFormulaRecord.java b/src/java/org/apache/poi/hssf/record/SharedFormulaRecord.java index e2871ac5cf..ae250246d3 100755 --- a/src/java/org/apache/poi/hssf/record/SharedFormulaRecord.java +++ b/src/java/org/apache/poi/hssf/record/SharedFormulaRecord.java @@ -156,8 +156,8 @@ public class SharedFormulaRecord 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 @@ public class SharedFormulaRecord 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 @@ public class SharedFormulaRecord 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 |