From 9f7237554da908d719ff975467092d232a135fba Mon Sep 17 00:00:00 2001 From: wp_xxyyzz Date: Fri, 25 Jul 2014 21:05:35 +0000 Subject: [PATCH] fpspreadsheet: Extend ooxml reader to read formulas and their result. git-svn-id: https://svn.code.sf.net/p/lazarus-ccr/svn@3380 8e941d3f-bd1b-0410-a28a-d453659cc2b4 --- components/fpspreadsheet/fpspreadsheet.pas | 1 + components/fpspreadsheet/xlsxooxml.pas | 37 ++++++++++++++++++++-- 2 files changed, 35 insertions(+), 3 deletions(-) diff --git a/components/fpspreadsheet/fpspreadsheet.pas b/components/fpspreadsheet/fpspreadsheet.pas index 8f06d518a..cdd63f3f8 100755 --- a/components/fpspreadsheet/fpspreadsheet.pas +++ b/components/fpspreadsheet/fpspreadsheet.pas @@ -575,6 +575,7 @@ type procedure WriteErrorValue(ARow, ACol: Cardinal; AValue: TsErrorValue); overload; procedure WriteErrorValue(ACell: PCell; AValue: TsErrorValue); overload; + procedure WriteFormula(ARow, ACol: Cardinal; AFormula: TsFormula); procedure WriteNumber(ARow, ACol: Cardinal; ANumber: double); overload; diff --git a/components/fpspreadsheet/xlsxooxml.pas b/components/fpspreadsheet/xlsxooxml.pas index 0bd75f86f..9527cf006 100755 --- a/components/fpspreadsheet/xlsxooxml.pas +++ b/components/fpspreadsheet/xlsxooxml.pas @@ -419,6 +419,10 @@ begin datanode := datanode.NextSibling; end; + // formula to cell + if formulaStr <> '' then + cell^.FormulaValue.FormulaStr := '=' + formulaStr; + // get data type s := GetAttrValue(cellnode, 't'); // data type if s = 'n' then @@ -427,10 +431,37 @@ begin if s = 's' then begin sstIndex := StrToInt(dataStr); ASheet.WriteUTF8Text(cell, FSharedStrings[sstIndex]); - end + end else + if s = 'str' then + ASheet.WriteUTF8Text(cell, datastr) else - if s = '' then - ASheet.WriteBlank(cell); + if s = 'b' then + ASheet.WriteBoolValue(cell, dataStr='1') + else + if s = 'e' then begin + if dataStr = '#NULL!' then + ASheet.WriteErrorValue(cell, errEmptyIntersection) + else if dataStr = '#DIV/0!' then + ASheet.WriteErrorValue(cell, errDivideByZero) + else if dataStr = '#VALUE!' then + ASheet.WriteErrorValue(cell, errWrongType) + else if dataStr = '#REF!' then + ASheet.WriteErrorValue(cell, errIllegalRef) + else if dataStr = '#NAME?' then + ASheet.WriteErrorValue(cell, errWrongName) + else if dataStr = '#NUM!' then + ASheet.WriteErrorValue(cell, errOverflow) + else if dataStr = '#N/A' then + ASheet.WriteErrorValue(cell, errArgError) + else + raise Exception.Create('unknown error type'); + end else + if s = '' then begin + if formulaStr = '' then + ASheet.WriteBlank(cell) + else + ASheet.WriteNumber(cell, STrToFloat(dataStr, FPointSeparatorSettings)); + end; end; cellnode := cellnode.NextSibling;