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
This commit is contained in:
wp_xxyyzz
2014-08-18 15:50:41 +00:00
parent 4bafc57020
commit 503a91e7f4

View File

@ -615,6 +615,9 @@ var
formulaStr: String; formulaStr: String;
sstIndex: Integer; sstIndex: Integer;
number: Double; number: Double;
ref: String;
r1,r2, c1,c2: Cardinal;
sharedFormulaBase: PCell;
begin begin
if ANode = nil then if ANode = nil then
exit; exit;
@ -624,7 +627,8 @@ begin
ParseCellString(s, rowIndex, colIndex); ParseCellString(s, rowIndex, colIndex);
// create cell // create cell
if FIsVirtualMode then begin if FIsVirtualMode then
begin
InitCell(rowIndex, colIndex, FVirtualCell); InitCell(rowIndex, colIndex, FVirtualCell);
cell := @FVirtualCell; cell := @FVirtualCell;
end else end else
@ -639,18 +643,38 @@ begin
datanode := ANode.FirstChild; datanode := ANode.FirstChild;
dataStr := ''; dataStr := '';
formulaStr := ''; formulaStr := '';
while Assigned(datanode) do begin while Assigned(datanode) do
begin
if datanode.NodeName = 'v' then if datanode.NodeName = 'v' then
dataStr := GetNodeValue(datanode) dataStr := GetNodeValue(datanode)
else else
if datanode.NodeName = 'f' then if datanode.NodeName = 'f' then
begin
// Formula to cell
formulaStr := GetNodeValue(datanode); 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; datanode := datanode.NextSibling;
end; end;
// formula to cell { // formula to cell
if formulaStr <> '' then if formulaStr <> '' then
cell^.FormulaValue.FormulaStr := '=' + formulaStr; cell^.FormulaValue.FormulaStr := '=' + formulaStr;
}
// get data type // get data type
s := GetAttrValue(ANode, 't'); // "t" = data type s := GetAttrValue(ANode, 't'); // "t" = data type