You've already forked lazarus-ccr
fpspreadsheet: Improved auto-format detection (check extension first, check file header when extension test fails). Fix ods reader crashing when extension has been renamed.
git-svn-id: https://svn.code.sf.net/p/lazarus-ccr/svn@6760 8e941d3f-bd1b-0410-a28a-d453659cc2b4
This commit is contained in:
@ -2613,6 +2613,7 @@ begin
|
||||
XMLStream.Free;
|
||||
end;
|
||||
|
||||
if Assigned(Doc) then begin
|
||||
ReadFontFaces(Doc.DocumentElement.FindNode('office:font-face-decls'));
|
||||
|
||||
StylesNode := Doc.DocumentElement.FindNode('office:styles');
|
||||
@ -2621,16 +2622,20 @@ begin
|
||||
ReadAutomaticStyles(Doc.DocumentElement.FindNode('office:automatic-styles'));
|
||||
ReadMasterStyles(Doc.DocumentElement.FindNode('office:master-styles'));
|
||||
FreeAndNil(Doc);
|
||||
end;
|
||||
|
||||
//process the content.xml file
|
||||
XMLStream := CreateXMLStream;
|
||||
try
|
||||
if UnzipToStream(AStream, 'content.xml', XMLStream) then
|
||||
ReadXMLStream(Doc, XMLStream);
|
||||
ReadXMLStream(Doc, XMLStream)
|
||||
else
|
||||
raise EFPSpreadsheetReader.CreateFmt(rsDefectiveInternalFileStructure, ['ods']);
|
||||
finally
|
||||
XMLStream.Free;
|
||||
end;
|
||||
|
||||
if Assigned(Doc) then begin
|
||||
ReadFontFaces(Doc.DocumentElement.FindNode('office:font-face-decls'));
|
||||
StylesNode := Doc.DocumentElement.FindNode('office:automatic-styles');
|
||||
ReadNumFormats(StylesNode);
|
||||
@ -2704,6 +2709,7 @@ begin
|
||||
end; //while Assigned(TableNode)
|
||||
|
||||
FreeAndNil(Doc);
|
||||
end;
|
||||
|
||||
// process the settings.xml file (Note: it does not always exist!)
|
||||
XMLStream := CreateXMLStream;
|
||||
@ -2718,9 +2724,6 @@ begin
|
||||
XMLStream.Free;
|
||||
end;
|
||||
|
||||
// Convert formulas from OpenDocument to ExcelA1 dialect
|
||||
// FixFormulas;
|
||||
|
||||
// Active sheet
|
||||
if FActiveSheet <> '' then
|
||||
sheet := (FWorkbook as TsWorkbook).GetWorksheetByName(FActiveSheet) else
|
||||
|
@ -8691,18 +8691,47 @@ procedure TsWorkbook.ReadFromFile(AFileName: string; APassword: String = '';
|
||||
AParams: TsStreamParams = []);
|
||||
var
|
||||
success: Boolean;
|
||||
fmtID: TsSpreadFormatID;
|
||||
fileFormats: TsSpreadFormatIDArray;
|
||||
i: Integer;
|
||||
found: Boolean;
|
||||
begin
|
||||
if not FileExists(AFileName) then
|
||||
raise EFPSpreadsheetReader.CreateFmt(rsFileNotFound, [AFileName]);
|
||||
|
||||
// First try to determine file format from the extension
|
||||
if GetFormatFromFileName(AFilename, fmtID) then begin
|
||||
try
|
||||
ReadFromFile(AFileName, fmtID, APassword, AParams);
|
||||
exit;
|
||||
except
|
||||
// format does not match. We must continue with rest of procedure
|
||||
end;
|
||||
end else
|
||||
fmtID := MaxInt;
|
||||
|
||||
// Try to get file format from file header
|
||||
GetFormatFromFileHeader(AFileName, fileformats);
|
||||
if Length(fileformats) = 0 then
|
||||
// If not successful use formats defined by extension
|
||||
fileFormats := GetSpreadFormatsFromFileName(faRead, AFileName);
|
||||
|
||||
// Remove already tested format
|
||||
found := false;
|
||||
i := 0;
|
||||
while (i <= High(fileFormats)) do begin
|
||||
if fileFormats[i] = fmtID then begin
|
||||
found := true;
|
||||
inc(i);
|
||||
while (i <= High(fileFormats)) do begin
|
||||
fileFormats[i-1] := fileFormats[i];
|
||||
inc(i);
|
||||
end;
|
||||
end else
|
||||
inc(i);
|
||||
end;
|
||||
if found then SetLength(fileFormats, Length(fileFormats)-1);
|
||||
|
||||
// No file format found for this file --> error
|
||||
if Length(fileformats) = 0 then
|
||||
raise EFPSpreadsheetReader.CreateFmt(rsReaderNotFound, [AFileName]);
|
||||
|
@ -1370,7 +1370,7 @@ var
|
||||
fileformats: TsSpreadFormatIDArray;
|
||||
begin
|
||||
fileFormats := GetSpreadFormatsFromFileName(faRead, AFileName, ord(sfExcel8));
|
||||
Result := (Length(fileFormats) > 0) and (fileFormats[0] <= sfidUnknown);
|
||||
Result := (Length(fileFormats) > 0); // and (fileFormats[0] <= sfidUnknown); // wp - removed for new format detection
|
||||
if Result then AFormatID := fileFormats[0];
|
||||
end;
|
||||
|
||||
|
Reference in New Issue
Block a user