fpspreadsheet: Remove workbook parameter from the reader's ReadFromXXXX methods to avoid with conflict by workbook passed at construction.

git-svn-id: https://svn.code.sf.net/p/lazarus-ccr/svn@3925 8e941d3f-bd1b-0410-a28a-d453659cc2b4
This commit is contained in:
wp_xxyyzz 2015-02-04 19:50:50 +00:00
parent ac387f67e4
commit 629ac7dd00
8 changed files with 78 additions and 84 deletions

View File

@ -27,9 +27,9 @@ type
procedure ReadNumber(AStream: TStream); override;
public
constructor Create(AWorkbook: TsWorkbook); override;
procedure ReadFromFile(AFileName: String; AData: TsWorkbook); override;
procedure ReadFromStream(AStream: TStream; AData: TsWorkbook); override;
procedure ReadFromStrings(AStrings: TStrings; AData: TsWorkbook); override;
procedure ReadFromFile(AFileName: String); override;
procedure ReadFromStream(AStream: TStream); override;
procedure ReadFromStrings(AStrings: TStrings); override;
end;
TsCSVWriter = class(TsCustomSpreadWriter)
@ -203,6 +203,8 @@ constructor TsCSVReader.Create(AWorkbook: TsWorkbook);
begin
inherited Create(AWorkbook);
FWorksheetName := 'Sheet1'; // will be replaced by filename
FFormatSettings := CSVParams.FormatSettings;
ReplaceFormatSettings(FFormatSettings, FWorkbook.FormatSettings);
end;
function TsCSVReader.IsBool(AText: String; out AValue: Boolean): Boolean;
@ -429,13 +431,13 @@ begin
Unused(AStream);
end;
procedure TsCSVReader.ReadFromFile(AFileName: String; AData: TsWorkbook);
procedure TsCSVReader.ReadFromFile(AFileName: String);
begin
FWorksheetName := ChangeFileExt(ExtractFileName(AFileName), '');
inherited;
end;
procedure TsCSVReader.ReadFromStream(AStream: TStream; AData: TsWorkbook);
procedure TsCSVReader.ReadFromStream(AStream: TStream);
var
Parser: TCSVParser;
s: String;
@ -449,12 +451,8 @@ begin
else
encoding := CSVParams.Encoding;
// Store workbook for internal use, and create worksheet
FWorkbook := AData;
FWorksheet := AData.AddWorksheet(FWorksheetName, true);
FFormatSettings := CSVParams.FormatSettings;
ReplaceFormatSettings(FFormatSettings, FWorkbook.FormatSettings);
// Create worksheet
FWorksheet := FWorkbook.AddWorksheet(FWorksheetName, true);
// Create csv parser, read file and store in worksheet
Parser := TCSVParser.Create;
@ -476,13 +474,13 @@ begin
end;
end;
procedure TsCSVReader.ReadFromStrings(AStrings: TStrings; AData: TsWorkbook);
procedure TsCSVReader.ReadFromStrings(AStrings: TStrings);
var
Stream: TStringStream;
begin
Stream := TStringStream.Create(AStrings.Text);
try
ReadFromStream(Stream, AData);
ReadFromStream(Stream);
finally
Stream.Free;
end;

View File

@ -120,8 +120,8 @@ type
{ General reading methods }
constructor Create(AWorkbook: TsWorkbook); override;
destructor Destroy; override;
procedure ReadFromFile(AFileName: string; AData: TsWorkbook); override;
procedure ReadFromStream(AStream: TStream; AData: TsWorkbook); override;
procedure ReadFromFile(AFileName: string); override;
procedure ReadFromStream(AStream: TStream); override;
end;
{ TsSpreadOpenDocWriter }
@ -1342,7 +1342,7 @@ begin
Workbook.OnReadCellData(Workbook, ARow, ACol, cell);
end;
procedure TsSpreadOpenDocReader.ReadFromFile(AFileName: string; AData: TsWorkbook);
procedure TsSpreadOpenDocReader.ReadFromFile(AFileName: string);
var
Doc : TXMLDocument;
FilePath : string;
@ -1409,7 +1409,7 @@ begin
TableNode := TableNode.NextSibling;
continue;
end;
FWorkSheet := aData.AddWorksheet(GetAttrValue(TableNode,'table:name'), true);
FWorkSheet := FWorkbook.AddWorksheet(GetAttrValue(TableNode,'table:name'), true);
// Collect column styles used
ReadColumns(TableNode);
// Process each row inside the sheet and process each cell of the row
@ -1439,9 +1439,9 @@ begin
end;
end;
procedure TsSpreadOpenDocReader.ReadFromStream(AStream: TStream; AData: TsWorkbook);
procedure TsSpreadOpenDocReader.ReadFromStream(AStream: TStream);
begin
Unused(AStream, AData);
Unused(AStream);
raise Exception.Create('[TsSpreadOpenDocReader.ReadFromStream] '+
'Method not implemented. Use "ReadFromFile" instead.');
end;

