--- /Users/ce/Documents/workspace/POI/src/java/org/apache/poi/hssf/record/SharedFormulaRecord.java (revision 512703) +++ /Users/ce/Documents/workspace/POI/src/java/org/apache/poi/hssf/record/SharedFormulaRecord.java (working copy) @@ -205,8 +205,8 @@ 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( (short)(fixupRelativeRow(formulaRow,refNPtg.getRow(),refNPtg.isRowRelative())), + (byte)(fixupRelativeColumn(formulaColumn,refNPtg.getColumn(),refNPtg.isColRelative())), refNPtg.isRowRelative(), refNPtg.isColRelative()); } else if (ptg instanceof RefNVPtg) { @@ -211,8 +211,8 @@ refNPtg.isColRelative()); } else if (ptg instanceof RefNVPtg) { RefNVPtg refNVPtg = (RefNVPtg)ptg; - ptg = new RefVPtg( (short)(formulaRow + refNVPtg.getRow()), - (byte)(formulaColumn + refNVPtg.getColumn()), + ptg = new RefVPtg( (short)(fixupRelativeRow(formulaRow,refNVPtg.getRow(),refNVPtg.isRowRelative())), + (byte)(fixupRelativeColumn(formulaColumn,refNVPtg.getColumn(),refNVPtg.isColRelative())), refNVPtg.isRowRelative(), refNVPtg.isColRelative()); } else if (ptg instanceof RefNAPtg) { @@ -217,8 +217,8 @@ 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( (short)(fixupRelativeRow(formulaRow,refNAPtg.getRow(),refNAPtg.isRowRelative())), + (byte)(fixupRelativeColumn(formulaColumn,refNAPtg.getColumn(),refNAPtg.isColRelative())), refNAPtg.isRowRelative(), refNAPtg.isColRelative()); } else if (ptg instanceof AreaNPtg) { @@ -223,10 +223,10 @@ 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((short)(fixupRelativeRow(formulaRow,areaNPtg.getFirstRow(),areaNPtg.isFirstRowRelative())), + (short)(fixupRelativeRow(formulaRow,areaNPtg.getLastRow(),areaNPtg.isLastRowRelative())), + (short)(fixupRelativeColumn(formulaColumn,areaNPtg.getFirstColumn(),areaNPtg.isFirstColRelative())), + (short)(fixupRelativeColumn(formulaColumn,areaNPtg.getLastColumn(),areaNPtg.isLastColRelative())), areaNPtg.isFirstRowRelative(), areaNPtg.isLastRowRelative(), areaNPtg.isFirstColRelative(), @@ -233,10 +233,10 @@ 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((short)(fixupRelativeRow(formulaRow,areaNVPtg.getFirstRow(),areaNVPtg.isFirstRowRelative())), + (short)(fixupRelativeRow(formulaRow,areaNVPtg.getLastRow(),areaNVPtg.isLastRowRelative())), + (short)(fixupRelativeColumn(formulaColumn,areaNVPtg.getFirstColumn(),areaNVPtg.isFirstColRelative())), + (short)(fixupRelativeColumn(formulaColumn,areaNVPtg.getLastColumn(),areaNVPtg.isLastColRelative())), areaNVPtg.isFirstRowRelative(), areaNVPtg.isLastRowRelative(), areaNVPtg.isFirstColRelative(), @@ -243,10 +243,10 @@ 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((short)(fixupRelativeRow(formulaRow,areaNAPtg.getFirstRow(),areaNAPtg.isFirstRowRelative())), + (short)(fixupRelativeRow(formulaRow,areaNAPtg.getLastRow(),areaNAPtg.isLastRowRelative())), + (short)(fixupRelativeColumn(formulaColumn,areaNAPtg.getFirstColumn(),areaNAPtg.isFirstColRelative())), + (short)(fixupRelativeColumn(formulaColumn,areaNAPtg.getLastColumn(),areaNAPtg.isLastColRelative())), areaNAPtg.isFirstRowRelative(), areaNAPtg.isLastRowRelative(), areaNAPtg.isFirstColRelative(), @@ -261,6 +261,22 @@ 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) { + if((row&32768)!=0) row=(short)(row-65536); + row+=currentrow; + } + return row; + } /** * Mirroring formula records so it is registered in the ValueRecordsAggregate