fpspreadsheet: Fix some missing page layout values not being written to Excel2003/XML files (not finished yet).

git-svn-id: https://svn.code.sf.net/p/lazarus-ccr/svn@7054 8e941d3f-bd1b-0410-a28a-d453659cc2b4
This commit is contained in:
wp_xxyyzz
2019-07-18 22:43:54 +00:00
parent 476d4d795a
commit 7cabba34eb

View File

@ -49,6 +49,7 @@ type
procedure ReadInterior(ANode: TDOMNode; var AFormat: TsCellFormat);
procedure ReadNames(ANode: TDOMNode; AWorksheet: TsBasicWorksheet);
procedure ReadNumberFormat(ANode: TDOMNode; var AFormat: TsCellFormat);
procedure ReadPageSetup(ANode: TDOMNode; AWorksheet: TsBasicWorksheet);
procedure ReadRow(ANode: TDOMNode; AWorksheet: TsBasicWorksheet; ARow: Integer);
procedure ReadStyle(ANode: TDOMNode);
procedure ReadStyles(ANode: TDOMNode);
@ -879,6 +880,70 @@ begin
Include(AFormat.UsedFormattingFields, uffNumberFormat);
end;
{@@ ----------------------------------------------------------------------------
Reads the "WorksheetOptions/PageSetup" node
-------------------------------------------------------------------------------}
procedure TsSpreadExcelXMLReader.ReadPageSetup(ANode: TDOMNode;
AWorksheet: TsBasicWorksheet);
var
sheet: TsWorksheet absolute AWorksheet;
nodeName: String;
s: String;
n: Integer;
x: Double;
begin
while ANode <> nil do begin
nodeName := ANode.NodeName;
if nodeName = 'Layout' then begin
s := GetAttrValue(ANode, 'x:Orientation');
if s = 'Landscape' then
sheet.PageLayout.Orientation := spoLandscape;
s := GetAttrValue(ANode, 'x:CenterHorizontal');
if s = '1' then
sheet.PageLayout.Options := sheet.PageLayout.Options + [poHorCentered];
s := GetAttrValue(ANode, 'x:CenterVertical');
if s = '1' then
sheet.PageLayout.Options := sheet.PageLayout.Options + [poVertCentered];
s := GetAttrValue(ANode, 'x:StartPageNumber');
if (s <> '') and TryStrToInt(s, n) then
sheet.PageLayout.StartPageNumber := n;
end
else if nodeName = 'Header' then begin
s := GetAttrValue(ANode, 'x:Margin');
if (s <> '') and TryStrToFloat(s, x, FPointSeparatorSettings) then
sheet.PageLayout.HeaderMargin := InToMM(x);
s := GetAttrValue(ANode, 'x:Data');
sheet.PageLayout.Headers[0] := s;
sheet.PageLayout.Headers[1] := s;
sheet.PageLayout.Headers[2] := s;
end
else if nodeName = 'Footer' then begin
s := GetAttrValue(ANode, 'x:Margin');
if (s <> '') and TryStrToFloat(s, x, FPointSeparatorSettings) then
sheet.PageLayout.FooterMargin := InToMM(x);
s := GetAttrValue(ANode, 'x:Data');
sheet.PageLayout.Footers[0] := s;
sheet.PageLayout.Footers[1] := s;
sheet.PageLayout.Footers[2] := s;
end
else if nodeName = 'PageMargins' then begin
s := GetAttrValue(ANode, 'x:Bottom');
if (s <> '') and TryStrToFloat(s, x, FPointSeparatorSettings) then
sheet.PageLayout.BottomMargin := InToMM(x);
s := GetAttrValue(ANode, 'x:Top');
if (s <> '') and TryStrToFloat(s, x, FPointSeparatorSettings) then
sheet.PageLayout.TopMargin := InToMM(x);
s := GetAttrValue(ANode, 'x:Left');
if (s <> '') and TryStrToFloat(s, x, FPointSeparatorSettings) then
sheet.PageLayout.LeftMargin := InToMM(x);
s := GetAttrValue(ANode, 'x:Right');
if (s <> '') and TryStrToFloat(s, x, FPointSeparatorSettings) then
sheet.PageLayout.RightMargin := InToMM(x);
end;
ANode := ANode.NextSibling;
end;
end;
{@@ ----------------------------------------------------------------------------
Reads a "Worksheet/Table/Row" node
-------------------------------------------------------------------------------}
@ -1121,59 +1186,9 @@ begin
while ANode <> nil do begin
nodeName := ANode.NodeName;
if nodeName = 'PageSetup' then begin
node := ANode.FirstChild;
while node <> nil do begin
nodeName := node.NodeName;
if nodeName = 'Layout' then begin
s := GetAttrValue(node, 'x:Orientation');
if s = 'Landscape' then
sheet.PageLayout.Orientation := spoLandscape;
s := GetAttrValue(node, 'x:CenterHorizontal');
if s = '1' then
sheet.PageLayout.Options := sheet.PageLayout.Options + [poHorCentered];
s := GetAttrValue(node, 'x:CenterVertical');
if s = '1' then
sheet.PageLayout.Options := sheet.PageLayout.Options + [poVertCentered];
s := GetAttrValue(node, 'x:StartPageNumber');
if (s <> '') and TryStrToInt(s, n) then
sheet.PageLayout.StartPageNumber := n;
end
else if nodeName = 'Header' then begin
s := GetAttrValue(node, 'x:Margin');
if (s <> '') and TryStrToFloat(s, x, FPointSeparatorSettings) then
sheet.PageLayout.HeaderMargin := InToMM(x);
s := GetAttrValue(node, 'x:Data');
sheet.PageLayout.Headers[0] := s;
sheet.PageLayout.Headers[1] := s;
sheet.PageLayout.Headers[2] := s;
end
else if nodeName = 'Footer' then begin
s := GetAttrValue(node, 'x:Margin');
if (s <> '') and TryStrToFloat(s, x, FPointSeparatorSettings) then
sheet.PageLayout.FooterMargin := InToMM(x);
s := GetAttrValue(node, 'x:Data');
sheet.PageLayout.Footers[0] := s;
sheet.PageLayout.Footers[1] := s;
sheet.PageLayout.Footers[2] := s;
end
else if nodeName = 'PageMargins' then begin
s := GetAttrValue(node, 'x:Bottom');
if (s <> '') and TryStrToFloat(s, x, FPointSeparatorSettings) then
sheet.PageLayout.BottomMargin := InToMM(x);
s := GetAttrValue(node, 'x:Top');
if (s <> '') and TryStrToFloat(s, x, FPointSeparatorSettings) then
sheet.PageLayout.TopMargin := InToMM(x);
s := GetAttrValue(node, 'x:Left');
if (s <> '') and TryStrToFloat(s, x, FPointSeparatorSettings) then
sheet.PageLayout.LeftMargin := InToMM(x);
s := GetAttrValue(node, 'x:Right');
if (s <> '') and TryStrToFloat(s, x, FPointSeparatorSettings) then
sheet.PageLayout.RightMargin := InToMM(x);
end;
node := node.NextSibling;
end;
end else
if nodeName = 'PageSetup' then
ReadPageSetup(ANode.FirstChild, AWorksheet)
else
if nodeName = 'FitToPage' then begin
hasFitToPage := true;
sheet.PageLayout.Options := sheet.PageLayout.Options + [poFitPages];
@ -2232,6 +2247,7 @@ end;
procedure TsSpreadExcelXMLWriter.WriteWorksheetOptions(AStream: TStream;
AWorksheet: TsBasicWorksheet);
var
i: Integer;
footerStr, headerStr: String;
hideGridStr: String;
hideHeadersStr: String;
@ -2241,6 +2257,8 @@ var
selectedStr: String;
protectStr: String;
visibleStr: String;
printStr: String;
scaleStr: String;
sheet: TsWorksheet absolute AWorksheet;
begin
// Orientation, some PageLayout.Options
@ -2276,6 +2294,27 @@ begin
else
selectedStr := '';
// Scaling factor
if sheet.PageLayout.ScalingFactor <> 100 then
scaleStr := '<Scale>' + IntToStr(sheet.PageLayout.ScalingFactor) + '</Scale>' + LF + INDENT4
else
scaleStr := '';
// Print node
printStr := '';
for i:=0 to High(PAPER_SIZES) do
if (SameValue(PAPER_SIZES[i,0], sheet.PageLayout.PageHeight) and
SameValue(PAPER_SIZES[i,1], sheet.PageLayout.PageWidth))
or (SameValue(PAPER_SIZES[i,1], sheet.PageLayout.PageHeight) and
SameValue(PAPER_SIZES[i,0], sheet.PageLayout.PageWidth))
then begin
printStr := INDENT4 +
'<ValidPrinterInfo/>' + LF + INDENT4 +
'<PaperSizeIndex>' + IntToStr(i) + '</PaperSizeIndex>' + LF + INDENT4 +
scaleStr +
'<VerticalResolution>0</VerticalResolution>';
break;
end;
// Visible
if (soHidden in AWorksheet.Options) then
visibleStr := INDENT3 + '<Visible>SheetHidden</Visible>' + LF
@ -2302,7 +2341,10 @@ begin
headerStr +
footerStr +
marginStr + INDENT3 +
'</PageSetup>' + LF +
'</PageSetup>' + LF + INDENT3 +
'<Print>' + LF +
printStr + LF + INDENT3 +
'</Print>' + LF +
visibleStr +
selectedStr +
protectStr +