View File

@ -866,9 +866,9 @@ type
constructor Create(AWorkbook: TsWorkbook); override;
destructor Destroy; override;
{ General writing methods }
procedure ReadFromFile(AFileName: string; AData: TsWorkbook); virtual;
procedure ReadFromStream(AStream: TStream; AData: TsWorkbook); virtual;
procedure ReadFromStrings(AStrings: TStrings; AData: TsWorkbook); virtual;
procedure ReadFromFile(AFileName: string); virtual;
procedure ReadFromStream(AStream: TStream); virtual;
procedure ReadFromStrings(AStrings: TStrings); virtual;
end;
@ -6592,7 +6592,8 @@ begin
Break;
end;
if Result = nil then raise Exception.Create(rsUnsupportedReadFormat);
if Result = nil then
raise Exception.Create(rsUnsupportedReadFormat);
end;
{@@ ----------------------------------------------------------------------------
@ -6617,7 +6618,8 @@ begin
Break;
end;
if Result = nil then raise Exception.Create(rsUnsupportedWriteFormat);
if Result = nil then
raise Exception.Create(rsUnsupportedWriteFormat);
end;
{@@ ----------------------------------------------------------------------------
@ -6686,7 +6688,7 @@ begin
ok := false;
inc(FLockCount); // This locks various notifications from being sent
try
AReader.ReadFromFile(AFileName, Self);
AReader.ReadFromFile(AFileName);
ok := true;
UpdateCaches;
if (boAutoCalc in Options) then
@ -6801,7 +6803,7 @@ begin
inc(FLockCount);
try
ok := false;
AReader.ReadFromStream(AStream, Self);
AReader.ReadFromStream(AStream);
ok := true;
finally
dec(FLockCount);
@ -8483,13 +8485,13 @@ end;
{@@ ----------------------------------------------------------------------------
Default file reading method.
Opens the file and calls ReadFromStream
Opens the file and calls ReadFromStream. Data are stored in the workbook
specified during construction.
@param AFileName The input file name.
@param AData The Workbook to be filled with information from the file.
@see TsWorkbook
-------------------------------------------------------------------------------}
procedure TsCustomSpreadReader.ReadFromFile(AFileName: string; AData: TsWorkbook);
procedure TsCustomSpreadReader.ReadFromFile(AFileName: string);
var
InputFile: TStream;
begin
@ -8499,7 +8501,7 @@ begin
InputFile := TFileStream.Create(AFileName, fmOpenRead + fmShareDenyNone);
try
ReadFromStream(InputFile, AData);
ReadFromStream(InputFile);
finally
InputFile.Free;
end;
@ -8513,10 +8515,11 @@ end;
the data are provided by calling ReadFromStrings. This mechanism is valid
for wikitables.
@param AStream Stream containing the workbook data
Data will be stored in the workbook defined at construction.
@param AData Workbook which is filled by the data from the stream.
-------------------------------------------------------------------------------}
procedure TsCustomSpreadReader.ReadFromStream(AStream: TStream; AData: TsWorkbook);
procedure TsCustomSpreadReader.ReadFromStream(AStream: TStream);
var
AStringStream: TStringStream;
AStrings: TStringList;
@ -8527,7 +8530,7 @@ begin
AStringStream.CopyFrom(AStream, AStream.Size);
AStringStream.Seek(0, soFromBeginning);
AStrings.Text := AStringStream.DataString;
ReadFromStrings(AStrings, AData);
ReadFromStrings(AStrings);
finally
AStringStream.Free;
AStrings.Free;
@ -8538,10 +8541,9 @@ end;
Reads workbook data from a string list. This abstract implementation does
nothing and raises an exception. Must be overridden, like for wikitables.
-------------------------------------------------------------------------------}
procedure TsCustomSpreadReader.ReadFromStrings(AStrings: TStrings;
AData: TsWorkbook);
procedure TsCustomSpreadReader.ReadFromStrings(AStrings: TStrings);
begin
Unused(AStrings, AData);
Unused(AStrings);
raise Exception.Create(rsUnsupportedReadFormat);
end;

