diff --git a/components/fpspreadsheet/fpsopendocument.pas b/components/fpspreadsheet/fpsopendocument.pas index ec3b6fb85..6f64c69c6 100755 --- a/components/fpspreadsheet/fpsopendocument.pas +++ b/components/fpspreadsheet/fpsopendocument.pas @@ -943,7 +943,7 @@ begin if (s <> '') then begin if s[Length(s)] = '%' then Delete(s, Length(s), 1); - data.PageLayout.ScalingFactor := StrToFloat(s, FPointSeparatorSettings); + data.PageLayout.ScalingFactor := round(StrToFloat(s, FPointSeparatorSettings)); Exclude(data.PageLayout.Options, poFitPages); end; @@ -3169,7 +3169,7 @@ procedure TsSpreadOpenDocWriter.WriteAutomaticStyles(AStream: TStream); if APageLayout.FitHeightToPages > 0 then pageLayoutStr := pageLayoutStr + 'style:scale-to-Y="' + IntToStr(APageLayout.FitHeightToPages) + '" '; end else - pageLayoutStr := pageLayoutStr + 'style:scale-to="' + IntToStr(round(APageLayout.ScalingFactor)) + '%" '; + pageLayoutStr := pageLayoutStr + 'style:scale-to="' + IntToStr(APageLayout.ScalingFactor) + '%" '; options := 'charts drawings objects zero-values'; if poPrintGridLines in APageLayout.Options then diff --git a/components/fpspreadsheet/fpstypes.pas b/components/fpspreadsheet/fpstypes.pas index 93593e6d2..958dbf119 100644 --- a/components/fpspreadsheet/fpstypes.pas +++ b/components/fpspreadsheet/fpstypes.pas @@ -688,7 +688,7 @@ type HeaderMargin: Double; FooterMargin: Double; StartPageNumber: Integer; - ScalingFactor: Double; // in percent + ScalingFactor: Integer; // in percent FitWidthToPages: Integer; FitHeightToPages: Integer; Copies: Integer; diff --git a/components/fpspreadsheet/tests/pagelayouttests.pas b/components/fpspreadsheet/tests/pagelayouttests.pas index 25628b70c..8399cacc2 100644 --- a/components/fpspreadsheet/tests/pagelayouttests.pas +++ b/components/fpspreadsheet/tests/pagelayouttests.pas @@ -71,6 +71,18 @@ type procedure TestWriteRead_BIFF5_ScalingFactor_2sheets; procedure TestWriteRead_BIFF5_ScalingFactor_3sheets; + procedure TestWriteRead_BIFF5_WidthToPages_1sheet; + procedure TestWriteRead_BIFF5_WidthToPages_2sheets; + procedure TestWriteRead_BIFF5_WidthToPages_3sheets; + + procedure TestWriteRead_BIFF5_HeightToPages_1sheet; + procedure TestWriteRead_BIFF5_HeightToPages_2sheets; + procedure TestWriteRead_BIFF5_HeightToPages_3sheets; + + procedure TestWriteRead_BIFF5_PageNumber_1sheet; + procedure TestWriteRead_BIFF5_PageNumber_2sheets; + procedure TestWriteRead_BIFF5_PageNumber_3sheets; + { BIFF8 page layout tests } procedure TestWriteRead_BIFF8_PageMargins_1sheet_0; procedure TestWriteRead_BIFF8_PageMargins_1sheet_1; @@ -97,6 +109,18 @@ type procedure TestWriteRead_BIFF8_ScalingFactor_2sheets; procedure TestWriteRead_BIFF8_ScalingFactor_3sheets; + procedure TestWriteRead_BIFF8_WidthToPages_1sheet; + procedure TestWriteRead_BIFF8_WidthToPages_2sheets; + procedure TestWriteRead_BIFF8_WidthToPages_3sheets; + + procedure TestWriteRead_BIFF8_HeightToPages_1sheet; + procedure TestWriteRead_BIFF8_HeightToPages_2sheets; + procedure TestWriteRead_BIFF8_HeightToPages_3sheets; + + procedure TestWriteRead_BIFF8_PageNumber_1sheet; + procedure TestWriteRead_BIFF8_PageNumber_2sheets; + procedure TestWriteRead_BIFF8_PageNumber_3sheets; + { OOXML page layout tests } procedure TestWriteRead_OOXML_PageMargins_1sheet_0; procedure TestWriteRead_OOXML_PageMargins_1sheet_1; @@ -123,6 +147,18 @@ type procedure TestWriteRead_OOXML_ScalingFactor_2sheets; procedure TestWriteRead_OOXML_ScalingFactor_3sheets; + procedure TestWriteRead_OOXML_WidthToPages_1sheet; + procedure TestWriteRead_OOXML_WidthToPages_2sheets; + procedure TestWriteRead_OOXML_WidthToPages_3sheets; + + procedure TestWriteRead_OOXML_HeightToPages_1sheet; + procedure TestWriteRead_OOXML_HeightToPages_2sheets; + procedure TestWriteRead_OOXML_HeightToPages_3sheets; + + procedure TestWriteRead_OOXML_PageNumber_1sheet; + procedure TestWriteRead_OOXML_PageNumber_2sheets; + procedure TestWriteRead_OOXML_PageNumber_3sheets; + { OpenDocument page layout tests } procedure TestWriteRead_ODS_PageMargins_1sheet_0; procedure TestWriteRead_ODS_PageMargins_1sheet_1; @@ -149,6 +185,18 @@ type procedure TestWriteRead_ODS_ScalingFactor_2sheets; procedure TestWriteRead_ODS_ScalingFactor_3sheets; + procedure TestWriteRead_ODS_WidthToPages_1sheet; + procedure TestWriteRead_ODS_WidthToPages_2sheets; + procedure TestWriteRead_ODS_WidthToPages_3sheets; + + procedure TestWriteRead_ODS_HeightToPages_1sheet; + procedure TestWriteRead_ODS_HeightToPages_2sheets; + procedure TestWriteRead_ODS_HeightToPages_3sheets; + + procedure TestWriteRead_ODS_PageNumber_1sheet; + procedure TestWriteRead_ODS_PageNumber_2sheets; + procedure TestWriteRead_ODS_PageNumber_3sheets; + end; implementation @@ -263,6 +311,9 @@ end; 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% + 3 - Scale n pages to width: sheet 1 n=2, sheet 2 n=3, sheet 3 n=1 + 4 - Scale n pages to height: sheet 1 n=2, sheet 2 n=3, sheet 3 n=1 + 5 - First page number: sheet 1 - 3, sheet 2 - automatic, sheet 3 - 1 -------------------------------------------------------------------------------} procedure TSpreadWriteReadPageLayoutTests.TestWriteRead_PageLayout( AFormat: TsSpreadsheetFormat; ANumSheets, ATestMode: Integer); @@ -294,23 +345,51 @@ 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; + begin + if p = 0 then ScalingFactor := 50 else + if p = 1 then ScalingFactor := 200; + Exclude(Options, poFitPages); + end; + 3: // Scale width to n pages + begin + case p of + 0: FitWidthToPages := 2; + 1: FitWidthToPages := 3; + 2: FitWidthToPages := 1; + end; + Include(Options, poFitPages); + end; + 4: // Scale height to n pages + begin + case p of + 0: FitHeightToPages := 2; + 1: FitHeightToPages := 3; + 2: FitHeightToPages := 1; + end; + Include(Options, poFitPages); + end; + 5: // Page number of first pge + begin + Options := Options + [poPrintHeaders, poUseStartPageNumber]; + case p of + 0: StartPageNumber := 3; + 1: Exclude(Options, poUseStartPageNumber); + 2: StartPageNumber := 1; + end; + Headers[HEADER_FOOTER_INDEX_ALL] := '&LPage &P of &N'; + 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 ); + for col := 0 to 29 do + Myworksheet.WriteNumber(row, col, (row+1)+(col+1)*100+(p+1)*10000 ); MyWorksheet.PageLayout := SollPageLayout[p]; end; MyWorkBook.WriteToFile(TempFile, AFormat, true); @@ -349,6 +428,27 @@ begin CheckEquals(sollPageLayout[p].ScalingFactor, actualPageLayout.ScalingFactor, 'Scaling factor mismatch, sheet "' + MyWorksheet.Name + '"'); end; + 3: // Fit width to pages + begin + CheckEquals(poFitPages in sollPageLayout[p].Options, poFitPages in actualPageLayout.Options, + '"poFitPages" option mismatch, sheet "' + MyWorksheet.name + '"'); + CheckEquals(sollPageLayout[p].FitWidthToPages, actualPageLayout.FitWidthToPages, + 'FitWidthToPages mismatch, sheet "' + MyWorksheet.Name + '"'); + end; + 4: // Fit height to pages + begin + CheckEquals(poFitPages in sollPageLayout[p].Options, poFitPages in actualPageLayout.Options, + '"poFitPages" option mismatch, sheet "' + MyWorksheet.name + '"'); + CheckEquals(sollPageLayout[p].FitHeightToPages, actualPageLayout.FitHeightToPages, + 'FitWidthToPages mismatch, sheet "' + MyWorksheet.Name + '"'); + end; + 5: // Start page number + begin + CheckEquals(poUseStartPageNumber in sollPageLayout[p].Options, poUseStartPageNumber in actualPageLayout.Options, + '"poUseStartPageNumber" option mismatch, sheet "' + MyWorksheet.name + '"'); + CheckEquals(sollPageLayout[p].StartPageNumber, actualPageLayout.StartPageNumber, + 'StartPageNumber value mismatch, sheet "' + MyWorksheet.Name + '"'); + end; end; end; @@ -536,6 +636,55 @@ begin TestWriteRead_PageLayout(sfExcel5, 3, 2); end; + +procedure TSpreadWriteReadPageLayoutTests.TestWriteRead_BIFF5_WidthToPages_1sheet; +begin + TestWriteRead_PageLayout(sfExcel5, 1, 3); +end; + +procedure TSpreadWriteReadPageLayoutTests.TestWriteRead_BIFF5_WidthToPages_2sheets; +begin + TestWriteRead_PageLayout(sfExcel5, 2, 3); +end; + +procedure TSpreadWriteReadPageLayoutTests.TestWriteRead_BIFF5_WidthToPages_3sheets; +begin + TestWriteRead_PageLayout(sfExcel5, 3, 3); +end; + + +procedure TSpreadWriteReadPageLayoutTests.TestWriteRead_BIFF5_HeightToPages_1sheet; +begin + TestWriteRead_PageLayout(sfExcel5, 1, 4); +end; + +procedure TSpreadWriteReadPageLayoutTests.TestWriteRead_BIFF5_HeightToPages_2sheets; +begin + TestWriteRead_PageLayout(sfExcel5, 2, 4); +end; + +procedure TSpreadWriteReadPageLayoutTests.TestWriteRead_BIFF5_HeightToPages_3sheets; +begin + TestWriteRead_PageLayout(sfExcel5, 3, 4); +end; + + +procedure TSpreadWriteReadPageLayoutTests.TestWriteRead_BIFF5_PageNumber_1sheet; +begin + TestWriteRead_PageLayout(sfExcel5, 1, 5); +end; + +procedure TSpreadWriteReadPageLayoutTests.TestWriteRead_BIFF5_PageNumber_2sheets; +begin + TestWriteRead_PageLayout(sfExcel5, 2, 5); +end; + +procedure TSpreadWriteReadPageLayoutTests.TestWriteRead_BIFF5_PageNumber_3sheets; +begin + TestWriteRead_PageLayout(sfExcel5, 3, 5); +end; + + { Tests for BIFF8 file format } procedure TSpreadWriteReadPageLayoutTests.TestWriteRead_BIFF8_PageMargins_1sheet_0; @@ -648,6 +797,55 @@ begin TestWriteRead_PageLayout(sfExcel8, 3, 2); end; + +procedure TSpreadWriteReadPageLayoutTests.TestWriteRead_BIFF8_WidthToPages_1sheet; +begin + TestWriteRead_PageLayout(sfExcel8, 1, 3); +end; + +procedure TSpreadWriteReadPageLayoutTests.TestWriteRead_BIFF8_WidthToPages_2sheets; +begin + TestWriteRead_PageLayout(sfExcel8, 2, 3); +end; + +procedure TSpreadWriteReadPageLayoutTests.TestWriteRead_BIFF8_WidthToPages_3sheets; +begin + TestWriteRead_PageLayout(sfExcel8, 3, 3); +end; + + +procedure TSpreadWriteReadPageLayoutTests.TestWriteRead_BIFF8_HeightToPages_1sheet; +begin + TestWriteRead_PageLayout(sfExcel8, 1, 4); +end; + +procedure TSpreadWriteReadPageLayoutTests.TestWriteRead_BIFF8_HeightToPages_2sheets; +begin + TestWriteRead_PageLayout(sfExcel8, 2, 4); +end; + +procedure TSpreadWriteReadPageLayoutTests.TestWriteRead_BIFF8_HeightToPages_3sheets; +begin + TestWriteRead_PageLayout(sfExcel8, 3, 4); +end; + + +procedure TSpreadWriteReadPageLayoutTests.TestWriteRead_BIFF8_PageNumber_1sheet; +begin + TestWriteRead_PageLayout(sfExcel8, 1, 5); +end; + +procedure TSpreadWriteReadPageLayoutTests.TestWriteRead_BIFF8_PageNumber_2sheets; +begin + TestWriteRead_PageLayout(sfExcel8, 2, 5); +end; + +procedure TSpreadWriteReadPageLayoutTests.TestWriteRead_BIFF8_PageNumber_3sheets; +begin + TestWriteRead_PageLayout(sfExcel8, 3, 5); +end; + + { Tests for OOXML file format } procedure TSpreadWriteReadPageLayoutTests.TestWriteRead_OOXML_PageMargins_1sheet_0; @@ -761,6 +959,54 @@ begin end; +procedure TSpreadWriteReadPageLayoutTests.TestWriteRead_OOXML_WidthToPages_1sheet; +begin + TestWriteRead_PageLayout(sfOOXML, 1, 3); +end; + +procedure TSpreadWriteReadPageLayoutTests.TestWriteRead_OOXML_WidthToPages_2sheets; +begin + TestWriteRead_PageLayout(sfOOXML, 2, 3); +end; + +procedure TSpreadWriteReadPageLayoutTests.TestWriteRead_OOXML_WidthToPages_3sheets; +begin + TestWriteRead_PageLayout(sfOOXML, 3, 3); +end; + + +procedure TSpreadWriteReadPageLayoutTests.TestWriteRead_OOXML_HeightToPages_1sheet; +begin + TestWriteRead_PageLayout(sfOOXML, 1, 4); +end; + +procedure TSpreadWriteReadPageLayoutTests.TestWriteRead_OOXML_HeightToPages_2sheets; +begin + TestWriteRead_PageLayout(sfOOXML, 2, 4); +end; + +procedure TSpreadWriteReadPageLayoutTests.TestWriteRead_OOXML_HeightToPages_3sheets; +begin + TestWriteRead_PageLayout(sfOOXML, 3, 4); +end; + + +procedure TSpreadWriteReadPageLayoutTests.TestWriteRead_OOXML_PageNumber_1sheet; +begin + TestWriteRead_PageLayout(sfOOXML, 1, 5); +end; + +procedure TSpreadWriteReadPageLayoutTests.TestWriteRead_OOXML_PageNumber_2sheets; +begin + TestWriteRead_PageLayout(sfOOXML, 2, 5); +end; + +procedure TSpreadWriteReadPageLayoutTests.TestWriteRead_OOXML_PageNumber_3sheets; +begin + TestWriteRead_PageLayout(sfOOXML, 3, 5); +end; + + { Tests for Open Document file format } procedure TSpreadWriteReadPageLayoutTests.TestWriteRead_ODS_PageMargins_1sheet_0; @@ -874,6 +1120,54 @@ begin end; +procedure TSpreadWriteReadPageLayoutTests.TestWriteRead_ODS_WidthToPages_1sheet; +begin + TestWriteRead_PageLayout(sfOpenDocument, 1, 3); +end; + +procedure TSpreadWriteReadPageLayoutTests.TestWriteRead_ODS_WidthToPages_2sheets; +begin + TestWriteRead_PageLayout(sfOpenDocument, 2, 3); +end; + +procedure TSpreadWriteReadPageLayoutTests.TestWriteRead_ODS_WidthToPages_3sheets; +begin + TestWriteRead_PageLayout(sfOpenDocument, 3, 3); +end; + + +procedure TSpreadWriteReadPageLayoutTests.TestWriteRead_ODS_HeightToPages_1sheet; +begin + TestWriteRead_PageLayout(sfOpenDocument, 1, 4); +end; + +procedure TSpreadWriteReadPageLayoutTests.TestWriteRead_ODS_HeightToPages_2sheets; +begin + TestWriteRead_PageLayout(sfOpenDocument, 2, 4); +end; + +procedure TSpreadWriteReadPageLayoutTests.TestWriteRead_ODS_HeightToPages_3sheets; +begin + TestWriteRead_PageLayout(sfOpenDocument, 3, 4); +end; + + +procedure TSpreadWriteReadPageLayoutTests.TestWriteRead_ODS_PageNumber_1sheet; +begin + TestWriteRead_PageLayout(sfOpenDocument, 1, 5); +end; + +procedure TSpreadWriteReadPageLayoutTests.TestWriteRead_ODS_PageNumber_2sheets; +begin + TestWriteRead_PageLayout(sfOpenDocument, 2, 5); +end; + +procedure TSpreadWriteReadPageLayoutTests.TestWriteRead_ODS_PageNumber_3sheets; +begin + TestWriteRead_PageLayout(sfOpenDocument, 3, 5); +end; + + initialization RegisterTest(TSpreadWriteReadPageLayoutTests); diff --git a/components/fpspreadsheet/xlscommon.pas b/components/fpspreadsheet/xlscommon.pas index 68272cf3b..ad17afd16 100644 --- a/components/fpspreadsheet/xlscommon.pas +++ b/components/fpspreadsheet/xlscommon.pas @@ -2754,7 +2754,7 @@ begin AStream.WriteWord(WordToLE(w)); { Scaling factor in percent } - w := Round(FWorksheet.PageLayout.ScalingFactor); + w := FWorksheet.PageLayout.ScalingFactor; AStream.WriteWord(WordToLE(w)); { Start page number } diff --git a/components/fpspreadsheet/xlsxooxml.pas b/components/fpspreadsheet/xlsxooxml.pas index 66120f4e1..707e2f39f 100755 --- a/components/fpspreadsheet/xlsxooxml.pas +++ b/components/fpspreadsheet/xlsxooxml.pas @@ -1409,23 +1409,32 @@ begin // Scaling factor s := GetAttrValue(ANode, 'scale'); if s <> '' then + begin AWorksheet.PageLayout.ScalingFactor := StrToInt(s); + Exclude(AWorksheet.PageLayout.Options, poFitPages); + end; // Fit print job to pages s := GetAttrValue(ANode, 'fitToHeight'); if s <> '' then + begin AWorksheet.PageLayout.FitHeightToPages := StrToInt(s); - if poFitPages in AWorksheet.PageLayout.Options then + Include(AWorksheet.PageLayout.Options, poFitPages); + end; s := GetAttrValue(ANode, 'fitToWidth'); if s <> '' then + begin AWorksheet.PageLayout.FitWidthToPages := StrToInt(s); - - if (AWorksheet.PageLayout.FitHeightToPages > 0) or (AWorksheet.PageLayout.FitWidthToPages > 0) then - Include(AWorksheet.pageLayout.Options, poFitPages); + Include(AWorksheet.PageLayout.Options, poFitPages); + end; // First page number s := GetAttrValue(ANode, 'useFirstPageNumber'); + if s = '1' then + Include(AWorksheet.PageLayout.Options, poUseStartPageNumber); + + s := GetAttrValue(ANode, 'firstPageNumber'); if s <> '' then AWorksheet.PageLayout.StartPageNumber := StrToInt(s); @@ -2520,19 +2529,15 @@ begin break; end; - // Scaling factor - if AWorksheet.PageLayout.ScalingFactor <> 100 then - s := Format('%s scale="%.0f" fitToHeight="0" fitToWidth="0"', [ - s, AWorksheet.PageLayout.ScalingFactor - ], FPointSeparatorSettings); - - // Fit width pages - if AWorksheet.PageLayout.FitWidthToPages > 0 then + if poFitPages in AWorksheet.PageLayout.Options then + begin + // Fit width to pages s := Format('%s fitToWidth="%d"', [s, AWorksheet.PageLayout.FitWidthToPages]); - - // Fit height pages - if AWorksheet.PageLayout.FitHeightToPages > 0 then + // Fit height to pages s := Format('%s fitToHeight="%d"', [s, AWorksheet.PageLayout.FitHeightToPages]); + end else + // Scaling factor + s := Format('%s scale="%d"', [s, AWorksheet.PageLayout.ScalingFactor]); // Orientation s := Format('%s orientation="%s"', [ @@ -2541,7 +2546,9 @@ begin // First page number if poUseStartPageNumber in FWorksheet.PageLayout.Options then - s := Format('%s useFirstPageNumber="%d"', [s, AWorksheet.PageLayout.StartPageNumber]); + s := Format('%s useFirstPageNumber="1"', [s]); + + s := Format('%s firstPageNumber="%d"', [s, AWorksheet.PageLayout.StartPageNumber]); // Print order if poPrintPagesByRows in AWorksheet.PageLayout.Options then