From 503a91e7f4e1e3f71755b183d179d5ffd6816fb3 Mon Sep 17 00:00:00 2001 From: wp_xxyyzz Date: Mon, 18 Aug 2014 15:50:41 +0000 Subject: [PATCH] fpspreadsheet: Read shared formulas from OOXML files. git-svn-id: https://svn.code.sf.net/p/lazarus-ccr/svn@3494 8e941d3f-bd1b-0410-a28a-d453659cc2b4 --- components/fpspreadsheet/xlsxooxml.pas | 30 +++++++++++++++++++++++--- 1 file changed, 27 insertions(+), 3 deletions(-) diff --git a/components/fpspreadsheet/xlsxooxml.pas b/components/fpspreadsheet/xlsxooxml.pas index d8a7390b5..11776095b 100755 --- a/components/fpspreadsheet/xlsxooxml.pas +++ b/components/fpspreadsheet/xlsxooxml.pas @@ -615,6 +615,9 @@ var formulaStr: String; sstIndex: Integer; number: Double; + ref: String; + r1,r2, c1,c2: Cardinal; + sharedFormulaBase: PCell; begin if ANode = nil then exit; @@ -624,7 +627,8 @@ begin ParseCellString(s, rowIndex, colIndex); // create cell - if FIsVirtualMode then begin + if FIsVirtualMode then + begin InitCell(rowIndex, colIndex, FVirtualCell); cell := @FVirtualCell; end else @@ -639,18 +643,38 @@ begin datanode := ANode.FirstChild; dataStr := ''; formulaStr := ''; - while Assigned(datanode) do begin + while Assigned(datanode) do + begin if datanode.NodeName = 'v' then dataStr := GetNodeValue(datanode) else if datanode.NodeName = 'f' then + begin + // Formula to cell formulaStr := GetNodeValue(datanode); + if formulaStr <> '' then + begin + s := GetAttrValue(datanode, 't'); + if s = 'shared' then + begin + s := GetAttrValue(datanode, 'ref'); + if (s <>'') then + begin + cell^.FormulaValue.FormulaStr := '=' + formulaStr; + FWorksheet.UseSharedFormula(s, cell); + end; + end + else + cell^.FormulaValue.FormulaStr := '=' + formulaStr; + end; + end; datanode := datanode.NextSibling; end; - // formula to cell +{ // formula to cell if formulaStr <> '' then cell^.FormulaValue.FormulaStr := '=' + formulaStr; + } // get data type s := GetAttrValue(ANode, 't'); // "t" = data type