diff --git a/components/fpspreadsheet/tests/pagelayouttests.pas b/components/fpspreadsheet/tests/pagelayouttests.pas index 5411dc7cc..25628b70c 100644 --- a/components/fpspreadsheet/tests/pagelayouttests.pas +++ b/components/fpspreadsheet/tests/pagelayouttests.pas @@ -24,85 +24,138 @@ type // Set up expected values: procedure SetUp; override; procedure TearDown; override; + procedure TestWriteRead_PageLayout(AFormat: TsSpreadsheetFormat; ANumSheets, ATestMode: Integer); procedure TestWriteRead_PageMargins(AFormat: TsSpreadsheetFormat; ANumSheets, AHeaderFooterMode: Integer); published { BIFF2 page layout tests } - procedure TestWriteRead_PageMargins_BIFF2_1sheet_0; - procedure TestWriteRead_PageMargins_BIFF2_1sheet_1; - procedure TestWriteRead_PageMargins_BIFF2_1sheet_2; - procedure TestWriteRead_PageMargins_BIFF2_1sheet_3; - procedure TestWriteRead_PageMargins_BIFF2_2sheets_0; - procedure TestWriteRead_PageMargins_BIFF2_2sheets_1; - procedure TestWriteRead_PageMargins_BIFF2_2sheets_2; - procedure TestWriteRead_PageMargins_BIFF2_2sheets_3; - procedure TestWriteRead_PageMargins_BIFF2_3sheets_0; - procedure TestWriteRead_PageMargins_BIFF2_3sheets_1; - procedure TestWriteRead_PageMargins_BIFF2_3sheets_2; - procedure TestWriteRead_PageMargins_BIFF2_3sheets_3; + procedure TestWriteRead_BIFF2_PageMargins_1sheet_0; + procedure TestWriteRead_BIFF2_PageMargins_1sheet_1; + procedure TestWriteRead_BIFF2_PageMargins_1sheet_2; + procedure TestWriteRead_BIFF2_PageMargins_1sheet_3; + procedure TestWriteRead_BIFF2_PageMargins_2sheets_0; + procedure TestWriteRead_BIFF2_PageMargins_2sheets_1; + procedure TestWriteRead_BIFF2_PageMargins_2sheets_2; + procedure TestWriteRead_BIFF2_PageMargins_2sheets_3; + procedure TestWriteRead_BIFF2_PageMargins_3sheets_0; + procedure TestWriteRead_BIFF2_PageMargins_3sheets_1; + procedure TestWriteRead_BIFF2_PageMargins_3sheets_2; + procedure TestWriteRead_BIFF2_PageMargins_3sheets_3; + + // no BIFF2 page orientation tests because this info is not readily available in the file + { BIFF5 page layout tests } - procedure TestWriteRead_PageMargins_BIFF5_1sheet_0; - procedure TestWriteRead_PageMargins_BIFF5_1sheet_1; - procedure TestWriteRead_PageMargins_BIFF5_1sheet_2; - procedure TestWriteRead_PageMargins_BIFF5_1sheet_3; - procedure TestWriteRead_PageMargins_BIFF5_2sheets_0; - procedure TestWriteRead_PageMargins_BIFF5_2sheets_1; - procedure TestWriteRead_PageMargins_BIFF5_2sheets_2; - procedure TestWriteRead_PageMargins_BIFF5_2sheets_3; - procedure TestWriteRead_PageMargins_BIFF5_3sheets_0; - procedure TestWriteRead_PageMargins_BIFF5_3sheets_1; - procedure TestWriteRead_PageMargins_BIFF5_3sheets_2; - procedure TestWriteRead_PageMargins_BIFF5_3sheets_3; + procedure TestWriteRead_BIFF5_PageMargins_1sheet_0; + procedure TestWriteRead_BIFF5_PageMargins_1sheet_1; + procedure TestWriteRead_BIFF5_PageMargins_1sheet_2; + procedure TestWriteRead_BIFF5_PageMargins_1sheet_3; + procedure TestWriteRead_BIFF5_PageMargins_2sheets_0; + procedure TestWriteRead_BIFF5_PageMargins_2sheets_1; + procedure TestWriteRead_BIFF5_PageMargins_2sheets_2; + procedure TestWriteRead_BIFF5_PageMargins_2sheets_3; + procedure TestWriteRead_BIFF5_PageMargins_3sheets_0; + procedure TestWriteRead_BIFF5_PageMargins_3sheets_1; + procedure TestWriteRead_BIFF5_PageMargins_3sheets_2; + procedure TestWriteRead_BIFF5_PageMargins_3sheets_3; + + procedure TestWriteRead_BIFF5_PageOrientation_1sheet; + procedure TestWriteRead_BIFF5_PageOrientation_2sheets; + procedure TestWriteRead_BIFF5_PageOrientation_3sheets; + + procedure TestWriteRead_BIFF5_PaperSize_1sheet; + procedure TestWriteRead_BIFF5_PaperSize_2sheets; + procedure TestWriteRead_BIFF5_PaperSize_3sheets; + + procedure TestWriteRead_BIFF5_ScalingFactor_1sheet; + procedure TestWriteRead_BIFF5_ScalingFactor_2sheets; + procedure TestWriteRead_BIFF5_ScalingFactor_3sheets; { BIFF8 page layout tests } - procedure TestWriteRead_PageMargins_BIFF8_1sheet_0; - procedure TestWriteRead_PageMargins_BIFF8_1sheet_1; - procedure TestWriteRead_PageMargins_BIFF8_1sheet_2; - procedure TestWriteRead_PageMargins_BIFF8_1sheet_3; - procedure TestWriteRead_PageMargins_BIFF8_2sheets_0; - procedure TestWriteRead_PageMargins_BIFF8_2sheets_1; - procedure TestWriteRead_PageMargins_BIFF8_2sheets_2; - procedure TestWriteRead_PageMargins_BIFF8_2sheets_3; - procedure TestWriteRead_PageMargins_BIFF8_3sheets_0; - procedure TestWriteRead_PageMargins_BIFF8_3sheets_1; - procedure TestWriteRead_PageMargins_BIFF8_3sheets_2; - procedure TestWriteRead_PageMargins_BIFF8_3sheets_3; + procedure TestWriteRead_BIFF8_PageMargins_1sheet_0; + procedure TestWriteRead_BIFF8_PageMargins_1sheet_1; + procedure TestWriteRead_BIFF8_PageMargins_1sheet_2; + procedure TestWriteRead_BIFF8_PageMargins_1sheet_3; + procedure TestWriteRead_BIFF8_PageMargins_2sheets_0; + procedure TestWriteRead_BIFF8_PageMargins_2sheets_1; + procedure TestWriteRead_BIFF8_PageMargins_2sheets_2; + procedure TestWriteRead_BIFF8_PageMargins_2sheets_3; + procedure TestWriteRead_BIFF8_PageMargins_3sheets_0; + procedure TestWriteRead_BIFF8_PageMargins_3sheets_1; + procedure TestWriteRead_BIFF8_PageMargins_3sheets_2; + procedure TestWriteRead_BIFF8_PageMargins_3sheets_3; + + procedure TestWriteRead_BIFF8_PageOrientation_1sheet; + procedure TestWriteRead_BIFF8_PageOrientation_2sheets; + procedure TestWriteRead_BIFF8_PageOrientation_3sheets; + + procedure TestWriteRead_BIFF8_PaperSize_1sheet; + procedure TestWriteRead_BIFF8_PaperSize_2sheets; + procedure TestWriteRead_BIFF8_PaperSize_3sheets; + + procedure TestWriteRead_BIFF8_ScalingFactor_1sheet; + procedure TestWriteRead_BIFF8_ScalingFactor_2sheets; + procedure TestWriteRead_BIFF8_ScalingFactor_3sheets; { OOXML page layout tests } - procedure TestWriteRead_PageMargins_OOXML_1sheet_0; - procedure TestWriteRead_PageMargins_OOXML_1sheet_1; - procedure TestWriteRead_PageMargins_OOXML_1sheet_2; - procedure TestWriteRead_PageMargins_OOXML_1sheet_3; - procedure TestWriteRead_PageMargins_OOXML_2sheets_0; - procedure TestWriteRead_PageMargins_OOXML_2sheets_1; - procedure TestWriteRead_PageMargins_OOXML_2sheets_2; - procedure TestWriteRead_PageMargins_OOXML_2sheets_3; - procedure TestWriteRead_PageMargins_OOXML_3sheets_0; - procedure TestWriteRead_PageMargins_OOXML_3sheets_1; - procedure TestWriteRead_PageMargins_OOXML_3sheets_2; - procedure TestWriteRead_PageMargins_OOXML_3sheets_3; + procedure TestWriteRead_OOXML_PageMargins_1sheet_0; + procedure TestWriteRead_OOXML_PageMargins_1sheet_1; + procedure TestWriteRead_OOXML_PageMargins_1sheet_2; + procedure TestWriteRead_OOXML_PageMargins_1sheet_3; + procedure TestWriteRead_OOXML_PageMargins_2sheets_0; + procedure TestWriteRead_OOXML_PageMargins_2sheets_1; + procedure TestWriteRead_OOXML_PageMargins_2sheets_2; + procedure TestWriteRead_OOXML_PageMargins_2sheets_3; + procedure TestWriteRead_OOXML_PageMargins_3sheets_0; + procedure TestWriteRead_OOXML_PageMargins_3sheets_1; + procedure TestWriteRead_OOXML_PageMargins_3sheets_2; + procedure TestWriteRead_OOXML_PageMargins_3sheets_3; + + procedure TestWriteRead_OOXML_PageOrientation_1sheet; + procedure TestWriteRead_OOXML_PageOrientation_2sheets; + procedure TestWriteRead_OOXML_PageOrientation_3sheets; + + procedure TestWriteRead_OOXML_PaperSize_1sheet; + procedure TestWriteRead_OOXML_PaperSize_2sheets; + procedure TestWriteRead_OOXML_PaperSize_3sheets; + + procedure TestWriteRead_OOXML_ScalingFactor_1sheet; + procedure TestWriteRead_OOXML_ScalingFactor_2sheets; + procedure TestWriteRead_OOXML_ScalingFactor_3sheets; { OpenDocument page layout tests } - procedure TestWriteRead_PageMargins_ODS_1sheet_0; - procedure TestWriteRead_PageMargins_ODS_1sheet_1; - procedure TestWriteRead_PageMargins_ODS_1sheet_2; - procedure TestWriteRead_PageMargins_ODS_1sheet_3; - procedure TestWriteRead_PageMargins_ODS_2sheets_0; - procedure TestWriteRead_PageMargins_ODS_2sheets_1; - procedure TestWriteRead_PageMargins_ODS_2sheets_2; - procedure TestWriteRead_PageMargins_ODS_2sheets_3; - procedure TestWriteRead_PageMargins_ODS_3sheets_0; - procedure TestWriteRead_PageMargins_ODS_3sheets_1; - procedure TestWriteRead_PageMargins_ODS_3sheets_2; - procedure TestWriteRead_PageMargins_ODS_3sheets_3; + procedure TestWriteRead_ODS_PageMargins_1sheet_0; + procedure TestWriteRead_ODS_PageMargins_1sheet_1; + procedure TestWriteRead_ODS_PageMargins_1sheet_2; + procedure TestWriteRead_ODS_PageMargins_1sheet_3; + procedure TestWriteRead_ODS_PageMargins_2sheets_0; + procedure TestWriteRead_ODS_PageMargins_2sheets_1; + procedure TestWriteRead_ODS_PageMargins_2sheets_2; + procedure TestWriteRead_ODS_PageMargins_2sheets_3; + procedure TestWriteRead_ODS_PageMargins_3sheets_0; + procedure TestWriteRead_ODS_PageMargins_3sheets_1; + procedure TestWriteRead_ODS_PageMargins_3sheets_2; + procedure TestWriteRead_ODS_PageMargins_3sheets_3; + + procedure TestWriteRead_ODS_PageOrientation_1sheet; + procedure TestWriteRead_ODS_PageOrientation_2sheets; + procedure TestWriteRead_ODS_PageOrientation_3sheets; + + procedure TestWriteRead_ODS_PaperSize_1sheet; + procedure TestWriteRead_ODS_PaperSize_2sheets; + procedure TestWriteRead_ODS_PaperSize_3sheets; + + procedure TestWriteRead_ODS_ScalingFactor_1sheet; + procedure TestWriteRead_ODS_ScalingFactor_2sheets; + procedure TestWriteRead_ODS_ScalingFactor_3sheets; end; implementation uses - uriparser, lazfileutils, fpsutils; + typinfo, fpsutils; +// uriparser, lazfileutils, fpsutils; const PageLayoutSheet = 'PageLayout'; @@ -122,8 +175,8 @@ end; { AHeaderFooterMode = 0 ... no header, no footer 1 ... header, no footer - 2 ... no header, footer - 3 ... header, footer } + 2 ... no header, footer + 3 ... header, footer } procedure TSpreadWriteReadPageLayoutTests.TestWriteRead_PageMargins( AFormat: TsSpreadsheetFormat; ANumSheets, AHeaderFooterMode: Integer); var @@ -202,331 +255,625 @@ begin end; end; +{ ------------------------------------------------------------------------------ + Main page layout test: it writes a file with a specific page layout and reads it + back. The written pagelayout ("Solllayout") must match the read pagelayout. -{ Tests for BIFF8 file format } + ATestMode: + 0 - Landscape page orientation for sheets 0 und 2, sheet 1 is portrait + 1 - Paper size: sheet 1 "Letter" (8.5" x 11"), sheets 0 and 2 "A5" (148 mm x 210 mm) + 2 - Scaling factor: sheet 1 50%, sheet 2 200%, sheet 3 100% +-------------------------------------------------------------------------------} +procedure TSpreadWriteReadPageLayoutTests.TestWriteRead_PageLayout( + AFormat: TsSpreadsheetFormat; ANumSheets, ATestMode: Integer); +var + MyWorksheet: TsWorksheet; + MyWorkbook: TsWorkbook; + row, col, p: Integer; + sollPageLayout: Array of TsPageLayout; + actualPageLayout: TsPageLayout; + TempFile: string; //write xls/xml to this file and read back from it +begin + TempFile := GetTempFileName; -procedure TSpreadWriteReadPageLayoutTests.TestWriteRead_PageMargins_BIFF2_1sheet_0; + SetLength(SollPageLayout, ANumSheets); + for p:=0 to High(SollPageLayout) do + begin + InitPageLayout(sollPageLayout[p]); + with SollPageLayout[p] do + begin + case ATestMode of + 0: // Page orientation test: sheets 0 and 2 are portrait, sheet 1 is landscape + if p <> 1 then Orientation := spoLandscape; + 1: // Paper size test: sheets 0 and 2 are A5, sheet 1 is LETTER + if odd(p) then + begin + PageWidth := 8.5*2.54; PageHeight := 11*2.54; + end else + begin + PageWidth := 148; PageHeight := 210; + end; + 2: // Scaling factor: sheet 1 50%, sheet 2 200%, sheet 3 100% + begin + if p = 0 then ScalingFactor := 50 else + if p = 1 then ScalingFactor := 200; + Exclude(Options, poFitPages); + end; + end; + end; + end; + + MyWorkbook := TsWorkbook.Create; + try + col := 0; + for p := 0 to ANumSheets-1 do + begin + MyWorkSheet:= MyWorkBook.AddWorksheet(PageLayoutSheet+IntToStr(p+1)); + for row := 0 to 99 do + Myworksheet.WriteNumber(row, 0, (row+1)+(col+1)*100+(p+1)*10000 ); + MyWorksheet.PageLayout := SollPageLayout[p]; + end; + MyWorkBook.WriteToFile(TempFile, AFormat, true); + finally + MyWorkbook.Free; + end; + + // Open the spreadsheet + MyWorkbook := TsWorkbook.Create; + try + MyWorkbook.ReadFromFile(TempFile, AFormat); + for p := 0 to MyWorkbook.GetWorksheetCount-1 do + begin + MyWorksheet := MyWorkBook.GetWorksheetByIndex(p); + if MyWorksheet=nil then + fail('Error in test code. Failed to get worksheet by index'); + + actualPageLayout := MyWorksheet.PageLayout; + case ATestMode of + 0: // Page orientation test + CheckEquals(GetEnumName(TypeInfo(TsPageOrientation), ord(sollPageLayout[p].Orientation)), + GetEnumName(TypeInfo(TsPageOrientation), ord(actualPageLayout.Orientation)), + 'Page orientation mismatch, sheet "'+MyWorksheet.Name+'"' + ); + 1: // Paper size test + begin + CheckEquals(sollPagelayout[p].PageHeight, actualPageLayout.PageHeight, 0.1, + 'Page height mismatch, sheet "' + MyWorksheet.Name + '"'); + CheckEquals(sollPageLayout[p].PageWidth, actualPageLayout.PageWidth, 0.1, + 'Page width mismatch, sheet "' + MyWorksheet.name + '"'); + end; + 2: // Scaling factor + begin + CheckEquals(poFitPages in sollPageLayout[p].Options, poFitPages in actualPageLayout.Options, + '"poFitPages" option mismatch, sheet "' + MyWorksheet.name + '"'); + CheckEquals(sollPageLayout[p].ScalingFactor, actualPageLayout.ScalingFactor, + 'Scaling factor mismatch, sheet "' + MyWorksheet.Name + '"'); + end; + end; + end; + + finally + MyWorkbook.Free; + DeleteFile(TempFile); + end; +end; + + +{ Tests for BIFF2 file format } + +procedure TSpreadWriteReadPageLayoutTests.TestWriteRead_BIFF2_PageMargins_1sheet_0; begin TestWriteRead_PageMargins(sfExcel2, 1, 0); end; -procedure TSpreadWriteReadPageLayoutTests.TestWriteRead_PageMargins_BIFF2_1sheet_1; +procedure TSpreadWriteReadPageLayoutTests.TestWriteRead_BIFF2_PageMargins_1sheet_1; begin TestWriteRead_PageMargins(sfExcel2, 1, 1); end; -procedure TSpreadWriteReadPageLayoutTests.TestWriteRead_PageMargins_BIFF2_1sheet_2; +procedure TSpreadWriteReadPageLayoutTests.TestWriteRead_BIFF2_PageMargins_1sheet_2; begin TestWriteRead_PageMargins(sfExcel2, 1, 2); end; -procedure TSpreadWriteReadPageLayoutTests.TestWriteRead_PageMargins_BIFF2_1sheet_3; +procedure TSpreadWriteReadPageLayoutTests.TestWriteRead_BIFF2_PageMargins_1sheet_3; begin TestWriteRead_PageMargins(sfExcel2, 1, 3); end; -procedure TSpreadWriteReadPagelayoutTests.TestWriteRead_PageMargins_BIFF2_2sheets_0; +procedure TSpreadWriteReadPagelayoutTests.TestWriteRead_BIFF2_PageMargins_2sheets_0; begin TestWriteRead_PageMargins(sfExcel2, 2, 0); end; -procedure TSpreadWriteReadPageLayoutTests.TestWriteRead_PageMargins_BIFF2_2sheets_1; +procedure TSpreadWriteReadPageLayoutTests.TestWriteRead_BIFF2_PageMargins_2sheets_1; begin TestWriteRead_PageMargins(sfExcel2, 2, 1); end; -procedure TSpreadWriteReadPageLayoutTests.TestWriteRead_PageMargins_BIFF2_2sheets_2; +procedure TSpreadWriteReadPageLayoutTests.TestWriteRead_BIFF2_PageMargins_2sheets_2; begin TestWriteRead_PageMargins(sfExcel2, 2, 2); end; -procedure TSpreadWriteReadPageLayoutTests.TestWriteRead_PageMargins_BIFF2_2sheets_3; +procedure TSpreadWriteReadPageLayoutTests.TestWriteRead_BIFF2_PageMargins_2sheets_3; begin TestWriteRead_PageMargins(sfExcel2, 2, 3); end; -procedure TSpreadWriteReadPageLayoutTests.TestWriteRead_PageMargins_BIFF2_3sheets_0; +procedure TSpreadWriteReadPageLayoutTests.TestWriteRead_BIFF2_PageMargins_3sheets_0; begin TestWriteRead_PageMargins(sfExcel2, 3, 0); end; -procedure TSpreadWriteReadPageLayoutTests.TestWriteRead_PageMargins_BIFF2_3sheets_1; +procedure TSpreadWriteReadPageLayoutTests.TestWriteRead_BIFF2_PageMargins_3sheets_1; begin TestWriteRead_PageMargins(sfExcel2, 3, 1); end; -procedure TSpreadWriteReadPageLayoutTests.TestWriteRead_PageMargins_BIFF2_3sheets_2; +procedure TSpreadWriteReadPageLayoutTests.TestWriteRead_BIFF2_PageMargins_3sheets_2; begin TestWriteRead_PageMargins(sfExcel2, 3, 2); end; -procedure TSpreadWriteReadPageLayoutTests.TestWriteRead_PageMargins_BIFF2_3sheets_3; +procedure TSpreadWriteReadPageLayoutTests.TestWriteRead_BIFF2_PageMargins_3sheets_3; begin TestWriteRead_PageMargins(sfExcel2, 3, 3); end; -{ Tests for BIFF8 file format } -procedure TSpreadWriteReadPageLayoutTests.TestWriteRead_PageMargins_BIFF5_1sheet_0; +{ Tests for BIFF5 file format } + +procedure TSpreadWriteReadPageLayoutTests.TestWriteRead_BIFF5_PageMargins_1sheet_0; begin TestWriteRead_PageMargins(sfExcel5, 1, 0); end; -procedure TSpreadWriteReadPageLayoutTests.TestWriteRead_PageMargins_BIFF5_1sheet_1; +procedure TSpreadWriteReadPageLayoutTests.TestWriteRead_BIFF5_PageMargins_1sheet_1; begin TestWriteRead_PageMargins(sfExcel5, 1, 1); end; -procedure TSpreadWriteReadPageLayoutTests.TestWriteRead_PageMargins_BIFF5_1sheet_2; +procedure TSpreadWriteReadPageLayoutTests.TestWriteRead_BIFF5_PageMargins_1sheet_2; begin TestWriteRead_PageMargins(sfExcel5, 1, 2); end; -procedure TSpreadWriteReadPageLayoutTests.TestWriteRead_PageMargins_BIFF5_1sheet_3; +procedure TSpreadWriteReadPageLayoutTests.TestWriteRead_BIFF5_PageMargins_1sheet_3; begin TestWriteRead_PageMargins(sfExcel5, 1, 3); end; -procedure TSpreadWriteReadPagelayoutTests.TestWriteRead_PageMargins_BIFF5_2sheets_0; +procedure TSpreadWriteReadPagelayoutTests.TestWriteRead_BIFF5_PageMargins_2sheets_0; begin TestWriteRead_PageMargins(sfExcel5, 2, 0); end; -procedure TSpreadWriteReadPageLayoutTests.TestWriteRead_PageMargins_BIFF5_2sheets_1; +procedure TSpreadWriteReadPageLayoutTests.TestWriteRead_BIFF5_PageMargins_2sheets_1; begin TestWriteRead_PageMargins(sfExcel5, 2, 1); end; -procedure TSpreadWriteReadPageLayoutTests.TestWriteRead_PageMargins_BIFF5_2sheets_2; +procedure TSpreadWriteReadPageLayoutTests.TestWriteRead_BIFF5_PageMargins_2sheets_2; begin TestWriteRead_PageMargins(sfExcel5, 2, 2); end; -procedure TSpreadWriteReadPageLayoutTests.TestWriteRead_PageMargins_BIFF5_2sheets_3; +procedure TSpreadWriteReadPageLayoutTests.TestWriteRead_BIFF5_PageMargins_2sheets_3; begin TestWriteRead_PageMargins(sfExcel5, 2, 3); end; -procedure TSpreadWriteReadPageLayoutTests.TestWriteRead_PageMargins_BIFF5_3sheets_0; +procedure TSpreadWriteReadPageLayoutTests.TestWriteRead_BIFF5_PageMargins_3sheets_0; begin TestWriteRead_PageMargins(sfExcel5, 3, 0); end; -procedure TSpreadWriteReadPageLayoutTests.TestWriteRead_PageMargins_BIFF5_3sheets_1; +procedure TSpreadWriteReadPageLayoutTests.TestWriteRead_BIFF5_PageMargins_3sheets_1; begin TestWriteRead_PageMargins(sfExcel5, 3, 1); end; -procedure TSpreadWriteReadPageLayoutTests.TestWriteRead_PageMargins_BIFF5_3sheets_2; +procedure TSpreadWriteReadPageLayoutTests.TestWriteRead_BIFF5_PageMargins_3sheets_2; begin TestWriteRead_PageMargins(sfExcel5, 3, 2); end; -procedure TSpreadWriteReadPageLayoutTests.TestWriteRead_PageMargins_BIFF5_3sheets_3; +procedure TSpreadWriteReadPageLayoutTests.TestWriteRead_BIFF5_PageMargins_3sheets_3; begin TestWriteRead_PageMargins(sfExcel5, 3, 3); end; +procedure TSpreadWriteReadPageLayoutTests.TestWriteRead_BIFF5_PageOrientation_1sheet; +begin + TestWriteRead_PageLayout(sfExcel5, 1, 0); +end; + +procedure TSpreadWriteReadPageLayoutTests.TestWriteRead_BIFF5_PageOrientation_2sheets; +begin + TestWriteRead_PageLayout(sfExcel5, 2, 0); +end; + +procedure TSpreadWriteReadPageLayoutTests.TestWriteRead_BIFF5_PageOrientation_3sheets; +begin + TestWriteRead_PageLayout(sfExcel5, 3, 0); +end; + + +procedure TSpreadWriteReadPageLayoutTests.TestWriteRead_BIFF5_PaperSize_1sheet; +begin + TestWriteRead_PageLayout(sfExcel5, 1, 1); +end; + +procedure TSpreadWriteReadPageLayoutTests.TestWriteRead_BIFF5_PaperSize_2sheets; +begin + TestWriteRead_PageLayout(sfExcel5, 2, 1); +end; + +procedure TSpreadWriteReadPageLayoutTests.TestWriteRead_BIFF5_PaperSize_3sheets; +begin + TestWriteRead_PageLayout(sfExcel5, 3, 1); +end; + + +procedure TSpreadWriteReadPageLayoutTests.TestWriteRead_BIFF5_ScalingFactor_1sheet; +begin + TestWriteRead_PageLayout(sfExcel5, 1, 2); +end; + +procedure TSpreadWriteReadPageLayoutTests.TestWriteRead_BIFF5_ScalingFactor_2sheets; +begin + TestWriteRead_PageLayout(sfExcel5, 2, 2); +end; + +procedure TSpreadWriteReadPageLayoutTests.TestWriteRead_BIFF5_ScalingFactor_3sheets; +begin + TestWriteRead_PageLayout(sfExcel5, 3, 2); +end; + { Tests for BIFF8 file format } -procedure TSpreadWriteReadPageLayoutTests.TestWriteRead_PageMargins_BIFF8_1sheet_0; +procedure TSpreadWriteReadPageLayoutTests.TestWriteRead_BIFF8_PageMargins_1sheet_0; begin TestWriteRead_PageMargins(sfExcel8, 1, 0); end; -procedure TSpreadWriteReadPageLayoutTests.TestWriteRead_PageMargins_BIFF8_1sheet_1; +procedure TSpreadWriteReadPageLayoutTests.TestWriteRead_BIFF8_PageMargins_1sheet_1; begin TestWriteRead_PageMargins(sfExcel8, 1, 1); end; -procedure TSpreadWriteReadPageLayoutTests.TestWriteRead_PageMargins_BIFF8_1sheet_2; +procedure TSpreadWriteReadPageLayoutTests.TestWriteRead_BIFF8_PageMargins_1sheet_2; begin TestWriteRead_PageMargins(sfExcel8, 1, 2); end; -procedure TSpreadWriteReadPageLayoutTests.TestWriteRead_PageMargins_BIFF8_1sheet_3; +procedure TSpreadWriteReadPageLayoutTests.TestWriteRead_BIFF8_PageMargins_1sheet_3; begin TestWriteRead_PageMargins(sfExcel8, 1, 3); end; -procedure TSpreadWriteReadPagelayoutTests.TestWriteRead_PageMargins_BIFF8_2sheets_0; +procedure TSpreadWriteReadPagelayoutTests.TestWriteRead_BIFF8_PageMargins_2sheets_0; begin TestWriteRead_PageMargins(sfExcel8, 2, 0); end; -procedure TSpreadWriteReadPageLayoutTests.TestWriteRead_PageMargins_BIFF8_2sheets_1; +procedure TSpreadWriteReadPageLayoutTests.TestWriteRead_BIFF8_PageMargins_2sheets_1; begin TestWriteRead_PageMargins(sfExcel8, 2, 1); end; -procedure TSpreadWriteReadPageLayoutTests.TestWriteRead_PageMargins_BIFF8_2sheets_2; +procedure TSpreadWriteReadPageLayoutTests.TestWriteRead_BIFF8_PageMargins_2sheets_2; begin TestWriteRead_PageMargins(sfExcel8, 2, 2); end; -procedure TSpreadWriteReadPageLayoutTests.TestWriteRead_PageMargins_BIFF8_2sheets_3; +procedure TSpreadWriteReadPageLayoutTests.TestWriteRead_BIFF8_PageMargins_2sheets_3; begin TestWriteRead_PageMargins(sfExcel8, 2, 3); end; -procedure TSpreadWriteReadPageLayoutTests.TestWriteRead_PageMargins_BIFF8_3sheets_0; +procedure TSpreadWriteReadPageLayoutTests.TestWriteRead_BIFF8_PageMargins_3sheets_0; begin TestWriteRead_PageMargins(sfExcel8, 3, 0); end; -procedure TSpreadWriteReadPageLayoutTests.TestWriteRead_PageMargins_BIFF8_3sheets_1; +procedure TSpreadWriteReadPageLayoutTests.TestWriteRead_BIFF8_PageMargins_3sheets_1; begin TestWriteRead_PageMargins(sfExcel8, 3, 1); end; -procedure TSpreadWriteReadPageLayoutTests.TestWriteRead_PageMargins_BIFF8_3sheets_2; +procedure TSpreadWriteReadPageLayoutTests.TestWriteRead_BIFF8_PageMargins_3sheets_2; begin TestWriteRead_PageMargins(sfExcel8, 3, 2); end; -procedure TSpreadWriteReadPageLayoutTests.TestWriteRead_PageMargins_BIFF8_3sheets_3; +procedure TSpreadWriteReadPageLayoutTests.TestWriteRead_BIFF8_PageMargins_3sheets_3; begin TestWriteRead_PageMargins(sfExcel8, 3, 3); end; +procedure TSpreadWriteReadPageLayoutTests.TestWriteRead_BIFF8_PageOrientation_1sheet; +begin + TestWriteRead_PageLayout(sfExcel8, 1, 0); +end; + +procedure TSpreadWriteReadPageLayoutTests.TestWriteRead_BIFF8_PageOrientation_2sheets; +begin + TestWriteRead_PageLayout(sfExcel8, 2, 0); +end; + +procedure TSpreadWriteReadPageLayoutTests.TestWriteRead_BIFF8_PageOrientation_3sheets; +begin + TestWriteRead_PageLayout(sfExcel8, 3, 0); +end; + + +procedure TSpreadWriteReadPageLayoutTests.TestWriteRead_BIFF8_PaperSize_1sheet; +begin + TestWriteRead_PageLayout(sfExcel8, 1, 1); +end; + +procedure TSpreadWriteReadPageLayoutTests.TestWriteRead_BIFF8_PaperSize_2sheets; +begin + TestWriteRead_PageLayout(sfExcel8, 2, 1); +end; + +procedure TSpreadWriteReadPageLayoutTests.TestWriteRead_BIFF8_PaperSize_3sheets; +begin + TestWriteRead_PageLayout(sfExcel8, 3, 1); +end; + + +procedure TSpreadWriteReadPageLayoutTests.TestWriteRead_BIFF8_ScalingFactor_1sheet; +begin + TestWriteRead_PageLayout(sfExcel8, 1, 2); +end; + +procedure TSpreadWriteReadPageLayoutTests.TestWriteRead_BIFF8_ScalingFactor_2sheets; +begin + TestWriteRead_PageLayout(sfExcel8, 2, 2); +end; + +procedure TSpreadWriteReadPageLayoutTests.TestWriteRead_BIFF8_ScalingFactor_3sheets; +begin + TestWriteRead_PageLayout(sfExcel8, 3, 2); +end; + { Tests for OOXML file format } -procedure TSpreadWriteReadPageLayoutTests.TestWriteRead_PageMargins_OOXML_1sheet_0; +procedure TSpreadWriteReadPageLayoutTests.TestWriteRead_OOXML_PageMargins_1sheet_0; begin TestWriteRead_PageMargins(sfOOXML, 1, 0); end; -procedure TSpreadWriteReadPageLayoutTests.TestWriteRead_PageMargins_OOXML_1sheet_1; +procedure TSpreadWriteReadPageLayoutTests.TestWriteRead_OOXML_PageMargins_1sheet_1; begin TestWriteRead_PageMargins(sfOOXML, 1, 1); end; -procedure TSpreadWriteReadPageLayoutTests.TestWriteRead_PageMargins_OOXML_1sheet_2; +procedure TSpreadWriteReadPageLayoutTests.TestWriteRead_OOXML_PageMargins_1sheet_2; begin TestWriteRead_PageMargins(sfOOXML, 1, 2); end; -procedure TSpreadWriteReadPageLayoutTests.TestWriteRead_PageMargins_OOXML_1sheet_3; +procedure TSpreadWriteReadPageLayoutTests.TestWriteRead_OOXML_PageMargins_1sheet_3; begin TestWriteRead_PageMargins(sfOOXML, 1, 3); end; -procedure TSpreadWriteReadPagelayoutTests.TestWriteRead_PageMargins_OOXML_2sheets_0; +procedure TSpreadWriteReadPagelayoutTests.TestWriteRead_OOXML_PageMargins_2sheets_0; begin TestWriteRead_PageMargins(sfOOXML, 2, 0); end; -procedure TSpreadWriteReadPageLayoutTests.TestWriteRead_PageMargins_OOXML_2sheets_1; +procedure TSpreadWriteReadPageLayoutTests.TestWriteRead_OOXML_PageMargins_2sheets_1; begin TestWriteRead_PageMargins(sfOOXML, 2, 1); end; -procedure TSpreadWriteReadPageLayoutTests.TestWriteRead_PageMargins_OOXML_2sheets_2; +procedure TSpreadWriteReadPageLayoutTests.TestWriteRead_OOXML_PageMargins_2sheets_2; begin TestWriteRead_PageMargins(sfOOXML, 2, 2); end; -procedure TSpreadWriteReadPageLayoutTests.TestWriteRead_PageMargins_OOXML_2sheets_3; +procedure TSpreadWriteReadPageLayoutTests.TestWriteRead_OOXML_PageMargins_2sheets_3; begin TestWriteRead_PageMargins(sfOOXML, 2, 3); end; -procedure TSpreadWriteReadPageLayoutTests.TestWriteRead_PageMargins_OOXML_3sheets_0; +procedure TSpreadWriteReadPageLayoutTests.TestWriteRead_OOXML_PageMargins_3sheets_0; begin TestWriteRead_PageMargins(sfOOXML, 3, 0); end; -procedure TSpreadWriteReadPageLayoutTests.TestWriteRead_PageMargins_OOXML_3sheets_1; +procedure TSpreadWriteReadPageLayoutTests.TestWriteRead_OOXML_PageMargins_3sheets_1; begin TestWriteRead_PageMargins(sfOOXML, 3, 1); end; -procedure TSpreadWriteReadPageLayoutTests.TestWriteRead_PageMargins_OOXML_3sheets_2; +procedure TSpreadWriteReadPageLayoutTests.TestWriteRead_OOXML_PageMargins_3sheets_2; begin TestWriteRead_PageMargins(sfOOXML, 3, 2); end; -procedure TSpreadWriteReadPageLayoutTests.TestWriteRead_PageMargins_OOXML_3sheets_3; +procedure TSpreadWriteReadPageLayoutTests.TestWriteRead_OOXML_PageMargins_3sheets_3; begin TestWriteRead_PageMargins(sfOOXML, 3, 3); end; +procedure TSpreadWriteReadPageLayoutTests.TestWriteRead_OOXML_PageOrientation_1sheet; +begin + TestWriteRead_PageLayout(sfOOXML, 1, 0); +end; + +procedure TSpreadWriteReadPageLayoutTests.TestWriteRead_OOXML_PageOrientation_2sheets; +begin + TestWriteRead_PageLayout(sfOOXML, 2, 0); +end; + +procedure TSpreadWriteReadPageLayoutTests.TestWriteRead_OOXML_PageOrientation_3sheets; +begin + TestWriteRead_PageLayout(sfOOXML, 3, 0); +end; + + +procedure TSpreadWriteReadPageLayoutTests.TestWriteRead_OOXML_PaperSize_1sheet; +begin + TestWriteRead_PageLayout(sfOOXML, 1, 1); +end; + +procedure TSpreadWriteReadPageLayoutTests.TestWriteRead_OOXML_PaperSize_2sheets; +begin + TestWriteRead_PageLayout(sfOOXML, 2, 1); +end; + +procedure TSpreadWriteReadPageLayoutTests.TestWriteRead_OOXML_PaperSize_3sheets; +begin + TestWriteRead_PageLayout(sfOOXML, 3, 1); +end; + + +procedure TSpreadWriteReadPageLayoutTests.TestWriteRead_OOXML_ScalingFactor_1sheet; +begin + TestWriteRead_PageLayout(sfOOXML, 1, 2); +end; + +procedure TSpreadWriteReadPageLayoutTests.TestWriteRead_OOXML_ScalingFactor_2sheets; +begin + TestWriteRead_PageLayout(sfOOXML, 2, 2); +end; + +procedure TSpreadWriteReadPageLayoutTests.TestWriteRead_OOXML_ScalingFactor_3sheets; +begin + TestWriteRead_PageLayout(sfOOXML, 3, 2); +end; + + { Tests for Open Document file format } -procedure TSpreadWriteReadPageLayoutTests.TestWriteRead_PageMargins_ODS_1sheet_0; +procedure TSpreadWriteReadPageLayoutTests.TestWriteRead_ODS_PageMargins_1sheet_0; begin TestWriteRead_PageMargins(sfOpenDocument, 1, 0); end; -procedure TSpreadWriteReadPageLayoutTests.TestWriteRead_PageMargins_ODS_1sheet_1; +procedure TSpreadWriteReadPageLayoutTests.TestWriteRead_ODS_PageMargins_1sheet_1; begin TestWriteRead_PageMargins(sfOpenDocument, 1, 1); end; -procedure TSpreadWriteReadPageLayoutTests.TestWriteRead_PageMargins_ODS_1sheet_2; +procedure TSpreadWriteReadPageLayoutTests.TestWriteRead_ODS_PageMargins_1sheet_2; begin TestWriteRead_PageMargins(sfOpenDocument, 1, 2); end; -procedure TSpreadWriteReadPageLayoutTests.TestWriteRead_PageMargins_ODS_1sheet_3; +procedure TSpreadWriteReadPageLayoutTests.TestWriteRead_ODS_PageMargins_1sheet_3; begin TestWriteRead_PageMargins(sfOpenDocument, 1, 3); end; -procedure TSpreadWriteReadPagelayoutTests.TestWriteRead_PageMargins_ODS_2sheets_0; +procedure TSpreadWriteReadPagelayoutTests.TestWriteRead_ODS_PageMargins_2sheets_0; begin TestWriteRead_PageMargins(sfOpenDocument, 2, 0); end; -procedure TSpreadWriteReadPageLayoutTests.TestWriteRead_PageMargins_ODS_2sheets_1; +procedure TSpreadWriteReadPageLayoutTests.TestWriteRead_ODS_PageMargins_2sheets_1; begin TestWriteRead_PageMargins(sfOpenDocument, 2, 1); end; -procedure TSpreadWriteReadPageLayoutTests.TestWriteRead_PageMargins_ODS_2sheets_2; +procedure TSpreadWriteReadPageLayoutTests.TestWriteRead_ODS_PageMargins_2sheets_2; begin TestWriteRead_PageMargins(sfOpenDocument, 2, 2); end; -procedure TSpreadWriteReadPageLayoutTests.TestWriteRead_PageMargins_ODS_2sheets_3; +procedure TSpreadWriteReadPageLayoutTests.TestWriteRead_ODS_PageMargins_2sheets_3; begin TestWriteRead_PageMargins(sfOpenDocument, 2, 3); end; -procedure TSpreadWriteReadPageLayoutTests.TestWriteRead_PageMargins_ODS_3sheets_0; +procedure TSpreadWriteReadPageLayoutTests.TestWriteRead_ODS_PageMargins_3sheets_0; begin TestWriteRead_PageMargins(sfOpenDocument, 3, 0); end; -procedure TSpreadWriteReadPageLayoutTests.TestWriteRead_PageMargins_ODS_3sheets_1; +procedure TSpreadWriteReadPageLayoutTests.TestWriteRead_ODS_PageMargins_3sheets_1; begin TestWriteRead_PageMargins(sfOpenDocument, 3, 1); end; -procedure TSpreadWriteReadPageLayoutTests.TestWriteRead_PageMargins_ODS_3sheets_2; +procedure TSpreadWriteReadPageLayoutTests.TestWriteRead_ODS_PageMargins_3sheets_2; begin TestWriteRead_PageMargins(sfOpenDocument, 3, 2); end; -procedure TSpreadWriteReadPageLayoutTests.TestWriteRead_PageMargins_ODS_3sheets_3; +procedure TSpreadWriteReadPageLayoutTests.TestWriteRead_ODS_PageMargins_3sheets_3; begin TestWriteRead_PageMargins(sfOpenDocument, 3, 3); end; +procedure TSpreadWriteReadPageLayoutTests.TestWriteRead_ODS_PageOrientation_1sheet; +begin + TestWriteRead_PageLayout(sfOpenDocument, 1, 0); +end; + +procedure TSpreadWriteReadPageLayoutTests.TestWriteRead_ODS_PageOrientation_2sheets; +begin + TestWriteRead_PageLayout(sfOpenDocument, 2, 0); +end; + +procedure TSpreadWriteReadPageLayoutTests.TestWriteRead_ODS_PageOrientation_3sheets; +begin + TestWriteRead_PageLayout(sfOpenDocument, 3, 0); +end; + + +procedure TSpreadWriteReadPageLayoutTests.TestWriteRead_ODS_PaperSize_1sheet; +begin + TestWriteRead_PageLayout(sfOpenDocument, 1, 1); +end; + +procedure TSpreadWriteReadPageLayoutTests.TestWriteRead_ODS_PaperSize_2sheets; +begin + TestWriteRead_PageLayout(sfOpenDocument, 2, 1); +end; + +procedure TSpreadWriteReadPageLayoutTests.TestWriteRead_ODS_PaperSize_3sheets; +begin + TestWriteRead_PageLayout(sfOpenDocument, 3, 1); +end; + + +procedure TSpreadWriteReadPageLayoutTests.TestWriteRead_ODS_ScalingFactor_1sheet; +begin + TestWriteRead_PageLayout(sfOpenDocument, 1, 2); +end; + +procedure TSpreadWriteReadPageLayoutTests.TestWriteRead_ODS_ScalingFactor_2sheets; +begin + TestWriteRead_PageLayout(sfOpenDocument, 2, 2); +end; + +procedure TSpreadWriteReadPageLayoutTests.TestWriteRead_ODS_ScalingFactor_3sheets; +begin + TestWriteRead_PageLayout(sfOpenDocument, 3, 2); +end; + + initialization RegisterTest(TSpreadWriteReadPageLayoutTests); diff --git a/components/fpspreadsheet/xlsbiff5.pas b/components/fpspreadsheet/xlsbiff5.pas index 8b725e9a4..d004f75aa 100755 --- a/components/fpspreadsheet/xlsbiff5.pas +++ b/components/fpspreadsheet/xlsbiff5.pas @@ -415,6 +415,7 @@ begin INT_EXCEL_ID_ROW : ReadRowInfo(AStream); INT_EXCEL_ID_RSTRING : ReadRichString(AStream); //(RSTRING) This record stores a formatted text cell (Rich-Text). In BIFF8 it is usually replaced by the LABELSST record. Excel still uses this record, if it copies formatted text cells to the clipboard. INT_EXCEL_ID_SHAREDFMLA : ReadSharedFormula(AStream); + INT_EXCEL_ID_SHEETPR : ReadSHEETPR(AStream); INT_EXCEL_ID_STANDARDWIDTH : ReadStandardWidth(AStream, FWorksheet); INT_EXCEL_ID_TOPMARGIN : ReadMargin(AStream, 2); INT_EXCEL_ID_STRING : ReadStringRecord(AStream); @@ -1044,6 +1045,7 @@ begin WriteIndex(AStream); WritePrintHeaders(AStream); WritePrintGridLines(AStream); + WriteSheetPR(AStream); // Page settings block WriteHeaderFooter(AStream, true); diff --git a/components/fpspreadsheet/xlsbiff8.pas b/components/fpspreadsheet/xlsbiff8.pas index 141bcf032..cfff9a43c 100755 --- a/components/fpspreadsheet/xlsbiff8.pas +++ b/components/fpspreadsheet/xlsbiff8.pas @@ -720,6 +720,7 @@ begin INT_EXCEL_ID_RK : ReadRKValue(AStream); INT_EXCEL_ID_SHAREDFMLA : ReadSharedFormula(AStream); + INT_EXCEL_ID_SHEETPR : ReadSHEETPR(AStream); INT_EXCEL_ID_STRING : ReadStringRecord(AStream); INT_EXCEL_ID_TOPMARGIN : ReadMargin(AStream, 2); INT_EXCEL_ID_TXO : ReadTXO(AStream); @@ -1749,8 +1750,7 @@ begin WriteIndex(AStream); WritePrintHeaders(AStream); WritePrintGridLines(AStream); - - //WriteSheetPR(AStream); + WriteSheetPR(AStream); // Page setting block WriteHeaderFooter(AStream, true); diff --git a/components/fpspreadsheet/xlscommon.pas b/components/fpspreadsheet/xlscommon.pas index 4be44ed1c..68272cf3b 100644 --- a/components/fpspreadsheet/xlscommon.pas +++ b/components/fpspreadsheet/xlscommon.pas @@ -421,6 +421,7 @@ type ASharedFormulaBase: PCell = nil): Boolean; function ReadRPNTokenArraySize(AStream: TStream): word; virtual; procedure ReadSharedFormula(AStream: TStream); + procedure ReadSHEETPR(AStream: TStream); // Helper function for reading a string with 8-bit length function ReadString_8bitLen(AStream: TStream): String; virtual; @@ -1509,8 +1510,8 @@ begin // Fit worksheet height to this number of pages (0 = use as many as needed) FWorksheet.PageLayout.FitHeightToPages := WordLEToN(AStream.ReadWord); - if (FWorksheet.PageLayout.FitWidthToPages > 0) or (FWorksheet.PageLayout.FitHeightToPages > 0) - then Include(FWorksheet.PageLayout.Options, poFitPages); + // Information whether scaling factor or fittopages are used is stored in the + // SHEETPR record. // Option flags w := WordLEToN(AStream.ReadWord); @@ -2055,6 +2056,19 @@ begin FWorksheet.CopyFormula(cell, r, c); end; +{@@ ---------------------------------------------------------------------------- + Reads an Excel SHEETPR record +-------------------------------------------------------------------------------} +procedure TsSpreadBIFFReader.ReadSheetPR(AStream: TStream); +var + flags: Word; +begin + flags := WordLEToN(AStream.ReadWord); + if flags and $0100 <> 0 then + Include(FWorksheet.PageLayout.Options, poFitPages); + // The other flags are ignored, so far. +end; + {@@ ---------------------------------------------------------------------------- Helper function for reading a string with 8-bit length. Here, we implement the version for ansistrings since it is valid for all BIFF versions except @@ -2739,14 +2753,14 @@ begin end; AStream.WriteWord(WordToLE(w)); - { Start page number } - w := FWorksheet.PageLayout.StartPageNumber; - AStream.WriteWord(WordToLE(w)); - { Scaling factor in percent } w := Round(FWorksheet.PageLayout.ScalingFactor); AStream.WriteWord(WordToLE(w)); + { Start page number } + w := FWorksheet.PageLayout.StartPageNumber; + AStream.WriteWord(WordToLE(w)); + { Fit worksheet width to this number of pages, 0 = use as many as needed } w := FWorksheet.PageLayout.FitWidthToPages; AStream.WriteWord(WordToLE(w)); @@ -3540,7 +3554,7 @@ begin end; *) {@@ ---------------------------------------------------------------------------- - Writes a SHEETPR Record. + Writes a SHEETPR record. Valid for BIFF3-BIFF8. -------------------------------------------------------------------------------} procedure TsSpreadBIFFWriter.WriteSheetPR(AStream: TStream); @@ -3550,7 +3564,14 @@ begin { BIFF Record header } WriteBIFFHeader(AStream, INT_EXCEL_ID_SHEETPR, 2); - flags := $04C1; + flags := $0001 // show automatic page breaks + or $0040 // Outline buttons below outline groups + or $0080 // Outline buttons right of outline groups + or $0400; // Show outline symbols + + if (poFitPages in FWorksheet.PageLayout.Options) then + flags := flags or $0100; // Fit printout to number of pages + AStream.WriteWord(WordToLE(flags)); end;