diff --git a/components/fpspreadsheet/examples/other/metadata/demo_metadata.lpr b/components/fpspreadsheet/examples/other/metadata/demo_metadata.lpr index 61148cf8b..4172f0a1e 100644 --- a/components/fpspreadsheet/examples/other/metadata/demo_metadata.lpr +++ b/components/fpspreadsheet/examples/other/metadata/demo_metadata.lpr @@ -84,7 +84,10 @@ begin book := TsWorkbook.Create; try + // Select one of these book.ReadFromFile('test.ods'); +// book.ReadFromFile('test.xlsx'); +// book.ReadFromFile('test.xml'); WriteLn('Created by : ', book.MetaData.CreatedBy); WriteLn('Date created : ', DateTimeToStr(book.MetaData.DateCreated)); WriteLn('Modified by : ', book.MetaData.LastModifiedBy); diff --git a/components/fpspreadsheet/source/common/xlsxml.pas b/components/fpspreadsheet/source/common/xlsxml.pas index 966bf3b1f..280134286 100644 --- a/components/fpspreadsheet/source/common/xlsxml.pas +++ b/components/fpspreadsheet/source/common/xlsxml.pas @@ -45,6 +45,7 @@ type procedure ReadCellProtection(ANode: TDOMNode; var AFormat: TsCellFormat); procedure ReadComment(ANode: TDOMNode; AWorksheet: TsBasicWorksheet; ACell: PCell); procedure ReadConditionalFormatting(ANode: TDOMNode; AWorksheet: TsBasicWorksheet); + procedure ReadDocumentProperties(ANode: TDOMNode); procedure ReadExcelWorkbook(ANode: TDOMNode); procedure ReadFont(ANode: TDOMNode; var AFormat: TsCellFormat); procedure ReadInterior(ANode: TDOMNode; var AFormat: TsCellFormat); @@ -1082,6 +1083,42 @@ begin sheet.WriteConditionalCellFormat(range, TsCFCondition(condition), op1, op2, fmtIndex); end; +{@@ ---------------------------------------------------------------------------- + Reads the meta data etc. +-------------------------------------------------------------------------------} +procedure TsSpreadExcelXMLReader.ReadDocumentProperties(ANode: TDOMNode); +var + book: TsWorkbook; + nodeName: String; + s: String; +begin + if ANode = nil then + exit; + + book := TsWorkbook(FWorkbook); + ANode := ANode.FirstChild; + while ANode <> nil do + begin + nodeName := ANode.NodeName; + s := GetNodeValue(ANode); + case nodeName of + 'Title': + book.MetaData.Title := s; + 'Author': + book.MetaData.CreatedBy := s; + 'LastAuthor': + book.MetaData.LastModifiedBy := s; + 'Created': + if s <> '' then + book.MetaData.DateCreated := ISO8601StrToDateTime(s); + 'LastSaved': + if s <> '' then + book.MetaData.DateLastModified := ISO8601StrToDateTime(s); + end; + ANode := ANode.NextSibling; + end; +end; + {@@ ---------------------------------------------------------------------------- Reads the "ExcelWorkbook" node -------------------------------------------------------------------------------} @@ -2011,6 +2048,9 @@ begin try ReadXMLStream(doc, AStream); + // Read meta data + ReadDocumentProperties(doc.DocumentElement.FindNode('DocumentProperties')); + // Read style list ReadStyles(doc.DocumentElement.FindNode('Styles'));