View File

@ -64,11 +64,12 @@ type
{ TsWikiTableReader }
TsWikiTableReader = class(TsCustomSpreadReader)
protected
procedure ReadFromStrings_Pipes(AStrings: TStrings);
public
SubFormat: TsSpreadsheetFormat;
{ General reading methods }
procedure ReadFromStrings(AStrings: TStrings; AData: TsWorkbook); override;
procedure ReadFromStrings_Pipes(AStrings: TStrings; AData: TsWorkbook);
procedure ReadFromStrings(AStrings: TStrings); override;
end;
{ TsWikiTable_PipesReader }
@ -293,24 +294,22 @@ end;
{ TsWikiTableReader }
procedure TsWikiTableReader.ReadFromStrings(AStrings: TStrings;
AData: TsWorkbook);
procedure TsWikiTableReader.ReadFromStrings(AStrings: TStrings);
begin
case SubFormat of
sfWikiTable_Pipes: ReadFromStrings_Pipes(AStrings, AData);
sfWikiTable_Pipes: ReadFromStrings_Pipes(AStrings);
end;
end;
procedure TsWikiTableReader.ReadFromStrings_Pipes(AStrings: TStrings;
AData: TsWorkbook);
procedure TsWikiTableReader.ReadFromStrings_Pipes(AStrings: TStrings);
var
i, j: Integer;
lCurLine: String;
lLineSplitter: TWikiTableTokenizer;
lCurToken: TWikiTableToken;
begin
FWorksheet := AData.AddWorksheet('Table', true);
lLineSplitter := TWikiTableTokenizer.Create(AData);
FWorksheet := FWorkbook.AddWorksheet('Table', true);
lLineSplitter := TWikiTableTokenizer.Create(FWorkbook);
try
for i := 0 to AStrings.Count-1 do
begin

View File

