diff --git a/components/fpspreadsheet/tests/internaltests.pas b/components/fpspreadsheet/tests/internaltests.pas
index d28c998d6..33994e031 100644
--- a/components/fpspreadsheet/tests/internaltests.pas
+++ b/components/fpspreadsheet/tests/internaltests.pas
@@ -34,7 +34,7 @@ type
// Set up expected values:
procedure SetUp; override;
procedure TearDown; override;
- procedure TestVirtualMode(AFormat: TsSpreadsheetFormat);
+ procedure TestVirtualMode(AFormat: TsSpreadsheetFormat; SaveMemoryMode: Boolean);
published
// Tests getting Excel style A1 cell locations from row/column based locations.
// Bug 26447
@@ -55,12 +55,17 @@ type
procedure TestVirtualMode_BIFF5;
procedure TestVirtualMode_BIFF8;
procedure TestVirtualMode_OOXML;
+
+ procedure TestVirtualMode_BIFF2_SaveMemory;
+ procedure TestVirtualMode_BIFF5_SaveMemory;
+ procedure TestVirtualMode_BIFF8_SaveMemory;
+ procedure TestVirtualMode_OOXML_SaveMemory;
end;
implementation
uses
- numberstests;
+ numberstests, stringtests;
const
InternalSheet = 'Internal'; //worksheet name
@@ -178,7 +183,9 @@ begin
CheckEquals('$AA$2',GetCellString(1,26,[])); //just past the last letter
CheckEquals('$GW$5',GetCellString(4,204,[])); //some big value
CheckEquals('$IV$1',GetCellString(0,255,[])); //the last column of xls
+ CheckEquals('$IW$1',GetCellString(0,256,[])); //the first column beyond xls
CheckEquals('$XFD$1',GetCellString(0,16383,[])); // the last column of xlsx
+ CheckEquals('$XFE$1',GetCellString(0,16384,[])); // the first column beyond xlsx
// Something VERY big, beyond xlsx
s := 'ZZZZ1';
@@ -199,18 +206,25 @@ end;
procedure TSpreadInternalTests.NeedVirtualCellData(Sender: TObject;
ARow, ACol: Cardinal; var AValue:Variant; var AStyleCell: PCell);
begin
- AValue := SollNumbers[ARow];
+ // First read the SollNumbers, then the first 4 SollStrings
+ // See comment in TestVirtualMode().
+ if ARow < Length(SollNumbers) then
+ AValue := SollNumbers[ARow]
+ else
+ AValue := SollStrings[ARow - Length(SollNumbers)];
end;
-procedure TSpreadInternalTests.TestVirtualMode(AFormat: TsSpreadsheetFormat);
+procedure TSpreadInternalTests.TestVirtualMode(AFormat: TsSpreadsheetFormat;
+ SaveMemoryMode: Boolean);
var
tempFile: String;
workbook: TsWorkbook;
worksheet: TsWorksheet;
row, col: Integer;
value: Double;
+ s: String;
begin
- TempFile:=GetTempFileName;
+ TempFile := GetTempFileName;
if FileExists(TempFile) then
DeleteFile(TempFile);
@@ -218,10 +232,13 @@ begin
try
worksheet := workbook.AddWorksheet('VirtualMode');
workbook.WritingOptions := workbook.WritingOptions + [woVirtualMode];
- workbook.VirtualRowCount := Length(SollNumbers);
+ if SaveMemoryMode then
+ workbook.WritingOptions := workbook.WritingOptions + [woSaveMemory];
workbook.VirtualColCount := 1;
+ workbook.VirtualRowCount := Length(SollNumbers) + 4;
+ // We'll use only the first 4 SollStrings, the others cause trouble due to utf8 and formatting.
workbook.OnNeedCellData := @NeedVirtualCellData;
- workbook.WriteToFile(tempfile, AFormat);
+ workbook.WriteToFile(tempfile, AFormat, true);
finally
workbook.Free;
end;
@@ -232,13 +249,18 @@ begin
workbook.ReadFromFile(tempFile, AFormat);
worksheet := workbook.GetWorksheetByIndex(0);
col := 0;
- CheckEquals(Length(SollNumbers), worksheet.GetLastRowIndex+1,
+ CheckEquals(Length(SollNumbers) + 4, worksheet.GetLastRowIndex+1,
'Row count mismatch');
- for row := 0 to worksheet.GetLastRowIndex do begin
+ for row := 0 to Length(SollNumbers)-1 do begin
value := worksheet.ReadAsNumber(row, col);
CheckEquals(SollNumbers[row], value,
'Test number value mismatch, cell '+CellNotation(workSheet, row, col))
end;
+ for row := Length(SollNumbers) to worksheet.GetLastRowIndex do begin
+ s := worksheet.ReadAsUTF8Text(row, col);
+ CheckEquals(SollStrings[row - Length(SollNumbers)], s,
+ 'Test string value mismatch, cell '+CellNotation(workSheet, row, col));
+ end;
finally
workbook.Free;
end;
@@ -249,22 +271,42 @@ end;
procedure TSpreadInternalTests.TestVirtualMode_BIFF2;
begin
- TestVirtualMode(sfExcel2);
+ TestVirtualMode(sfExcel2, false);
end;
procedure TSpreadInternalTests.TestVirtualMode_BIFF5;
begin
- TestVirtualMode(sfExcel5);
+ TestVirtualMode(sfExcel5, false);
end;
procedure TSpreadInternalTests.TestVirtualMode_BIFF8;
begin
- TestVirtualMode(sfExcel8);
+ TestVirtualMode(sfExcel8, false);
end;
procedure TSpreadInternalTests.TestVirtualMode_OOXML;
begin
- TestVirtualMode(sfOOXML);
+ TestVirtualMode(sfOOXML, false);
+end;
+
+procedure TSpreadInternalTests.TestVirtualMode_BIFF2_SaveMemory;
+begin
+ TestVirtualMode(sfExcel2, True);
+end;
+
+procedure TSpreadInternalTests.TestVirtualMode_BIFF5_SaveMemory;
+begin
+ TestVirtualMode(sfExcel5, true);
+end;
+
+procedure TSpreadInternalTests.TestVirtualMode_BIFF8_SaveMemory;
+begin
+ TestVirtualMode(sfExcel8, true);
+end;
+
+procedure TSpreadInternalTests.TestVirtualMode_OOXML_SaveMemory;
+begin
+ TestVirtualMode(sfOOXML, true);
end;
initialization
diff --git a/components/fpspreadsheet/tests/spreadtestgui.lpi b/components/fpspreadsheet/tests/spreadtestgui.lpi
index 1166ff9e0..cbbbad4a0 100644
--- a/components/fpspreadsheet/tests/spreadtestgui.lpi
+++ b/components/fpspreadsheet/tests/spreadtestgui.lpi
@@ -84,16 +84,15 @@
+
-
-
@@ -107,7 +106,6 @@
-
@@ -128,7 +126,6 @@
-
@@ -138,7 +135,6 @@
-
diff --git a/components/fpspreadsheet/xlsbiff8.pas b/components/fpspreadsheet/xlsbiff8.pas
index bbf02277f..11f0b87af 100755
--- a/components/fpspreadsheet/xlsbiff8.pas
+++ b/components/fpspreadsheet/xlsbiff8.pas
@@ -364,7 +364,8 @@ var
fn: String;
begin
if (woSaveMemory in Workbook.WritingOptions) then begin
- fn := GetTempFileName;
+ fn := GetTempFileName('', 'fpsB8');
+ if FileExists(fn) then DeleteFile(fn);
Stream := TFileStream.Create(fn, fmCreate + fmOpenRead)
end else
Stream := TMemoryStream.Create;
@@ -378,6 +379,8 @@ begin
OutputStorage.WriteOLEFile(AFileName, OLEDocument, AOverwriteExisting, 'Workbook');
finally
+ if (woSaveMemory in Workbook.WritingOptions) then
+ DeleteFile(fn);
Stream.Free;
OutputStorage.Free;
end;