You've already forked lazarus-ccr
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:
@@ -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;
|
||||||
|
Reference in New Issue
Block a user