diff --git a/components/fpspreadsheet/fpsopendocument.pas b/components/fpspreadsheet/fpsopendocument.pas index 250759347..e36715de1 100755 --- a/components/fpspreadsheet/fpsopendocument.pas +++ b/components/fpspreadsheet/fpsopendocument.pas @@ -16,7 +16,7 @@ Specifications obtained from: http://docs.oasis-open.org/office/v1.1/OS/OpenDocument-v1.1.pdf -AUTHORS: Felipe Monteiro de Carvalho +AUTHORS: Felipe Monteiro de Carvalho / Jose Luis Jurado Rincon } unit fpsopendocument; @@ -28,11 +28,27 @@ interface uses Classes, SysUtils, - fpszipper, {NOTE: fpszipper is the latest zipper.pp Change to standard zipper when FPC 2.4 is released } - fpspreadsheet; + fpszipper, {NOTE: fpszipper is the latest zipper.pp Change to standard zipper when FPC 2.4 is released. Changed by JLJR} + fpspreadsheet, + xmlread, DOM; type + { TsSpreadOpenDocReader } + + TsSpreadOpenDocReader = class(TsCustomSpreadReader) + private + FWorksheet: TsWorksheet; + function GetAttrValue(ANode : TDOMNode; AAttrName : string) : string; + public + { General reading methods } + procedure ReadFromFile(AFileName: string; AData: TsWorkbook); override; + { Record writing methods } + procedure ReadFormula(ARow : Word; ACol : Word; ACellNode: TDOMNode); + procedure ReadLabel(ARow : Word; ACol : Word; ACellNode: TDOMNode); + procedure ReadNumber(ARow : Word; ACol : Word; ACellNode: TDOMNode); + end; + { TsSpreadOpenDocWriter } TsSpreadOpenDocWriter = class(TsCustomSpreadWriter) @@ -100,6 +116,129 @@ const SCHEMAS_XMLNS_XSD = 'http://www.w3.org/2001/XMLSchema'; SCHEMAS_XMLNS_XSI = 'http://www.w3.org/2001/XMLSchema-instance'; +{ TsSpreadOpenDocReader } + +function TsSpreadOpenDocReader.GetAttrValue(ANode : TDOMNode; AAttrName : string) : string; +var + i : integer; + Found : Boolean; +begin + Found:=false; + i:=0; + Result:=''; + while not Found and (i'' then + ReadFormula(Row+RowsCount,Col+ColsCount,CellNode) + else + if ParamValueType='float' then + ReadNumber(Row+RowsCount,Col+ColsCount,CellNode); + end; //for ColsCount + end; //for RowsCount + + Inc(Col,ColsCount+1); + CellNode:=CellNode.NextSibling; + end; //while Assigned(CellNode) + + Inc(Row,RowsCount+1); + RowNode:=RowNode.NextSibling; + end; // while Assigned(RowNode) + + TableNode:=TableNode.NextSibling; + end; //while Assigned(TableNode) + + Doc.Free; +end; + +procedure TsSpreadOpenDocReader.ReadFormula(ARow: Word; ACol : Word; ACellNode : TDOMNode); +begin + +end; + +procedure TsSpreadOpenDocReader.ReadLabel(ARow: Word; ACol : Word; ACellNode : TDOMNode); +begin + FWorkSheet.WriteUTF8Text(ARow,ACol,ACellNode.TextContent); +end; + +procedure TsSpreadOpenDocReader.ReadNumber(ARow: Word; ACol : Word; ACellNode : TDOMNode); +begin + FWorkSheet.WriteNumber(Arow,ACol,StrToFloat(ACellNode.TextContent)); +end; + { TsSpreadOpenDocWriter } procedure TsSpreadOpenDocWriter.WriteGlobalFiles; @@ -416,7 +555,7 @@ end; } initialization - RegisterSpreadFormat(TsCustomSpreadReader, TsSpreadOpenDocWriter, sfOpenDocument); + RegisterSpreadFormat(TsSpreadOpenDocReader, TsSpreadOpenDocWriter, sfOpenDocument); end.