You've already forked lazarus-ccr
fpspreadsheet: Fix ods comment reader crashing for ods files written by OpenOffice from xlsx files.
git-svn-id: https://svn.code.sf.net/p/lazarus-ccr/svn@3923 8e941d3f-bd1b-0410-a28a-d453659cc2b4
This commit is contained in:
@ -108,13 +108,13 @@ type
|
|||||||
procedure ReadSettings(AOfficeSettingsNode: TDOMNode);
|
procedure ReadSettings(AOfficeSettingsNode: TDOMNode);
|
||||||
procedure ReadStyles(AStylesNode: TDOMNode);
|
procedure ReadStyles(AStylesNode: TDOMNode);
|
||||||
{ Record writing methods }
|
{ Record writing methods }
|
||||||
procedure ReadBlank(ARow, ACol: Word; ACellNode: TDOMNode); reintroduce;
|
procedure ReadBlank(ARow, ACol: Cardinal; ACellNode: TDOMNode); reintroduce;
|
||||||
procedure ReadBoolean(ARow, ACol: Word; ACellNode: TDOMNode);
|
procedure ReadBoolean(ARow, ACol: Cardinal; ACellNode: TDOMNode);
|
||||||
procedure ReadComment(ARow, ACol: Word; ACellNode: TDOMNode);
|
procedure ReadComment(ARow, ACol: Cardinal; ACellNode: TDOMNode);
|
||||||
procedure ReadDateTime(ARow, ACol: Word; ACellNode: TDOMNode);
|
procedure ReadDateTime(ARow, ACol: Cardinal; ACellNode: TDOMNode);
|
||||||
procedure ReadFormula(ARow, ACol: Word; ACellNode: TDOMNode); reintroduce;
|
procedure ReadFormula(ARow, ACol: Cardinal; ACellNode: TDOMNode); reintroduce;
|
||||||
procedure ReadLabel(ARow, ACol: Word; ACellNode: TDOMNode); reintroduce;
|
procedure ReadLabel(ARow, ACol: Cardinal; ACellNode: TDOMNode); reintroduce;
|
||||||
procedure ReadNumber(ARow, ACol: Word; ACellNode: TDOMNode); reintroduce;
|
procedure ReadNumber(ARow, ACol: Cardinal; ACellNode: TDOMNode); reintroduce;
|
||||||
|
|
||||||
public
|
public
|
||||||
{ General reading methods }
|
{ General reading methods }
|
||||||
@ -921,7 +921,8 @@ begin
|
|||||||
Result := -1;
|
Result := -1;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
procedure TsSpreadOpenDocReader.ReadBlank(ARow, ACol: Word; ACellNode: TDOMNode);
|
procedure TsSpreadOpenDocReader.ReadBlank(ARow, ACol: Cardinal;
|
||||||
|
ACellNode: TDOMNode);
|
||||||
var
|
var
|
||||||
styleName: String;
|
styleName: String;
|
||||||
cell: PCell;
|
cell: PCell;
|
||||||
@ -950,7 +951,8 @@ begin
|
|||||||
Workbook.OnReadCellData(Workbook, ARow, ACol, cell);
|
Workbook.OnReadCellData(Workbook, ARow, ACol, cell);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
procedure TsSpreadOpenDocReader.ReadBoolean(ARow, ACol: Word; ACellNode: TDOMNode);
|
procedure TsSpreadOpenDocReader.ReadBoolean(ARow, ACol: Cardinal;
|
||||||
|
ACellNode: TDOMNode);
|
||||||
var
|
var
|
||||||
styleName: String;
|
styleName: String;
|
||||||
cell: PCell;
|
cell: PCell;
|
||||||
@ -1067,11 +1069,11 @@ begin
|
|||||||
FColumnStyleList.Add(colStyle);
|
FColumnStyleList.Add(colStyle);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
procedure TsSpreadOpenDocReader.ReadComment(ARow, ACol: Word;
|
procedure TsSpreadOpenDocReader.ReadComment(ARow, ACol: Cardinal;
|
||||||
ACellNode: TDOMNode);
|
ACellNode: TDOMNode);
|
||||||
var
|
var
|
||||||
cellChildNode, pNode, spanNode: TDOMNode;
|
cellChildNode, pNode, pChildNode: TDOMNode;
|
||||||
comment: String;
|
comment, line: String;
|
||||||
nodeName: String;
|
nodeName: String;
|
||||||
s: String;
|
s: String;
|
||||||
found: Boolean;
|
found: Boolean;
|
||||||
@ -1091,20 +1093,26 @@ begin
|
|||||||
nodeName := pNode.NodeName;
|
nodeName := pNode.NodeName;
|
||||||
if nodeName = 'text:p' then
|
if nodeName = 'text:p' then
|
||||||
begin
|
begin
|
||||||
s := GetNodeValue(pNode);
|
line := '';
|
||||||
if comment = '' then comment := s else comment := comment + LineEnding + s;
|
pChildNode := pNode.FirstChild;
|
||||||
|
while pChildNode <> nil do
|
||||||
|
begin
|
||||||
|
nodeName := pChildNode.NodeName;
|
||||||
|
if nodeName = '#text' then
|
||||||
|
begin
|
||||||
|
s := pChildNode.NodeValue;
|
||||||
|
line := IfThen(line = '', s, line + s);
|
||||||
found := true;
|
found := true;
|
||||||
spanNode := pNode.FirstChild;
|
end else
|
||||||
while spanNode <> nil do begin
|
|
||||||
nodeName := spanNode.NodeName;
|
|
||||||
if nodeName = 'text:span' then
|
if nodeName = 'text:span' then
|
||||||
begin
|
begin
|
||||||
s := GetNodeValue(spanNode);
|
s := GetNodeValue(pChildNode);
|
||||||
if comment = '' then comment := s else comment := comment + ' ' + s;
|
line := IfThen(line = '', s, line + s);
|
||||||
found := true;
|
found := true;
|
||||||
end;
|
end;
|
||||||
spanNode := spanNode.NextSibling;
|
pChildNode := pChildNode.NextSibling;
|
||||||
end;
|
end;
|
||||||
|
comment := IfThen(comment = '', line, comment + LineEnding + line);
|
||||||
end;
|
end;
|
||||||
pNode := pNode.NextSibling;
|
pNode := pNode.NextSibling;
|
||||||
end;
|
end;
|
||||||
@ -1115,7 +1123,7 @@ begin
|
|||||||
FWorksheet.WriteComment(ARow, ACol, comment);
|
FWorksheet.WriteComment(ARow, ACol, comment);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
procedure TsSpreadOpenDocReader.ReadDateTime(ARow, ACol: Word;
|
procedure TsSpreadOpenDocReader.ReadDateTime(ARow, ACol: Cardinal;
|
||||||
ACellNode : TDOMNode);
|
ACellNode : TDOMNode);
|
||||||
var
|
var
|
||||||
dt: TDateTime;
|
dt: TDateTime;
|
||||||
@ -1224,7 +1232,8 @@ begin
|
|||||||
end;
|
end;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
procedure TsSpreadOpenDocReader.ReadFormula(ARow: Word; ACol : Word; ACellNode : TDOMNode);
|
procedure TsSpreadOpenDocReader.ReadFormula(ARow, ACol: Cardinal;
|
||||||
|
ACellNode : TDOMNode);
|
||||||
var
|
var
|
||||||
cell: PCell;
|
cell: PCell;
|
||||||
formula: String;
|
formula: String;
|
||||||
@ -1437,7 +1446,8 @@ begin
|
|||||||
'Method not implemented. Use "ReadFromFile" instead.');
|
'Method not implemented. Use "ReadFromFile" instead.');
|
||||||
end;
|
end;
|
||||||
|
|
||||||
procedure TsSpreadOpenDocReader.ReadLabel(ARow: Word; ACol: Word; ACellNode: TDOMNode);
|
procedure TsSpreadOpenDocReader.ReadLabel(ARow, ACol: Cardinal;
|
||||||
|
ACellNode: TDOMNode);
|
||||||
var
|
var
|
||||||
cellText: String;
|
cellText: String;
|
||||||
styleName: String;
|
styleName: String;
|
||||||
@ -1498,7 +1508,8 @@ begin
|
|||||||
Workbook.OnReadCellData(Workbook, ARow, ACol, cell);
|
Workbook.OnReadCellData(Workbook, ARow, ACol, cell);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
procedure TsSpreadOpenDocReader.ReadNumber(ARow: Word; ACol : Word; ACellNode : TDOMNode);
|
procedure TsSpreadOpenDocReader.ReadNumber(ARow, ACol: Cardinal;
|
||||||
|
ACellNode : TDOMNode);
|
||||||
var
|
var
|
||||||
Value, Str: String;
|
Value, Str: String;
|
||||||
lNumber: Double;
|
lNumber: Double;
|
||||||
|
@ -2420,34 +2420,11 @@ begin
|
|||||||
end;
|
end;
|
||||||
|
|
||||||
procedure TsSpreadOOXMLWriter.WriteGlobalFiles;
|
procedure TsSpreadOOXMLWriter.WriteGlobalFiles;
|
||||||
var
|
|
||||||
i: Integer;
|
|
||||||
begin
|
begin
|
||||||
(*
|
|
||||||
{ --- Content Types --- }
|
{ --- Content Types --- }
|
||||||
AppendToStream(FSContentTypes,
|
// Will be written at the end of WriteToStream when all Sheet.rels files are
|
||||||
XML_HEADER);
|
// known
|
||||||
AppendToStream(FSContentTypes,
|
|
||||||
'<Types xmlns="' + SCHEMAS_TYPES + '">');
|
|
||||||
AppendToStream(FSContentTypes,
|
|
||||||
'<Override PartName="/_rels/.rels" ContentType="' + MIME_RELS + '" />');
|
|
||||||
AppendToStream(FSContentTypes,
|
|
||||||
'<Override PartName="/xl/_rels/workbook.xml.rels" ContentType="application/vnd.openxmlformats-package.relationships+xml" />');
|
|
||||||
AppendToStream(FSContentTypes,
|
|
||||||
'<Override PartName="/xl/workbook.xml" ContentType="' + MIME_SHEET + '" />');
|
|
||||||
|
|
||||||
for i:=1 to Workbook.GetWorksheetCount do
|
|
||||||
AppendToStream(FSContentTypes, Format(
|
|
||||||
'<Override PartName="/xl/worksheets/sheet%d.xml" ContentType="%s" />',
|
|
||||||
[i, MIME_WORKSHEET]));
|
|
||||||
|
|
||||||
AppendToStream(FSContentTypes,
|
|
||||||
'<Override PartName="/xl/styles.xml" ContentType="' + MIME_STYLES + '" />');
|
|
||||||
AppendToStream(FSContentTypes,
|
|
||||||
'<Override PartName="/xl/sharedStrings.xml" ContentType="' + MIME_STRINGS + '" />');
|
|
||||||
AppendToStream(FSContentTypes,
|
|
||||||
'</Types>');
|
|
||||||
*)
|
|
||||||
{ --- RelsRels --- }
|
{ --- RelsRels --- }
|
||||||
AppendToStream(FSRelsRels,
|
AppendToStream(FSRelsRels,
|
||||||
XML_HEADER);
|
XML_HEADER);
|
||||||
@ -2801,7 +2778,6 @@ procedure TsSpreadOOXMLWriter.WriteToStream(AStream: TStream);
|
|||||||
var
|
var
|
||||||
FZip: TZipper;
|
FZip: TZipper;
|
||||||
i: Integer;
|
i: Integer;
|
||||||
stream: TStream;
|
|
||||||
begin
|
begin
|
||||||
{ Analyze the workbook and collect all information needed }
|
{ Analyze the workbook and collect all information needed }
|
||||||
ListAllNumFormats;
|
ListAllNumFormats;
|
||||||
|
Reference in New Issue
Block a user