@ -83,7 +83,7 @@ type
public
constructor Create(AWorkbook: TsWorkbook); override;
{ General reading methods }
procedure ReadFromStream(AStream: TStream; AData: TsWorkbook); override;
procedure ReadFromStream(AStream: TStream); override;
end;
{ TsSpreadBIFF2Writer }
@ -504,7 +504,7 @@ begin
// (Using the formats in the file would require de-localizing them).
end;
procedure TsSpreadBIFF2Reader.ReadFromStream(AStream: TStream; AData: TsWorkbook);
procedure TsSpreadBIFF2Reader.ReadFromStream(AStream: TStream);
var
BIFF2EOF: Boolean;
RecordType: Word;
@ -519,7 +519,7 @@ begin
BIFF2EOF := False;
{ In BIFF2 files there is only one worksheet, let's create it }
FWorksheet := AData.AddWorksheet('Sheet', true);
FWorksheet := FWorkbook.AddWorksheet('Sheet', true);
{ Read all records in a loop }
while not BIFF2EOF do

View File

@ -82,16 +82,16 @@ type
procedure ReadFont(const AStream: TStream);
procedure ReadFormat(AStream: TStream); override;
procedure ReadLabel(AStream: TStream); override;
procedure ReadWorkbookGlobals(AStream: TStream; AData: TsWorkbook);
procedure ReadWorksheet(AStream: TStream; AData: TsWorkbook);
procedure ReadWorkbookGlobals(AStream: TStream);
procedure ReadWorksheet(AStream: TStream);
procedure ReadRichString(AStream: TStream);
procedure ReadStandardWidth(AStream: TStream; ASheet: TsWorksheet);
procedure ReadStringRecord(AStream: TStream); override;
procedure ReadXF(AStream: TStream);
public
{ General reading methods }
procedure ReadFromFile(AFileName: string; AData: TsWorkbook); override;
procedure ReadFromStream(AStream: TStream; AData: TsWorkbook); override;
procedure ReadFromFile(AFileName: string); override;
procedure ReadFromStream(AStream: TStream); override;
end;
{ TsSpreadBIFF5Writer }
@ -324,15 +324,12 @@ type
{ TsSpreadBIFF5Reader }
procedure TsSpreadBIFF5Reader.ReadWorkbookGlobals(AStream: TStream;
AData: TsWorkbook);
procedure TsSpreadBIFF5Reader.ReadWorkbookGlobals(AStream: TStream);
var
SectionEOF: Boolean = False;
RecordType: Word;
CurStreamPos: Int64;
begin
Unused(AData);
// Clear existing fonts. They will be replaced by those from the file.
FWorkbook.RemoveAllFonts;
@ -365,13 +362,13 @@ begin
end;
end;
procedure TsSpreadBIFF5Reader.ReadWorksheet(AStream: TStream; AData: TsWorkbook);
procedure TsSpreadBIFF5Reader.ReadWorksheet(AStream: TStream);
var
SectionEOF: Boolean = False;
RecordType: Word;
CurStreamPos: Int64;
begin
FWorksheet := AData.AddWorksheet(FWorksheetNames[FCurrentWorksheet], true);
FWorksheet := FWorkbook.AddWorksheet(FWorksheetNames[FCurrentWorksheet], true);
while (not SectionEOF) do
begin
@ -556,7 +553,7 @@ begin
FIncompleteCell := nil;
end;
procedure TsSpreadBIFF5Reader.ReadFromFile(AFileName: string; AData: TsWorkbook);
procedure TsSpreadBIFF5Reader.ReadFromFile(AFileName: string);
var
MemStream: TMemoryStream;
OLEStorage: TOLEStorage;
@ -574,7 +571,7 @@ begin
// Rewind the stream and read from it
MemStream.Position := 0;
ReadFromStream(MemStream, AData);
ReadFromStream(MemStream);
// Uncomment to verify if the data was correctly obtained from the OLE file
// MemStream.SaveToFile(SysUtils.ChangeFileExt(AFileName, 'bin.xls'));
@ -714,7 +711,7 @@ begin
FCellFormatList.Add(fmt);
end;
procedure TsSpreadBIFF5Reader.ReadFromStream(AStream: TStream; AData: TsWorkbook);
procedure TsSpreadBIFF5Reader.ReadFromStream(AStream: TStream);
var
BIFF5EOF: Boolean;
begin
@ -727,7 +724,7 @@ begin
{ Read workbook globals }
ReadWorkbookGlobals(AStream, AData);
ReadWorkbookGlobals(AStream);
// Check for the end of the file
if AStream.Position >= AStream.Size then BIFF5EOF := True;
@ -736,7 +733,7 @@ begin
while (not BIFF5EOF) do
begin
ReadWorksheet(AStream, AData);
ReadWorksheet(AStream);
// Check for the end of the file
if AStream.Position >= AStream.Size then BIFF5EOF := True;

View File

@ -75,8 +75,8 @@ type
FSharedStringTable: TStringList;
function ReadWideString(const AStream: TStream; const ALength: WORD): WideString; overload;
function ReadWideString(const AStream: TStream; const AUse8BitLength: Boolean): WideString; overload;
procedure ReadWorkbookGlobals(AStream: TStream; AData: TsWorkbook);
procedure ReadWorksheet(AStream: TStream; AData: TsWorkbook);
procedure ReadWorkbookGlobals(AStream: TStream);
procedure ReadWorksheet(AStream: TStream);
procedure ReadBoundsheet(AStream: TStream);
function ReadString(const AStream: TStream; const ALength: WORD): String;
protected
@ -102,8 +102,8 @@ type
public
destructor Destroy; override;
{ General reading methods }
procedure ReadFromFile(AFileName: string; AData: TsWorkbook); override;
procedure ReadFromStream(AStream: TStream; AData: TsWorkbook); override;
procedure ReadFromFile(AFileName: string); override;
procedure ReadFromStream(AStream: TStream); override;
end;
{ TsSpreadBIFF8Writer }
@ -439,14 +439,12 @@ begin
Result := ReadWideString(AStream, Len);
end;
procedure TsSpreadBIFF8Reader.ReadWorkbookGlobals(AStream: TStream;
AData: TsWorkbook);
procedure TsSpreadBIFF8Reader.ReadWorkbookGlobals(AStream: TStream);
var
SectionEOF: Boolean = False;
RecordType: Word;
CurStreamPos: Int64;
begin
Unused(AData);
// Clear existing fonts. They will be replaced by those from the file.
FWorkbook.RemoveAllFonts;
if Assigned(FSharedStringTable) then FreeAndNil(FSharedStringTable);
@ -484,20 +482,20 @@ begin
end;
end;
procedure TsSpreadBIFF8Reader.ReadWorksheet(AStream: TStream; AData: TsWorkbook);
procedure TsSpreadBIFF8Reader.ReadWorksheet(AStream: TStream);
var
SectionEOF: Boolean = False;
RecordType: Word;
CurStreamPos: Int64;
begin
FWorksheet := AData.AddWorksheet(FWorksheetNames[FCurrentWorksheet], true);
FWorksheet := FWorkbook.AddWorksheet(FWorksheetNames[FCurrentWorksheet], true);
while (not SectionEOF) do
begin
{ Read the record header }
RecordType := WordLEToN(AStream.ReadWord);
RecordSize := WordLEToN(AStream.ReadWord);
PendingRecordSize:=RecordSize;
PendingRecordSize := RecordSize;
CurStreamPos := AStream.Position;
@ -576,7 +574,7 @@ begin
Result := UTF16ToUTF8(ReadWideString(AStream, ALength));
end;
procedure TsSpreadBIFF8Reader.ReadFromFile(AFileName: string; AData: TsWorkbook);
procedure TsSpreadBIFF8Reader.ReadFromFile(AFileName: string);
var
MemStream: TMemoryStream;
OLEStorage: TOLEStorage;
@ -595,7 +593,7 @@ begin
// Rewind the stream and read from it
MemStream.Position := 0;
ReadFromStream(MemStream, AData);
ReadFromStream(MemStream);
// Uncomment to verify if the data was correctly optained from the OLE file
// MemStream.SaveToFile(SysUtils.ChangeFileExt(AFileName, 'bin.xls'));
@ -605,7 +603,7 @@ begin
end;
end;
procedure TsSpreadBIFF8Reader.ReadFromStream(AStream: TStream; AData: TsWorkbook);
procedure TsSpreadBIFF8Reader.ReadFromStream(AStream: TStream);
var
BIFF8EOF: Boolean;
begin
@ -617,7 +615,7 @@ begin
BIFF8EOF := False;
{ Read workbook globals }
ReadWorkbookGlobals(AStream, AData);
ReadWorkbookGlobals(AStream);
// Check for the end of the file
if AStream.Position >= AStream.Size then BIFF8EOF := True;
@ -628,7 +626,7 @@ begin
//Safe to not read beyond assigned worksheet names.
if FCurrentWorksheet > FWorksheetNames.Count-1 then break;
ReadWorksheet(AStream, AData);
ReadWorksheet(AStream);
// Check for the end of the file
if AStream.Position >= AStream.Size then BIFF8EOF := True;

View File

@ -96,8 +96,8 @@ type
public
constructor Create(AWorkbook: TsWorkbook); override;
destructor Destroy; override;
procedure ReadFromFile(AFileName: string; AData: TsWorkbook); override;
procedure ReadFromStream(AStream: TStream; AData: TsWorkbook); override;
procedure ReadFromFile(AFileName: string); override;
procedure ReadFromStream(AStream: TStream); override;
end;
{ TsSpreadOOXMLWriter }
@ -1471,7 +1471,7 @@ begin
FixRows(AWorksheet);
end;
procedure TsSpreadOOXMLReader.ReadFromFile(AFileName: string; AData: TsWorkbook);
procedure TsSpreadOOXMLReader.ReadFromFile(AFileName: string);
var
Doc : TXMLDocument;
FilePath : string;
@ -1542,7 +1542,7 @@ begin
// read worksheets
for i:=0 to SheetList.Count-1 do begin
// Create worksheet
FWorksheet := AData.AddWorksheet(SheetList[i], true);
FWorksheet := FWorkbook.AddWorksheet(SheetList[i], true);
// unzip sheet file
fn := OOXML_PATH_XL_WORKSHEETS + Format('sheet%d.xml', [i+1]);
@ -1595,9 +1595,9 @@ begin
end;
end;
procedure TsSpreadOOXMLReader.ReadFromStream(AStream: TStream; AData: TsWorkbook);
procedure TsSpreadOOXMLReader.ReadFromStream(AStream: TStream);
begin
Unused(AStream, AData);
Unused(AStream);
raise Exception.Create('[TsSpreadOOXMLReader.ReadFromStream] '+
'Method not implemented. Use "ReadFromFile" instead.');
end;