You've already forked lazarus-ccr
fpspreadsheet: Refactor xlsx reader for comments and defined names
git-svn-id: https://svn.code.sf.net/p/lazarus-ccr/svn@8340 8e941d3f-bd1b-0410-a28a-d453659cc2b4
This commit is contained in:
@@ -97,6 +97,7 @@ type
|
|||||||
function ReadColor(ANode: TDOMNode): TsColor;
|
function ReadColor(ANode: TDOMNode): TsColor;
|
||||||
procedure ReadCols(ANode: TDOMNode; AWorksheet: TsBasicWorksheet);
|
procedure ReadCols(ANode: TDOMNode; AWorksheet: TsBasicWorksheet);
|
||||||
procedure ReadComments(ANode: TDOMNode; AWorksheet: TsBasicWorksheet);
|
procedure ReadComments(ANode: TDOMNode; AWorksheet: TsBasicWorksheet);
|
||||||
|
procedure ReadComments(AStream: TStream; AWorksheet: TsBasicWorksheet);
|
||||||
procedure ReadConditionalFormatting(ANode: TDOMNode; AWorksheet: TsBasicWorksheet);
|
procedure ReadConditionalFormatting(ANode: TDOMNode; AWorksheet: TsBasicWorksheet);
|
||||||
procedure ReadDateMode(ANode: TDOMNode);
|
procedure ReadDateMode(ANode: TDOMNode);
|
||||||
procedure ReadDefinedNames(ANode: TDOMNode);
|
procedure ReadDefinedNames(ANode: TDOMNode);
|
||||||
@@ -2190,6 +2191,43 @@ begin
|
|||||||
end;
|
end;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
{ The comments are stored in separate "comments<n>.xml" files (n = 1, 2, ...)
|
||||||
|
for each worksheet.
|
||||||
|
The relationship which comment belongs to which sheet file is contained
|
||||||
|
in the "sheet<n>.xml.rels" file (n = 1, 2, ...) which already has been
|
||||||
|
read and stored in the sheetData.
|
||||||
|
The rels file contains also the second part of the hyperlink data. }
|
||||||
|
procedure TsSpreadOOXMLReader.ReadComments(AStream: TStream; AWorksheet: TsBasicWorksheet);
|
||||||
|
var
|
||||||
|
sheetData: TSheetData;
|
||||||
|
sheetIndex: Integer;
|
||||||
|
XMLStream: TStream;
|
||||||
|
fn: String;
|
||||||
|
Doc: TXMLDocument = nil;
|
||||||
|
begin
|
||||||
|
sheetIndex := TsWorksheet(AWorksheet).Index;
|
||||||
|
sheetData := TSheetData(FSheetlist[sheetIndex]);
|
||||||
|
if sheetData.Comments_File <> '' then
|
||||||
|
begin
|
||||||
|
// Extract texts from the comments file found and apply to worksheet.
|
||||||
|
fn := MakeXLPath(sheetData.Comments_File);
|
||||||
|
XMLStream := CreateXMLStream;
|
||||||
|
try
|
||||||
|
if UnzipToStream(AStream, fn, XMLStream) then
|
||||||
|
begin
|
||||||
|
try
|
||||||
|
ReadXMLStream(Doc, XMLStream);
|
||||||
|
ReadComments(Doc.DocumentElement.FindNode('commentList'), AWorksheet);
|
||||||
|
finally
|
||||||
|
FreeAndNil(Doc);
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
finally
|
||||||
|
XMLStream.Free;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
procedure TsSpreadOOXMLReader.ReadConditionalFormatting(ANode: TDOMNode;
|
procedure TsSpreadOOXMLReader.ReadConditionalFormatting(ANode: TDOMNode;
|
||||||
AWorksheet: TsBasicWorksheet);
|
AWorksheet: TsBasicWorksheet);
|
||||||
var
|
var
|
||||||
@@ -4386,7 +4424,7 @@ begin
|
|||||||
ReadWorkbookProtection(Doc_FindNode('workbookProtection'));
|
ReadWorkbookProtection(Doc_FindNode('workbookProtection'));
|
||||||
ReadSheetList(Doc_FindNode('sheets')); // This creates the worksheets!
|
ReadSheetList(Doc_FindNode('sheets')); // This creates the worksheets!
|
||||||
ReadSheetRels(AStream);
|
ReadSheetRels(AStream);
|
||||||
//ReadDefinedNames(Doc.DocumentElement.FindNode('definedNames')); -- don't read here because sheets do not yet exist
|
ReadDefinedNames(Doc.DocumentElement.FindNode('definedNames'));
|
||||||
ReadActiveSheet(Doc_FindNode('bookViews'), actSheetIndex);
|
ReadActiveSheet(Doc_FindNode('bookViews'), actSheetIndex);
|
||||||
FreeAndNil(Doc);
|
FreeAndNil(Doc);
|
||||||
finally
|
finally
|
||||||
@@ -4473,48 +4511,13 @@ begin
|
|||||||
|
|
||||||
FreeAndNil(Doc);
|
FreeAndNil(Doc);
|
||||||
|
|
||||||
{ Comments:
|
ReadComments(AStream, FWorksheet);
|
||||||
The comments are stored in separate "comments<n>.xml" files (n = 1, 2, ...)
|
|
||||||
for each worksheet.
|
|
||||||
The relationship which comment belongs to which sheet file is contained
|
|
||||||
in the "sheet<n>.xml.rels" file (n = 1, 2, ...) which already has been
|
|
||||||
read and stored in the sheetData.
|
|
||||||
The rels file contains also the second part of the hyperlink data. }
|
|
||||||
if sheetData.Comments_File <> '' then
|
|
||||||
begin
|
|
||||||
// Extract texts from the comments file found and apply to worksheet.
|
|
||||||
fn := MakeXLPath(sheetData.Comments_File);
|
|
||||||
XMLStream := CreateXMLStream;
|
|
||||||
try
|
|
||||||
if UnzipToStream(AStream, fn, XMLStream) then
|
|
||||||
begin
|
|
||||||
ReadXMLStream(Doc, XMLStream);
|
|
||||||
ReadComments(Doc_FindNode('commentList'), FWorksheet);
|
|
||||||
FreeAndNil(Doc);
|
|
||||||
end;
|
|
||||||
finally
|
|
||||||
XMLStream.Free;
|
|
||||||
end;
|
|
||||||
end;
|
|
||||||
|
|
||||||
// Active worksheet
|
// Active worksheet
|
||||||
if i = actSheetIndex then
|
if i = actSheetIndex then
|
||||||
(FWorkbook as TsWorkbook).SelectWorksheet(FWorksheet as TsWorksheet);
|
(FWorkbook as TsWorkbook).SelectWorksheet(FWorksheet as TsWorksheet);
|
||||||
end; // for
|
end; // for
|
||||||
|
|
||||||
// 2nd run for the workbook.xml file
|
|
||||||
// Read defined names
|
|
||||||
XMLStream := CreateXMLStream;
|
|
||||||
try
|
|
||||||
if not UnzipToStream(AStream, OOXML_PATH_XL_WORKBOOK, XMLStream) then
|
|
||||||
raise EFPSpreadsheetReader.CreateFmt(rsDefectiveInternalFileStructure, ['xlsx']);
|
|
||||||
ReadXMLStream(Doc, XMLStream);
|
|
||||||
ReadDefinedNames(Doc_FindNode('definedNames'));
|
|
||||||
FreeAndNil(Doc);
|
|
||||||
finally
|
|
||||||
XMLStream.Free;
|
|
||||||
end;
|
|
||||||
|
|
||||||
// Read embedded images
|
// Read embedded images
|
||||||
ReadEmbeddedObjs(AStream);
|
ReadEmbeddedObjs(AStream);
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user