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