fpspreadsheet: xlsx reading/writing support for hidden grid lines and headers

git-svn-id: https://svn.code.sf.net/p/lazarus-ccr/svn@3420 8e941d3f-bd1b-0410-a28a-d453659cc2b4
This commit is contained in:
wp_xxyyzz
2014-08-03 22:55:58 +00:00
parent b6d9f2f0f0
commit f0b57845bb
2 changed files with 68 additions and 2 deletions

View File

@ -69,6 +69,12 @@ type
procedure TestWriteRead_ODS_Panes_Hor; procedure TestWriteRead_ODS_Panes_Hor;
procedure TestWriteRead_ODS_Panes_Vert; procedure TestWriteRead_ODS_Panes_Vert;
procedure TestWriteRead_ODS_Panes_None; procedure TestWriteRead_ODS_Panes_None;
{ OOXML tests }
procedure TestWriteRead_OOXML_ShowGridLines_ShowHeaders;
procedure TestWriteRead_OOXML_ShowGridLines_HideHeaders;
procedure TestWriteRead_OOXML_HideGridLines_ShowHeaders;
procedure TestWriteRead_OOXML_HideGridLines_HideHeaders;
end; end;
implementation implementation
@ -220,6 +226,28 @@ begin
TestWriteReadGridHeaders(sfOpenDocument, false, false); TestWriteReadGridHeaders(sfOpenDocument, false, false);
end; end;
{ Tests for OOXML grid lines and/or headers }
procedure TSpreadWriteReadOptionsTests.TestWriteRead_OOXML_ShowGridLines_ShowHeaders;
begin
TestWriteReadGridHeaders(sfOOXML, true, true);
end;
procedure TSpreadWriteReadOptionsTests.TestWriteRead_OOXML_ShowGridLines_HideHeaders;
begin
TestWriteReadGridHeaders(sfOOXML, true, false);
end;
procedure TSpreadWriteReadOptionsTests.TestWriteRead_OOXML_HideGridLines_ShowHeaders;
begin
TestWriteReadGridHeaders(sfOOXML, false, true);
end;
procedure TSpreadWriteReadOptionsTests.TestWriteRead_OOXML_HideGridLines_HideHeaders;
begin
TestWriteReadGridHeaders(sfOOXML, false, false);
end;
{ Test for frozen panes } { Test for frozen panes }
procedure TSpreadWriteReadOptionsTests.TestWriteReadPanes(AFormat: TsSpreadsheetFormat; procedure TSpreadWriteReadOptionsTests.TestWriteReadPanes(AFormat: TsSpreadsheetFormat;

View File

@ -79,6 +79,7 @@ type
procedure ReadRowHeight(ANode: TDOMNode; AWorksheet: TsWorksheet); procedure ReadRowHeight(ANode: TDOMNode; AWorksheet: TsWorksheet);
procedure ReadSharedStrings(ANode: TDOMNode); procedure ReadSharedStrings(ANode: TDOMNode);
procedure ReadSheetList(ANode: TDOMNode; AList: TStrings); procedure ReadSheetList(ANode: TDOMNode; AList: TStrings);
procedure ReadSheetViews(ANode: TDOMNode; AWorksheet: TsWorksheet);
procedure ReadWorksheet(ANode: TDOMNode; AWorksheet: TsWorksheet); procedure ReadWorksheet(ANode: TDOMNode; AWorksheet: TsWorksheet);
protected protected
procedure ApplyCellFormatting(ACell: PCell; XfIndex: Integer); procedure ApplyCellFormatting(ACell: PCell; XfIndex: Integer);
@ -1014,6 +1015,30 @@ begin
end; end;
end; end;
procedure TsSpreadOOXMLReader.ReadSheetViews(ANode: TDOMNode; AWorksheet: TsWorksheet);
var
sheetViewNode: TDOMNode;
nodeName: String;
s: String;
begin
if ANode = nil then
exit;
sheetViewNode := ANode.FirstChild;
while Assigned(sheetViewNode) do begin
nodeName := sheetViewNode.NodeName;
if nodeName = 'sheetView' then begin
s := GetAttrValue(sheetViewNode, 'showGridLines');
if s = '0' then
AWorksheet.Options := AWorksheet.Options - [soShowGridLines];
s := GetAttrValue(sheetViewNode, 'showRowColHeaders');
if s = '0' then
AWorksheet.Options := AWorksheet.Options - [soShowHeaders];
end;
sheetViewNode := sheetViewNode.NextSibling;
end;
end;
procedure TsSpreadOOXMLReader.ReadWorksheet(ANode: TDOMNode; AWorksheet: TsWorksheet); procedure TsSpreadOOXMLReader.ReadWorksheet(ANode: TDOMNode; AWorksheet: TsWorksheet);
var var
rownode: TDOMNode; rownode: TDOMNode;
@ -1124,6 +1149,7 @@ begin
FWorksheet := AData.AddWorksheet(SheetList[i]); FWorksheet := AData.AddWorksheet(SheetList[i]);
ReadSheetViews(Doc.DocumentElement.FindNode('sheetViews'), FWorksheet);
ReadCols(Doc.DocumentElement.FindNode('cols'), FWorksheet); ReadCols(Doc.DocumentElement.FindNode('cols'), FWorksheet);
ReadWorksheet(Doc.DocumentElement.FindNode('sheetData'), FWorksheet); ReadWorksheet(Doc.DocumentElement.FindNode('sheetData'), FWorksheet);
@ -1851,6 +1877,8 @@ var
row: PRow; row: PRow;
rh: String; rh: String;
h0: Single; h0: Single;
showGridLines: String;
showHeaders: String;
begin begin
FCurSheetNum := Length(FSSheets); FCurSheetNum := Length(FSSheets);
SetLength(FSSheets, FCurSheetNum + 1); SetLength(FSSheets, FCurSheetNum + 1);
@ -1863,14 +1891,24 @@ begin
FSSheets[FCurSheetNum] := TMemoryStream.Create; FSSheets[FCurSheetNum] := TMemoryStream.Create;
// Header // Header
if not (soShowGridLines in CurSheet.Options) then
showGridLines := 'showGridLines="0"'
else
showGridLines := '';
if not (soShowHeaders in CurSheet.Options) then
showHeaders := 'showRowColHeaders="0"'
else
showHeaders := '';
AppendToStream(FSSheets[FCurSheetNum], AppendToStream(FSSheets[FCurSheetNum],
XML_HEADER); XML_HEADER);
AppendToStream(FSSheets[FCurSheetNum], Format( AppendToStream(FSSheets[FCurSheetNum], Format(
'<worksheet xmlns="%s" xmlns:r="%s">', [SCHEMAS_SPREADML, SCHEMAS_DOC_RELS])); '<worksheet xmlns="%s" xmlns:r="%s">', [SCHEMAS_SPREADML, SCHEMAS_DOC_RELS]));
AppendToStream(FSSheets[FCurSheetNum], AppendToStream(FSSheets[FCurSheetNum],
'<sheetViews>'); '<sheetViews>');
AppendToStream(FSSheets[FCurSheetNum], AppendToStream(FSSheets[FCurSheetNum], Format(
'<sheetView workbookViewId="0" />'); '<sheetView workbookViewId="0" %s %s />', [showGridLines, showHeaders]));
AppendToStream(FSSheets[FCurSheetNum], AppendToStream(FSSheets[FCurSheetNum],
'</sheetViews>'); '</sheetViews>');