From 11772b0156df69147ddcba6ef07dd10986498455 Mon Sep 17 00:00:00 2001 From: wp_xxyyzz Date: Fri, 25 Jul 2014 16:46:39 +0000 Subject: [PATCH] fpspreadsheet: Fix ooxml reader crashing for files having no shared strings table. git-svn-id: https://svn.code.sf.net/p/lazarus-ccr/svn@3379 8e941d3f-bd1b-0410-a28a-d453659cc2b4 --- .../examples/spready/spready.lpi | 9 +++------ .../examples/spready/spready.lpr | 2 +- .../fpspreadsheet/laz_fpspreadsheet.lpk | 6 +++++- .../fpspreadsheet/laz_fpspreadsheet.pas | 2 +- components/fpspreadsheet/xlsxooxml.pas | 19 ++++++++++++------- 5 files changed, 22 insertions(+), 16 deletions(-) diff --git a/components/fpspreadsheet/examples/spready/spready.lpi b/components/fpspreadsheet/examples/spready/spready.lpi index 7775072a1..39a334c0e 100644 --- a/components/fpspreadsheet/examples/spready/spready.lpi +++ b/components/fpspreadsheet/examples/spready/spready.lpi @@ -93,16 +93,13 @@ - + - + - - - - + diff --git a/components/fpspreadsheet/examples/spready/spready.lpr b/components/fpspreadsheet/examples/spready/spready.lpr index e20dec961..ab244e99b 100644 --- a/components/fpspreadsheet/examples/spready/spready.lpr +++ b/components/fpspreadsheet/examples/spready/spready.lpr @@ -4,7 +4,7 @@ program spready; uses Interfaces, // this includes the LCL widgetset - Forms, mainform, laz_fpspreadsheet_visual, laz_fpspreadsheet; + Forms, mainform, laz_fpspreadsheet_visual; {$R *.res} diff --git a/components/fpspreadsheet/laz_fpspreadsheet.lpk b/components/fpspreadsheet/laz_fpspreadsheet.lpk index dbd66ea70..78b5a5f17 100644 --- a/components/fpspreadsheet/laz_fpspreadsheet.lpk +++ b/components/fpspreadsheet/laz_fpspreadsheet.lpk @@ -25,7 +25,7 @@ This package is all you need if you don't want graphical components (like grids and charts)."/> - + @@ -114,6 +114,10 @@ This package is all you need if you don't want graphical components (like grids + + + + diff --git a/components/fpspreadsheet/laz_fpspreadsheet.pas b/components/fpspreadsheet/laz_fpspreadsheet.pas index 78de7261f..b87db18a8 100644 --- a/components/fpspreadsheet/laz_fpspreadsheet.pas +++ b/components/fpspreadsheet/laz_fpspreadsheet.pas @@ -11,7 +11,7 @@ uses xlsbiff5, xlsbiff8, xlsxooxml, fpsutils, fpsStreams, fpszipper, uvirtuallayer_types, uvirtuallayer, uvirtuallayer_ole, uvirtuallayer_ole_helpers, uvirtuallayer_ole_types, uvirtuallayer_stream, - fpolebasic, xlscommon, wikitable, fpsNumFormatParser, fpsfunc; + fpolebasic, xlscommon, wikitable, fpsNumFormatParser, fpsfunc, fpsxmlcommon; implementation diff --git a/components/fpspreadsheet/xlsxooxml.pas b/components/fpspreadsheet/xlsxooxml.pas index 977f26a64..0bd75f86f 100755 --- a/components/fpspreadsheet/xlsxooxml.pas +++ b/components/fpspreadsheet/xlsxooxml.pas @@ -448,6 +448,7 @@ var FileList : TStringList; SheetList: TStringList; i: Integer; + fn: String; BodyNode, SpreadSheetNode, TableNode: TDOMNode; StylesNode: TDOMNode; @@ -478,10 +479,12 @@ begin SheetList := TStringList.Create; try // process the sharedStrings.xml file - ReadXMLFile(Doc, FilePath + OOXML_PATH_XL_STRINGS); - DeleteFile(FilePath + OOXML_PATH_XL_STRINGS); - ReadSharedStrings(Doc.DocumentElement.FindNode('si')); - FreeAndNil(Doc); + if FileExists(FilePath + OOXML_PATH_XL_STRINGS) then begin + ReadXMLFile(Doc, FilePath + OOXML_PATH_XL_STRINGS); + DeleteFile(FilePath + OOXML_PATH_XL_STRINGS); + ReadSharedStrings(Doc.DocumentElement.FindNode('si')); + FreeAndNil(Doc); + end; // process the styles.xml file ReadXMLFile(Doc, FilePath + OOXML_PATH_XL_STYLES); @@ -507,7 +510,9 @@ begin // unzip sheet file FileList := TStringList.Create; try - FileList.Add(OOXML_PATH_XL_WORKSHEETS + SheetList[i] + '.xml'); + // The file name is always "sheet.xml", irrespective of the sheet's name! + fn := OOXML_PATH_XL_WORKSHEETS + 'sheet' + IntToStr(i+1) + '.xml'; + FileList.Add(fn); UnZip := TUnZipper.Create; try UnZip.OutputPath := FilePath; @@ -519,8 +524,8 @@ begin FreeAndNil(FileList); end; - ReadXMLFile(Doc, FilePath + OOXML_PATH_XL_WORKSHEETS + SheetList[i] + '.xml'); - DeleteFile(FilePath + OOXML_PATH_XL_WORKSHEETS + SheetList[i] + '.xml'); + ReadXMLFile(Doc, FilePath + fn); + DeleteFile(FilePath + fn); FWorksheet := AData.AddWorksheet(SheetList[i]);