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 ReadStyles(AStylesNode: TDOMNode);
|
||||
{ Record writing methods }
|
||||
procedure ReadBlank(ARow, ACol: Word; ACellNode: TDOMNode); reintroduce;
|
||||
procedure ReadBoolean(ARow, ACol: Word; ACellNode: TDOMNode);
|
||||
procedure ReadComment(ARow, ACol: Word; ACellNode: TDOMNode);
|
||||
procedure ReadDateTime(ARow, ACol: Word; ACellNode: TDOMNode);
|
||||
procedure ReadFormula(ARow, ACol: Word; ACellNode: TDOMNode); reintroduce;
|
||||
procedure ReadLabel(ARow, ACol: Word; ACellNode: TDOMNode); reintroduce;
|
||||
procedure ReadNumber(ARow, ACol: Word; ACellNode: TDOMNode); reintroduce;
|
||||
procedure ReadBlank(ARow, ACol: Cardinal; ACellNode: TDOMNode); reintroduce;
|
||||
procedure ReadBoolean(ARow, ACol: Cardinal; ACellNode: TDOMNode);
|
||||
procedure ReadComment(ARow, ACol: Cardinal; ACellNode: TDOMNode);
|
||||
procedure ReadDateTime(ARow, ACol: Cardinal; ACellNode: TDOMNode);
|
||||
procedure ReadFormula(ARow, ACol: Cardinal; ACellNode: TDOMNode); reintroduce;
|
||||
procedure ReadLabel(ARow, ACol: Cardinal; ACellNode: TDOMNode); reintroduce;
|
||||
procedure ReadNumber(ARow, ACol: Cardinal; ACellNode: TDOMNode); reintroduce;
|
||||
|
||||
public
|
||||
{ General reading methods }
|
||||
@ -921,7 +921,8 @@ begin
|
||||
Result := -1;
|
||||
end;
|
||||
|
||||
procedure TsSpreadOpenDocReader.ReadBlank(ARow, ACol: Word; ACellNode: TDOMNode);
|
||||
procedure TsSpreadOpenDocReader.ReadBlank(ARow, ACol: Cardinal;
|
||||
ACellNode: TDOMNode);
|
||||
var
|
||||
styleName: String;
|
||||
cell: PCell;
|
||||
@ -950,7 +951,8 @@ begin
|
||||
Workbook.OnReadCellData(Workbook, ARow, ACol, cell);
|
||||
end;
|
||||
|
||||
procedure TsSpreadOpenDocReader.ReadBoolean(ARow, ACol: Word; ACellNode: TDOMNode);
|
||||
procedure TsSpreadOpenDocReader.ReadBoolean(ARow, ACol: Cardinal;
|
||||
ACellNode: TDOMNode);
|
||||
var
|
||||
styleName: String;
|
||||
cell: PCell;
|
||||
@ -1067,11 +1069,11 @@ begin
|
||||
FColumnStyleList.Add(colStyle);
|
||||
end;
|
||||
|
||||
procedure TsSpreadOpenDocReader.ReadComment(ARow, ACol: Word;
|
||||
procedure TsSpreadOpenDocReader.ReadComment(ARow, ACol: Cardinal;
|
||||
ACellNode: TDOMNode);
|
||||
var
|
||||
cellChildNode, pNode, spanNode: TDOMNode;
|
||||
comment: String;
|
||||
cellChildNode, pNode, pChildNode: TDOMNode;
|
||||
comment, line: String;
|
||||
nodeName: String;
|
||||
s: String;
|
||||
found: Boolean;
|
||||
@ -1091,20 +1093,26 @@ begin
|
||||
nodeName := pNode.NodeName;
|
||||
if nodeName = 'text:p' then
|
||||
begin
|
||||
s := GetNodeValue(pNode);
|
||||
if comment = '' then comment := s else comment := comment + LineEnding + s;
|
||||
found := true;
|
||||
spanNode := pNode.FirstChild;
|
||||
while spanNode <> nil do begin
|
||||
nodeName := spanNode.NodeName;
|
||||
line := '';
|
||||
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;
|
||||
end else
|
||||
if nodeName = 'text:span' then
|
||||
begin
|
||||
s := GetNodeValue(spanNode);
|
||||
if comment = '' then comment := s else comment := comment + ' ' + s;
|
||||
s := GetNodeValue(pChildNode);
|
||||
line := IfThen(line = '', s, line + s);
|
||||
found := true;
|
||||
end;
|
||||
spanNode := spanNode.NextSibling;
|
||||
pChildNode := pChildNode.NextSibling;
|
||||
end;
|
||||
comment := IfThen(comment = '', line, comment + LineEnding + line);
|
||||
end;
|
||||
pNode := pNode.NextSibling;
|
||||
end;
|
||||
@ -1115,7 +1123,7 @@ begin
|
||||
FWorksheet.WriteComment(ARow, ACol, comment);
|
||||
end;
|
||||
|
||||
procedure TsSpreadOpenDocReader.ReadDateTime(ARow, ACol: Word;
|
||||
procedure TsSpreadOpenDocReader.ReadDateTime(ARow, ACol: Cardinal;
|
||||
ACellNode : TDOMNode);
|
||||
var
|
||||
dt: TDateTime;
|
||||
@ -1224,7 +1232,8 @@ begin
|
||||
end;
|
||||
end;
|
||||
|
||||
procedure TsSpreadOpenDocReader.ReadFormula(ARow: Word; ACol : Word; ACellNode : TDOMNode);
|
||||
procedure TsSpreadOpenDocReader.ReadFormula(ARow, ACol: Cardinal;
|
||||
ACellNode : TDOMNode);
|
||||
var
|
||||
cell: PCell;
|
||||
formula: String;
|
||||
@ -1437,7 +1446,8 @@ begin
|
||||
'Method not implemented. Use "ReadFromFile" instead.');
|
||||
end;
|
||||
|
||||
procedure TsSpreadOpenDocReader.ReadLabel(ARow: Word; ACol: Word; ACellNode: TDOMNode);
|
||||
procedure TsSpreadOpenDocReader.ReadLabel(ARow, ACol: Cardinal;
|
||||
ACellNode: TDOMNode);
|
||||
var
|
||||
cellText: String;
|
||||
styleName: String;
|
||||
@ -1498,7 +1508,8 @@ begin
|
||||
Workbook.OnReadCellData(Workbook, ARow, ACol, cell);
|
||||
end;
|
||||
|
||||
procedure TsSpreadOpenDocReader.ReadNumber(ARow: Word; ACol : Word; ACellNode : TDOMNode);
|
||||
procedure TsSpreadOpenDocReader.ReadNumber(ARow, ACol: Cardinal;
|
||||
ACellNode : TDOMNode);
|
||||
var
|
||||
Value, Str: String;
|
||||
lNumber: Double;
|
||||
|
@ -2420,34 +2420,11 @@ begin
|
||||
end;
|
||||
|
||||
procedure TsSpreadOOXMLWriter.WriteGlobalFiles;
|
||||
var
|
||||
i: Integer;
|
||||
begin
|
||||
(*
|
||||
{ --- Content Types --- }
|
||||
AppendToStream(FSContentTypes,
|
||||
XML_HEADER);
|
||||
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 + '" />');
|
||||
// Will be written at the end of WriteToStream when all Sheet.rels files are
|
||||
// known
|
||||
|
||||
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 --- }
|
||||
AppendToStream(FSRelsRels,
|
||||
XML_HEADER);
|
||||
@ -2801,7 +2778,6 @@ procedure TsSpreadOOXMLWriter.WriteToStream(AStream: TStream);
|
||||
var
|
||||
FZip: TZipper;
|
||||
i: Integer;
|
||||
stream: TStream;
|
||||
begin
|
||||
{ Analyze the workbook and collect all information needed }
|
||||
ListAllNumFormats;
|
||||
|
Reference in New Issue
Block a user