diff --git a/components/fpspreadsheet/examples/excel2demo/excel2read.lpi b/components/fpspreadsheet/examples/excel2demo/excel2read.lpi
index 41331d5e1..a122edc85 100644
--- a/components/fpspreadsheet/examples/excel2demo/excel2read.lpi
+++ b/components/fpspreadsheet/examples/excel2demo/excel2read.lpi
@@ -7,11 +7,11 @@
+
-
@@ -33,230 +33,13 @@
-
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/components/fpspreadsheet/examples/excel2demo/excel2read.lpr b/components/fpspreadsheet/examples/excel2demo/excel2read.lpr
index 22d579dce..fd56de91d 100644
--- a/components/fpspreadsheet/examples/excel2demo/excel2read.lpr
+++ b/components/fpspreadsheet/examples/excel2demo/excel2read.lpr
@@ -36,12 +36,13 @@ begin
WriteLn('Contents of the first worksheet of the file:');
WriteLn('');
+ CurCell := MyWorkSheet.GetFirstCell();
for i := 0 to MyWorksheet.GetCellCount - 1 do
begin
- CurCell := MyWorkSheet.GetCellByIndex(i);
WriteLn('Row: ', CurCell^.Row, ' Col: ', CurCell^.Col, ' Value: ',
UTF8ToAnsi(MyWorkSheet.ReadAsUTF8Text(CurCell^.Row, CurCell^.Col))
);
+ CurCell := MyWorkSheet.GetNextCell();
end;
// Finalization
diff --git a/components/fpspreadsheet/examples/excel5demo/excel5read.lpi b/components/fpspreadsheet/examples/excel5demo/excel5read.lpi
index 2e84c9709..7198405ec 100644
--- a/components/fpspreadsheet/examples/excel5demo/excel5read.lpi
+++ b/components/fpspreadsheet/examples/excel5demo/excel5read.lpi
@@ -7,11 +7,11 @@
+
-
@@ -33,297 +33,13 @@
-
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/components/fpspreadsheet/examples/excel5demo/excel5read.lpr b/components/fpspreadsheet/examples/excel5demo/excel5read.lpr
index a23bf90ce..61cfcdfda 100644
--- a/components/fpspreadsheet/examples/excel5demo/excel5read.lpr
+++ b/components/fpspreadsheet/examples/excel5demo/excel5read.lpr
@@ -37,14 +37,15 @@ begin
WriteLn('Contents of the first worksheet of the file:');
WriteLn('');
+ CurCell := MyWorkSheet.GetFirstCell();
for i := 0 to MyWorksheet.GetCellCount - 1 do
begin
- CurCell := MyWorkSheet.GetCellByIndex(i);
WriteLn('Row: ', CurCell^.Row,
' Col: ', CurCell^.Col, ' Value: ',
UTF8ToAnsi(MyWorkSheet.ReadAsUTF8Text(CurCell^.Row,
CurCell^.Col))
);
+ CurCell := MyWorkSheet.GetNextCell();
end;
// Finalization
diff --git a/components/fpspreadsheet/examples/excel5demo/excel5write.lpi b/components/fpspreadsheet/examples/excel5demo/excel5write.lpi
index 6fb8ca6eb..4875319c2 100644
--- a/components/fpspreadsheet/examples/excel5demo/excel5write.lpi
+++ b/components/fpspreadsheet/examples/excel5demo/excel5write.lpi
@@ -2,14 +2,14 @@
-
+
+
-
diff --git a/components/fpspreadsheet/examples/excel5demo/excel5write.lpr b/components/fpspreadsheet/examples/excel5demo/excel5write.lpr
index a4a48a969..433d99fd0 100644
--- a/components/fpspreadsheet/examples/excel5demo/excel5write.lpr
+++ b/components/fpspreadsheet/examples/excel5demo/excel5write.lpr
@@ -75,7 +75,7 @@ begin
MyWorksheet.WriteUTF8Text(0, 3, 'Fourth');}
// Save the spreadsheet to a file
- MyWorkbook.WriteToFile(MyDir + 'test.xls', sfExcel5);
+ MyWorkbook.WriteToFile(MyDir + 'test.xls', sfExcel5, False);
MyWorkbook.Free;
end.
diff --git a/components/fpspreadsheet/examples/excel5demo/run_excel5write.bat b/components/fpspreadsheet/examples/excel5demo/run_excel5write.bat
index 6d70c6689..9ee17c60b 100644
--- a/components/fpspreadsheet/examples/excel5demo/run_excel5write.bat
+++ b/components/fpspreadsheet/examples/excel5demo/run_excel5write.bat
@@ -1,3 +1,3 @@
-del test.xls
+#del test.xls
excel5write.exe
pause
\ No newline at end of file
diff --git a/components/fpspreadsheet/examples/excel8demo/excel8read.lpi b/components/fpspreadsheet/examples/excel8demo/excel8read.lpi
index 7f9dc1779..06e6eaccf 100644
--- a/components/fpspreadsheet/examples/excel8demo/excel8read.lpi
+++ b/components/fpspreadsheet/examples/excel8demo/excel8read.lpi
@@ -2,14 +2,14 @@
-
+
+
-
diff --git a/components/fpspreadsheet/examples/excel8demo/excel8read.lpr b/components/fpspreadsheet/examples/excel8demo/excel8read.lpr
index 76edf8103..0e04c1e26 100644
--- a/components/fpspreadsheet/examples/excel8demo/excel8read.lpr
+++ b/components/fpspreadsheet/examples/excel8demo/excel8read.lpr
@@ -40,14 +40,15 @@ begin
WriteLn('Contents of the first worksheet of the file:');
WriteLn('');
+ CurCell := MyWorkSheet.GetFirstCell();
for i := 0 to MyWorksheet.GetCellCount - 1 do
begin
- CurCell := MyWorkSheet.GetCellByIndex(i);
WriteLn('Row: ', CurCell^.Row,
' Col: ', CurCell^.Col, ' Value: ',
UTF8ToAnsi(MyWorkSheet.ReadAsUTF8Text(CurCell^.Row,
CurCell^.Col))
);
+ CurCell := MyWorkSheet.GetNextCell();
end;
// Finalization
diff --git a/components/fpspreadsheet/fpolestorage.pas b/components/fpspreadsheet/fpolestorage.pas
index c9ea1e5ec..c8b898f06 100755
--- a/components/fpspreadsheet/fpolestorage.pas
+++ b/components/fpspreadsheet/fpolestorage.pas
@@ -94,7 +94,8 @@ type
public
constructor Create;
destructor Destroy; override;
- procedure WriteOLEFile(AFileName: string; AOLEDocument: TOLEDocument; const AStreamName: UTF8String='Book');
+ procedure WriteOLEFile(AFileName: string; AOLEDocument: TOLEDocument;
+ const AOverwriteExisting: Boolean = False; const AStreamName: UTF8String='Book');
procedure ReadOLEFile(AFileName: string; AOLEDocument: TOLEDocument; const AStreamName: UTF8String='Book');
procedure FreeOLEDocumentData(AOLEDocument: TOLEDocument);
end;
@@ -690,12 +691,22 @@ end;
it should be placed doesn't exist.
}
procedure TOLEStorage.WriteOLEFile(AFileName: string;
- AOLEDocument: TOLEDocument; const AStreamName: UTF8String);
+ AOLEDocument: TOLEDocument; const AOverwriteExisting: Boolean;
+ const AStreamName: UTF8String);
var
cbWritten: Cardinal;
AFileStream: TFileStream;
i, x: Cardinal;
+ lMode: Word;
begin
+ // The behavior of LCL classes is failling to write to existing file,
+ // But here we make this settable
+ if AOverwriteExisting then lMode := fmCreate or fmOpenWrite
+ else lMode := fmCreate;
+
+ if (not AOverwriteExisting) and FileExists(AFileName) then
+ Raise EStreamError.Createfmt('File already exists "%s"',[AFileName]);
+
{ Fill information for helper routines }
FOLEDocument := AOLEDocument;
@@ -720,7 +731,7 @@ begin
{ Create a Storage Object }
OleCheck(StgCreateDocfile(PWideChar(WideString(AFileName)),
- STGM_READWRITE or STGM_FAILIFTHERE or STGM_SHARE_EXCLUSIVE or STGM_DIRECT,
+ STGM_READWRITE or STGM_CREATE or STGM_SHARE_EXCLUSIVE or STGM_DIRECT,
0, FStorage));
{ Create a workbook stream in the storage. A BIFF5 file must
@@ -735,9 +746,7 @@ begin
{$else}
- // Follows the behavior of LCL classes: Fails to write to existing file
- if FileExists(AFileName) then Raise EStreamError.Createfmt('File already exists "%s"',[AFileName]);
- AFileStream := TFileStream.Create(AFileName, fmCreate);
+ AFileStream := TFileStream.Create(AFileName, lMode);
try
// Header
WriteOLEHeader(AFileStream);
diff --git a/components/fpspreadsheet/fpsopendocument.pas b/components/fpspreadsheet/fpsopendocument.pas
index 6b0dd688f..4133a0ec1 100755
--- a/components/fpspreadsheet/fpsopendocument.pas
+++ b/components/fpspreadsheet/fpsopendocument.pas
@@ -66,7 +66,8 @@ type
public
{ General writing methods }
procedure WriteStringToFile(AString, AFileName: string);
- procedure WriteToFile(AFileName: string; AData: TsWorkbook); override;
+ procedure WriteToFile(const AFileName: string; AData: TsWorkbook;
+ const AOverwriteExisting: Boolean = False); override;
procedure WriteToStream(AStream: TStream; AData: TsWorkbook); override;
{ Record writing methods }
procedure WriteFormula(AStream: TStream; const ARow, ACol: Word; const AFormula: TsFormula); override;
@@ -459,7 +460,8 @@ end;
{
Writes an OOXML document to the disc.
}
-procedure TsSpreadOpenDocWriter.WriteToFile(AFileName: string; AData: TsWorkbook);
+procedure TsSpreadOpenDocWriter.WriteToFile(const AFileName: string;
+ AData: TsWorkbook; const AOverwriteExisting: Boolean);
var
FZip: TZipper;
begin
diff --git a/components/fpspreadsheet/fpspreadsheet.pas b/components/fpspreadsheet/fpspreadsheet.pas
index 239c83fa4..856d0f091 100755
--- a/components/fpspreadsheet/fpspreadsheet.pas
+++ b/components/fpspreadsheet/fpspreadsheet.pas
@@ -139,7 +139,9 @@ type
function CreateSpreadWriter(AFormat: TsSpreadsheetFormat): TsCustomSpreadWriter;
procedure ReadFromFile(AFileName: string; AFormat: TsSpreadsheetFormat);
procedure ReadFromStream(AStream: TStream; AFormat: TsSpreadsheetFormat);
- procedure WriteToFile(AFileName: string; AFormat: TsSpreadsheetFormat);
+ procedure WriteToFile(const AFileName: string;
+ const AFormat: TsSpreadsheetFormat;
+ const AOverwriteExisting: Boolean = False);
procedure WriteToStream(AStream: TStream; AFormat: TsSpreadsheetFormat);
{ Worksheet list handling methods }
function AddWorksheet(AName: string): TsWorksheet;
@@ -182,7 +184,8 @@ type
{ General writing methods }
procedure WriteCellCallback(data, arg: pointer);
procedure WriteCellsToStream(AStream: TStream; ACells: TAVLTree);
- procedure WriteToFile(AFileName: string; AData: TsWorkbook); virtual;
+ procedure WriteToFile(const AFileName: string; AData: TsWorkbook;
+ const AOverwriteExisting: Boolean = False); virtual;
procedure WriteToStream(AStream: TStream; AData: TsWorkbook); virtual;
{ Record writing methods }
procedure WriteFormula(AStream: TStream; const ARow, ACol: Word; const AFormula: TsFormula); virtual;
@@ -674,14 +677,15 @@ end;
If the file doesn't exist, it will be created.
}
-procedure TsWorkbook.WriteToFile(AFileName: string; AFormat: TsSpreadsheetFormat);
+procedure TsWorkbook.WriteToFile(const AFileName: string;
+ const AFormat: TsSpreadsheetFormat; const AOverwriteExisting: Boolean = False);
var
AWriter: TsCustomSpreadWriter;
begin
AWriter := CreateSpreadWriter(AFormat);
try
- AWriter.WriteToFile(AFileName, Self);
+ AWriter.WriteToFile(AFileName, Self, AOverwriteExisting);
finally
AWriter.Free;
end;
@@ -905,11 +909,16 @@ end;
@see TsWorkbook
}
-procedure TsCustomSpreadWriter.WriteToFile(AFileName: string; AData: TsWorkbook);
+procedure TsCustomSpreadWriter.WriteToFile(const AFileName: string;
+ AData: TsWorkbook; const AOverwriteExisting: Boolean = False);
var
OutputFile: TFileStream;
+ lMode: Word;
begin
- OutputFile := TFileStream.Create(AFileName, fmCreate or fmOpenWrite);
+ if AOverwriteExisting then lMode := fmCreate or fmOpenWrite
+ else lMode := fmCreate;
+
+ OutputFile := TFileStream.Create(AFileName, lMode);
try
WriteToStream(OutputFile, AData);
finally
diff --git a/components/fpspreadsheet/xlsbiff5.pas b/components/fpspreadsheet/xlsbiff5.pas
index e7df5d9b0..51edc752a 100755
--- a/components/fpspreadsheet/xlsbiff5.pas
+++ b/components/fpspreadsheet/xlsbiff5.pas
@@ -108,7 +108,8 @@ type
// constructor Create;
// destructor Destroy; override;
{ General writing methods }
- procedure WriteToFile(AFileName: string; AData: TsWorkbook); override;
+ procedure WriteToFile(const AFileName: string; AData: TsWorkbook;
+ const AOverwriteExisting: Boolean = False); override;
procedure WriteToStream(AStream: TStream; AData: TsWorkbook); override;
{ Record writing methods }
procedure WriteBOF(AStream: TStream; ADataType: Word);
@@ -278,7 +279,8 @@ end;
* COM functions
*
*******************************************************************}
-procedure TsSpreadBIFF5Writer.WriteToFile(AFileName: string; AData: TsWorkbook);
+procedure TsSpreadBIFF5Writer.WriteToFile(const AFileName: string;
+ AData: TsWorkbook; const AOverwriteExisting: Boolean);
var
MemStream: TMemoryStream;
OutputStorage: TOLEStorage;
@@ -292,7 +294,7 @@ begin
// Only one stream is necessary for any number of worksheets
OLEDocument.Stream := MemStream;
- OutputStorage.WriteOLEFile(AFileName, OLEDocument);
+ OutputStorage.WriteOLEFile(AFileName, OLEDocument, AOverwriteExisting);
finally
MemStream.Free;
OutputStorage.Free;
diff --git a/components/fpspreadsheet/xlsbiff8.pas b/components/fpspreadsheet/xlsbiff8.pas
index 069caca1d..6ff20ef26 100755
--- a/components/fpspreadsheet/xlsbiff8.pas
+++ b/components/fpspreadsheet/xlsbiff8.pas
@@ -103,7 +103,8 @@ type
// constructor Create;
// destructor Destroy; override;
{ General writing methods }
- procedure WriteToFile(AFileName: string; AData: TsWorkbook); override;
+ procedure WriteToFile(const AFileName: string; AData: TsWorkbook;
+ const AOverwriteExisting: Boolean = False); override;
procedure WriteToStream(AStream: TStream; AData: TsWorkbook); override;
{ Record writing methods }
procedure WriteBOF(AStream: TStream; ADataType: Word);
@@ -246,7 +247,8 @@ const
* COM functions
*
*******************************************************************}
-procedure TsSpreadBIFF8Writer.WriteToFile(AFileName: string; AData: TsWorkbook);
+procedure TsSpreadBIFF8Writer.WriteToFile(const AFileName: string;
+ AData: TsWorkbook; const AOverwriteExisting: Boolean);
var
MemStream: TMemoryStream;
OutputStorage: TOLEStorage;
@@ -260,7 +262,7 @@ begin
// Only one stream is necessary for any number of worksheets
OLEDocument.Stream := MemStream;
- OutputStorage.WriteOLEFile(AFileName, OLEDocument,'Workbook');
+ OutputStorage.WriteOLEFile(AFileName, OLEDocument, AOverwriteExisting, 'Workbook');
finally
MemStream.Free;
OutputStorage.Free;
diff --git a/components/fpspreadsheet/xlsxooxml.pas b/components/fpspreadsheet/xlsxooxml.pas
index b3f526c6f..a22c19b48 100755
--- a/components/fpspreadsheet/xlsxooxml.pas
+++ b/components/fpspreadsheet/xlsxooxml.pas
@@ -59,7 +59,8 @@ type
destructor Destroy; override;
{ General writing methods }
procedure WriteStringToFile(AFileName, AString: string);
- procedure WriteToFile(AFileName: string; AData: TsWorkbook); override;
+ procedure WriteToFile(const AFileName: string; AData: TsWorkbook;
+ const AOverwriteExisting: Boolean = False); override;
procedure WriteToStream(AStream: TStream; AData: TsWorkbook); override;
{ Record writing methods }
procedure WriteLabel(AStream: TStream; const ARow, ACol: Word; const AValue: string); override;
@@ -314,7 +315,8 @@ end;
{
Writes an OOXML document to the disc
}
-procedure TsSpreadOOXMLWriter.WriteToFile(AFileName: string; AData: TsWorkbook);
+procedure TsSpreadOOXMLWriter.WriteToFile(const AFileName: string;
+ AData: TsWorkbook; const AOverwriteExisting: Boolean);
var
FZip: TZipper;
i: Integer;