You've already forked lazarus-ccr
fpspreadsheet: Fix xlsx reader bug which assumes that sheet files in the xlsx structure are always named "sheet1.xml", "sheet2.xml", etc. Issue #39050, patch by Domenico Mammola.
git-svn-id: https://svn.code.sf.net/p/lazarus-ccr/svn@8763 8e941d3f-bd1b-0410-a28a-d453659cc2b4
This commit is contained in:
@ -56,6 +56,7 @@ type
|
|||||||
FPointSeparatorSettings: TFormatSettings;
|
FPointSeparatorSettings: TFormatSettings;
|
||||||
FSharedStrings: TStringList;
|
FSharedStrings: TStringList;
|
||||||
FSheetList: TFPList;
|
FSheetList: TFPList;
|
||||||
|
FWorkbookRels: TFPList;
|
||||||
FFillList: TFPList;
|
FFillList: TFPList;
|
||||||
FBorderList: TFPList;
|
FBorderList: TFPList;
|
||||||
FDrawingToSheetRelList: TFPList;
|
FDrawingToSheetRelList: TFPList;
|
||||||
@ -443,6 +444,8 @@ type
|
|||||||
TSheetData = class
|
TSheetData = class
|
||||||
Name: String;
|
Name: String;
|
||||||
ID: String;
|
ID: String;
|
||||||
|
RelID : String;
|
||||||
|
Target : String;
|
||||||
Hidden: Boolean;
|
Hidden: Boolean;
|
||||||
SheetRels: TFPList;
|
SheetRels: TFPList;
|
||||||
Drawing_File: String;
|
Drawing_File: String;
|
||||||
@ -806,6 +809,7 @@ begin
|
|||||||
|
|
||||||
FSharedStrings := TStringList.Create;
|
FSharedStrings := TStringList.Create;
|
||||||
FSheetList := TFPList.Create;
|
FSheetList := TFPList.Create;
|
||||||
|
FWorkbookRels := TRelationshipList.Create;
|
||||||
FFillList := TFPList.Create;
|
FFillList := TFPList.Create;
|
||||||
FBorderList := TFPList.Create;
|
FBorderList := TFPList.Create;
|
||||||
FHyperlinkList := TFPList.Create;
|
FHyperlinkList := TFPList.Create;
|
||||||
@ -855,6 +859,8 @@ begin
|
|||||||
TObject(FSheetList[j]).Free;
|
TObject(FSheetList[j]).Free;
|
||||||
FSheetList.Free;
|
FSheetList.Free;
|
||||||
|
|
||||||
|
FWorkbookRels.Free;
|
||||||
|
|
||||||
for j := FSharedStrings.Count-1 downto 0 do
|
for j := FSharedStrings.Count-1 downto 0 do
|
||||||
FSharedStrings.Objects[j].Free;
|
FSharedStrings.Objects[j].Free;
|
||||||
FSharedStrings.Free;
|
FSharedStrings.Free;
|
||||||
@ -3740,6 +3746,7 @@ begin
|
|||||||
sheetData := TSheetData.Create;
|
sheetData := TSheetData.Create;
|
||||||
sheetData.Name := GetAttrValue(node, 'name');
|
sheetData.Name := GetAttrValue(node, 'name');
|
||||||
sheetData.ID := GetAttrvalue(node, 'sheetId');
|
sheetData.ID := GetAttrvalue(node, 'sheetId');
|
||||||
|
sheetData.RelID := GetAttrvalue(node, 'r:id');
|
||||||
sheetData.Hidden := GetAttrValue(node, 'state') = 'hidden';
|
sheetData.Hidden := GetAttrValue(node, 'state') = 'hidden';
|
||||||
// Add the sheetdata to the SheetList.
|
// Add the sheetdata to the SheetList.
|
||||||
FSheetList.Add(sheetData);
|
FSheetList.Add(sheetData);
|
||||||
@ -4428,6 +4435,7 @@ begin
|
|||||||
ReadDateMode(Doc_FindNode('workbookPr'));
|
ReadDateMode(Doc_FindNode('workbookPr'));
|
||||||
ReadWorkbookProtection(Doc_FindNode('workbookProtection'));
|
ReadWorkbookProtection(Doc_FindNode('workbookProtection'));
|
||||||
ReadSheetList(Doc_FindNode('sheets')); // This creates the worksheets!
|
ReadSheetList(Doc_FindNode('sheets')); // This creates the worksheets!
|
||||||
|
ReadRels(AStream, OOXML_PATH_XL_RELS_RELS, FWorkbookRels);
|
||||||
ReadSheetRels(AStream);
|
ReadSheetRels(AStream);
|
||||||
ReadDefinedNames(Doc.DocumentElement.FindNode('definedNames'));
|
ReadDefinedNames(Doc.DocumentElement.FindNode('definedNames'));
|
||||||
ReadActiveSheet(Doc_FindNode('bookViews'), actSheetIndex);
|
ReadActiveSheet(Doc_FindNode('bookViews'), actSheetIndex);
|
||||||
@ -4482,7 +4490,11 @@ begin
|
|||||||
// unzip sheet file
|
// unzip sheet file
|
||||||
XMLStream := CreateXMLStream;
|
XMLStream := CreateXMLStream;
|
||||||
try
|
try
|
||||||
fn := OOXML_PATH_XL_WORKSHEETS + Format('sheet%d.xml', [i+1]);
|
fn := TRelationshipList(FWorkbookRels).FindTarget(sheetData.RelID);
|
||||||
|
if fn = '' then
|
||||||
|
fn := OOXML_PATH_XL_WORKSHEETS + Format('sheet%d.xml', [i+1])
|
||||||
|
else
|
||||||
|
fn := OOXML_PATH_XL_WORKSHEETS + ExtractFileName(fn);
|
||||||
if not UnzipToStream(AStream, fn, XMLStream) then
|
if not UnzipToStream(AStream, fn, XMLStream) then
|
||||||
Continue;
|
Continue;
|
||||||
ReadXMLStream(Doc, XMLStream);
|
ReadXMLStream(Doc, XMLStream);
|
||||||
|
Reference in New Issue
Block a user