fpspreadsheet: Fix xlsx reader choking on files in which row and cell coordinates are not specified in the xml nodes (https://forum.lazarus.freepascal.org/index.php/topic,48292.msg347711.html)

git-svn-id: https://svn.code.sf.net/p/lazarus-ccr/svn@7321 8e941d3f-bd1b-0410-a28a-d453659cc2b4
This commit is contained in:
wp_xxyyzz
2020-01-28 00:13:13 +00:00
parent fb36e8c25d
commit 07ea73781b

View File

@@ -67,7 +67,8 @@ type
function FindCommentsFileName(ANode: TDOMNode): String; function FindCommentsFileName(ANode: TDOMNode): String;
procedure ReadActiveSheet(ANode: TDOMNode; out ActiveSheetIndex: Integer); procedure ReadActiveSheet(ANode: TDOMNode; out ActiveSheetIndex: Integer);
procedure ReadBorders(ANode: TDOMNode); procedure ReadBorders(ANode: TDOMNode);
procedure ReadCell(ANode: TDOMNode; AWorksheet: TsBasicWorksheet); procedure ReadCell(ANode: TDOMNode; AWorksheet: TsBasicWorksheet;
ARowIndex: Cardinal; var AColIndex: Cardinal);
procedure ReadCellXfs(ANode: TDOMNode); procedure ReadCellXfs(ANode: TDOMNode);
procedure ReadColRowBreaks(ANode: TDOMNode; AWorksheet: TsBasicWorksheet); procedure ReadColRowBreaks(ANode: TDOMNode; AWorksheet: TsBasicWorksheet);
function ReadColor(ANode: TDOMNode): TsColor; function ReadColor(ANode: TDOMNode): TsColor;
@@ -88,7 +89,7 @@ type
procedure ReadPageSetup(ANode: TDOMNode; AWorksheet: TsBasicWorksheet); procedure ReadPageSetup(ANode: TDOMNode; AWorksheet: TsBasicWorksheet);
procedure ReadPalette(ANode: TDOMNode); procedure ReadPalette(ANode: TDOMNode);
procedure ReadPrintOptions(ANode: TDOMNode; AWorksheet: TsBasicWorksheet); procedure ReadPrintOptions(ANode: TDOMNode; AWorksheet: TsBasicWorksheet);
procedure ReadRow(ANode: TDOMNode; AWorksheet: TsBasicWorksheet); procedure ReadRow(ANode: TDOMNode; AWorksheet: TsBasicWorksheet; var ARowIndex: Cardinal);
procedure ReadSharedStrings(ANode: TDOMNode); procedure ReadSharedStrings(ANode: TDOMNode);
procedure ReadSheetFormatPr(ANode: TDOMNode; AWorksheet: TsBasicWorksheet); procedure ReadSheetFormatPr(ANode: TDOMNode; AWorksheet: TsBasicWorksheet);
procedure ReadSheetList(ANode: TDOMNode); procedure ReadSheetList(ANode: TDOMNode);
@@ -654,7 +655,7 @@ begin
end; end;
procedure TsSpreadOOXMLReader.ReadCell(ANode: TDOMNode; procedure TsSpreadOOXMLReader.ReadCell(ANode: TDOMNode;
AWorksheet: TsBasicWorksheet); AWorksheet: TsBasicWorksheet; ARowIndex: Cardinal; var AColIndex: Cardinal);
var var
book: TsWorkbook; book: TsWorkbook;
sheet: TsWorksheet; sheet: TsWorksheet;
@@ -683,7 +684,14 @@ begin
// get row and column address // get row and column address
addr := GetAttrValue(ANode, 'r'); // cell address, like 'A1' addr := GetAttrValue(ANode, 'r'); // cell address, like 'A1'
ParseCellString(addr, rowIndex, colIndex); if addr <> '' then
ParseCellString(addr, rowIndex, colIndex)
else
begin
rowIndex := ARowIndex;
colIndex := AColIndex;
end;
AColIndex := colIndex + 1;
// create cell // create cell
if FIsVirtualMode then if FIsVirtualMode then
@@ -2017,7 +2025,7 @@ begin
end; end;
procedure TsSpreadOOXMLReader.ReadRow(ANode: TDOMNode; procedure TsSpreadOOXMLReader.ReadRow(ANode: TDOMNode;
AWorksheet: TsBasicWorksheet); AWorksheet: TsBasicWorksheet; var ARowIndex: Cardinal);
var var
s: String; s: String;
r: Cardinal; r: Cardinal;
@@ -2050,7 +2058,10 @@ begin
{ Row index } { Row index }
s := GetAttrValue(ANode, 'r'); s := GetAttrValue(ANode, 'r');
r := StrToInt(s) - 1; if s = '' then
r := ARowIndex
else
r := StrToInt(s) - 1;
{ Row format } { Row format }
lRow.FormatIndex := 0; // Default format lRow.FormatIndex := 0; // Default format
@@ -2571,19 +2582,23 @@ var
rownode: TDOMNode; rownode: TDOMNode;
cellnode: TDOMNode; cellnode: TDOMNode;
nodename: String; nodename: String;
r, c: Cardinal;
begin begin
rownode := ANode.FirstChild; rownode := ANode.FirstChild;
r := 0;
while Assigned(rownode) do begin while Assigned(rownode) do begin
nodeName := rownode.NodeName; nodeName := rownode.NodeName;
if (nodeName = 'row') or (nodeName = 'x:row') then begin if (nodeName = 'row') or (nodeName = 'x:row') then begin
ReadRow(rownode, AWorksheet); ReadRow(rownode, AWorksheet, r);
cellnode := rownode.FirstChild; cellnode := rownode.FirstChild;
c := 0;
while Assigned(cellnode) do begin while Assigned(cellnode) do begin
nodename := cellnode.NodeName; nodename := cellnode.NodeName;
if (nodeName = 'c') or (nodeName = 'x:c') then if (nodeName = 'c') or (nodeName = 'x:c') then
ReadCell(cellnode, AWorksheet); ReadCell(cellnode, AWorksheet, r, c);
cellnode := cellnode.NextSibling; cellnode := cellnode.NextSibling;
end; end;
inc(r);
end; end;
rownode := rownode.NextSibling; rownode := rownode.NextSibling;
end; end;