diff --git a/components/fpspreadsheet/examples/other/demo_write_formula.pas b/components/fpspreadsheet/examples/other/demo_write_formula.pas index 646e1dd15..65b7dc3cf 100644 --- a/components/fpspreadsheet/examples/other/demo_write_formula.pas +++ b/components/fpspreadsheet/examples/other/demo_write_formula.pas @@ -23,6 +23,7 @@ procedure WriteFirstWorksheet(); var MyFormula: TsFormula; MyRPNFormula: TsRPNFormula; + MyCell: PCell; begin MyWorksheet := MyWorkbook.AddWorksheet('Worksheet1'); @@ -61,6 +62,15 @@ begin RPNNumber(4.0, RPNNumber(5.0, RPNFunc(fekAdd, nil))))); + + // Write a shared formula "=E1+100" to the cell range F1:F5 + // Please note that shared formulas are not written by sfOOXML and sfOpenDocument formats. + MyCell := MyWorksheet.WriteRPNFormula(0, 5, CreateRPNFormula( + RPNCellOffset(0, -1, [rfRelRow, rfRelCol], + RPNNumber(100, + RPNFunc(fekAdd, nil))))); + MyWorksheet.UseSharedFormula('F1:F5', MyCell); + end; procedure WriteSecondWorksheet(); diff --git a/components/fpspreadsheet/xlsbiff2.pas b/components/fpspreadsheet/xlsbiff2.pas index ede57fdf9..bbd1b2150 100755 --- a/components/fpspreadsheet/xlsbiff2.pas +++ b/components/fpspreadsheet/xlsbiff2.pas @@ -1007,9 +1007,9 @@ begin begin AElement.ElementKind := fekCell; if (rfRelRow in AElement.RelFlags) then - AElement.Row := Integer(ACell^.Row) + Integer(AElement.Row); // AElement.Row means here: "RowOffsset" + AElement.Row := ACell^.Row + Integer(AElement.Row); // AElement.Row means here: "RowOffsset" if (rfRelCol in AElement.RelFlags) then - AElement.Col := Integer(ACell^.Col) + Integer(AElement.Col); // AElement.Col means here: "ColOffsset" + AElement.Col := ACell^.Col + Integer(AElement.Col); // AElement.Col means here: "ColOffsset" end; end; diff --git a/components/fpspreadsheet/xlscommon.pas b/components/fpspreadsheet/xlscommon.pas index fd1b41cc2..e45d8b84b 100644 --- a/components/fpspreadsheet/xlscommon.pas +++ b/components/fpspreadsheet/xlscommon.pas @@ -2397,7 +2397,8 @@ begin if (rfRelCol in AFlags) then r := r + MASK_EXCEL_RELATIVE_COL; AStream.WriteWord(WordToLE(r)); // Column address - c := Lo(AColOffset); + c := Lo(word(AColOffset)); + //c := Lo(AColOffset); AStream.WriteByte(c); // Number of bytes written Result := 3; @@ -2910,7 +2911,7 @@ begin while r <= FWorksheet.GetLastRowIndex do begin cell := FWorksheet.FindCell(r, c); - if (cell <> nil) and (cell^.SharedFormulaBase <> ACell^.SharedFormulaBase) then + if (cell <> nil) and (cell^.SharedFormulaBase = ACell^.SharedFormulaBase) then r2 := r else break;