fpspreadsheet: Excel2003/XML fileformat now fully supports page breaks.

git-svn-id: https://svn.code.sf.net/p/lazarus-ccr/svn@7070 8e941d3f-bd1b-0410-a28a-d453659cc2b4
This commit is contained in:
wp_xxyyzz
2019-07-24 08:23:38 +00:00
parent aece082d53
commit abe882b551
3 changed files with 118 additions and 7 deletions

View File

@ -49,6 +49,8 @@ type
procedure ReadInterior(ANode: TDOMNode; var AFormat: TsCellFormat); procedure ReadInterior(ANode: TDOMNode; var AFormat: TsCellFormat);
procedure ReadNames(ANode: TDOMNode; AWorksheet: TsBasicWorksheet); procedure ReadNames(ANode: TDOMNode; AWorksheet: TsBasicWorksheet);
procedure ReadNumberFormat(ANode: TDOMNode; var AFormat: TsCellFormat); procedure ReadNumberFormat(ANode: TDOMNode; var AFormat: TsCellFormat);
procedure ReadPageBreak(ANode: TDOMNode; AWorksheet: TsBasicWorksheet);
procedure ReadPageBreaks(ANode: TDOMNode; AWorksheet: TsBasicWorksheet);
procedure ReadPageSetup(ANode: TDOMNode; AWorksheet: TsBasicWorksheet); procedure ReadPageSetup(ANode: TDOMNode; AWorksheet: TsBasicWorksheet);
procedure ReadPrint(ANode: TDOMNode; AWorksheet: TsBasicWorksheet); procedure ReadPrint(ANode: TDOMNode; AWorksheet: TsBasicWorksheet);
procedure ReadRow(ANode: TDOMNode; AWorksheet: TsBasicWorksheet; ARow: Integer); procedure ReadRow(ANode: TDOMNode; AWorksheet: TsBasicWorksheet; ARow: Integer);
@ -930,6 +932,72 @@ begin
Include(AFormat.UsedFormattingFields, uffNumberFormat); Include(AFormat.UsedFormattingFields, uffNumberFormat);
end; end;
{@@ ----------------------------------------------------------------------------
Reads a "Worksheet / PageBreaks / RowBreaks / RowBreak" node
or a "Worksheet / PageBreaks / ColBreaks / ColBreak" node
-------------------------------------------------------------------------------}
procedure TsSpreadExcelXMLReader.ReadPageBreak(ANode: TDOMNode;
AWorksheet: TsBasicWorksheet);
var
sheet: TsWorksheet absolute AWorksheet;
node: TDOMNode;
nodeName: String;
s: String;
n: Integer;
begin
while ANode <> nil do begin
nodeName := ANode.NodeName;
if nodeName = 'Row' then begin
s := ANode.TextContent;
if (s <> '') and TryStrToInt(s, n) then
sheet.AddPageBreakToRow(n);
end else
if nodeName = 'Column' then begin
s := ANode.TextContent;
if (s <> '') and TryStrToInt(s, n) then
sheet.AddPageBreakToCol(n);
end;
ANode := ANode.NextSibling;
end;
end;
{@@ ----------------------------------------------------------------------------
Reads the "Wrksheet / PageBreaks" node
-------------------------------------------------------------------------------}
procedure TsSpreadExcelXMLReader.ReadPageBreaks(ANode: TDOMNode;
AWorksheet: TsBasicWorksheet);
var
sheet: TsWorksheet absolute AWorksheet;
nodeName: String;
node: TDOMNode;
child: TDOMNode;
s: String;
begin
while ANode <> nil do
begin
nodeName := ANode.NodeName;
if nodeName = 'RowBreaks' then begin
node := ANode.FirstChild;
while node <> nil do begin
nodeName := node.NodeName;
if nodeName = 'RowBreak' then
ReadPageBreak(node.FirstChild, AWorksheet);
node := node.NextSibling;
end;
end else
if nodeName = 'ColBreaks' then begin
node := ANode.FirstChild;
while node <> nil do begin
nodeName := node.NodeName;
if nodeName = 'ColBreak' then
ReadPageBreak(node.FirstChild, AWorksheet);
node := node.NextSibling;
end;
end;
ANode := ANode.NextSibling;
end;
end;
{@@ ---------------------------------------------------------------------------- {@@ ----------------------------------------------------------------------------
Reads the "WorksheetOptions/PageSetup" node Reads the "WorksheetOptions/PageSetup" node
-------------------------------------------------------------------------------} -------------------------------------------------------------------------------}
@ -1163,6 +1231,11 @@ begin
while ANode <> nil do begin while ANode <> nil do begin
nodeName := ANode.NodeName; nodeName := ANode.NodeName;
if nodeName = 'Column' then begin if nodeName = 'Column' then begin
// Default column width
s := GetAttrValue(ANode, 'ss:DefaultColumnWidth');
if (s <> '') and TryStrToFloat(s, x, FPointSeparatorSettings) then
sheet.WriteDefaultColWidth(x, suPoints);
// Column index // Column index
s := GetAttrValue(ANode, 'ss:Index'); s := GetAttrValue(ANode, 'ss:Index');
if (s <> '') and TryStrToInt(s, c) then if (s <> '') and TryStrToInt(s, c) then
@ -1193,11 +1266,6 @@ begin
end end
else else
if nodeName = 'Row' then begin if nodeName = 'Row' then begin
// Default column width
s := GetAttrValue(ANode, 'ss:DefaultColumnWidth');
if (s <> '') and TryStrToFloat(s, x, FPointSeparatorSettings) then
sheet.WriteDefaultColWidth(x, suPoints);
// Default row height // Default row height
s := GetAttrValue(ANode, 'ss:DefaultRowHeight'); s := GetAttrValue(ANode, 'ss:DefaultRowHeight');
if (s <> '') and TryStrToFloat(s, x, FPointSeparatorSettings) then if (s <> '') and TryStrToFloat(s, x, FPointSeparatorSettings) then
@ -1268,7 +1336,9 @@ begin
else if nodeName = 'WorksheetOptions' then else if nodeName = 'WorksheetOptions' then
ReadWorksheetOptions(ANode.FirstChild, AWorksheet) ReadWorksheetOptions(ANode.FirstChild, AWorksheet)
else if nodeName = 'Names' then else if nodeName = 'Names' then
ReadNames(ANode.FirstChild, AWorksheet); ReadNames(ANode.FirstChild, AWorksheet)
else if nodeName = 'PageBreaks' then
ReadPageBreaks(ANode.FirstChild, AWorksheet);
ANode := ANode.NextSibling; ANode := ANode.NextSibling;
end; end;
end; end;

View File

@ -3852,7 +3852,6 @@ begin
Worksheet.ReadDefaultRowHeight(Workbook.Units), unitStr, Worksheet.ReadDefaultRowHeight(Workbook.Units), unitStr,
Worksheet.ReadDefaultRowHeight(suPoints) Worksheet.ReadDefaultRowHeight(suPoints)
])); ]));
// UpdateFormatProperties(-1, AStrings);
end; end;
end; end;

View File

@ -288,12 +288,21 @@ type
procedure TestWriteRead_AddPageBreak_Row_OOXML; procedure TestWriteRead_AddPageBreak_Row_OOXML;
procedure TestWriteRead_AddPageBreak_RowHidden_OOXML; procedure TestWriteRead_AddPageBreak_RowHidden_OOXML;
procedure TestWriteRead_AddPageBreak_Col_XML;
procedure TestWriteRead_AddPageBreak_ColHidden_XML;
procedure TestWriteRead_AddPageBreak_Row_XML;
procedure TestWriteRead_AddPageBreak_RowHidden_XML;
// Remove a page break column // Remove a page break column
procedure TestWriteRead_RemovePageBreak_Col_OOXML; procedure TestWriteRead_RemovePageBreak_Col_OOXML;
procedure TestWriteRead_RemovePageBreak_ColHidden_OOXML; procedure TestWriteRead_RemovePageBreak_ColHidden_OOXML;
procedure TestWriteRead_RemovePageBreak_Row_OOXML; procedure TestWriteRead_RemovePageBreak_Row_OOXML;
procedure TestWriteRead_RemovePageBreak_RowHidden_OOXML; procedure TestWriteRead_RemovePageBreak_RowHidden_OOXML;
procedure TestWriteRead_RemovePageBreak_Col_XML;
procedure TestWriteRead_RemovePageBreak_ColHidden_XML;
procedure TestWriteRead_RemovePageBreak_Row_XML;
procedure TestWriteRead_RemovePageBreak_RowHidden_XML;
end; end;
implementation implementation
@ -2238,6 +2247,23 @@ begin
TestWriteRead_AddPageBreak_Row(true, sfOOXML); TestWriteRead_AddPageBreak_Row(true, sfOOXML);
end; end;
procedure TSpreadWriteRead_ColRow_Tests.TestWriteRead_AddPageBreak_Col_XML;
begin
TestWriteRead_AddPageBreak_Col(false, sfExcelXML);
end;
procedure TSpreadWriteRead_ColRow_Tests.TestWriteRead_AddPageBreak_Row_XML;
begin
TestWriteRead_AddPageBreak_Row(false, sfExcelXML);
end;
procedure TSpreadWriteRead_ColRow_Tests.TestWriteRead_AddPageBreak_ColHidden_XML;
begin
TestWriteRead_AddPageBreak_Col(true, sfExcelXML);
end;
procedure TSpreadWriteRead_ColRow_Tests.TestWriteRead_AddPageBreak_RowHidden_XML;
begin
TestWriteRead_AddPageBreak_Row(true, sfExcelXML);
end;
{ Remove page break { Remove page break
- Hidden: set the Hidden flag in the options to test whether it is damaged - Hidden: set the Hidden flag in the options to test whether it is damaged
@ -2405,6 +2431,22 @@ begin
TestWriteRead_RemovePageBreak_Row(true, sfOOXML); TestWriteRead_RemovePageBreak_Row(true, sfOOXML);
end; end;
procedure TSpreadWriteRead_ColRow_Tests.TestWriteRead_RemovePageBreak_Col_XML;
begin
TestWriteRead_RemovePageBreak_Col(false, sfExcelXML);
end;
procedure TSpreadWriteRead_ColRow_Tests.TestWriteRead_RemovePageBreak_Row_XML;
begin
TestWriteRead_RemovePageBreak_Row(false, sfExcelXML);
end;
procedure TSpreadWriteRead_ColRow_Tests.TestWriteRead_RemovePageBreak_ColHidden_XML;
begin
TestWriteRead_RemovePageBreak_Col(true, sfExcelXML);
end;
procedure TSpreadWriteRead_ColRow_Tests.TestWriteRead_RemovePageBreak_RowHidden_XML;
begin
TestWriteRead_RemovePageBreak_Row(true, sfExcelXML);
end;
initialization initialization
RegisterTest(TSpreadWriteRead_ColRow_Tests); RegisterTest(TSpreadWriteRead_ColRow_Tests);