From f0b57845bb61b650d757a2c5a0a7acfe86930a3c Mon Sep 17 00:00:00 2001 From: wp_xxyyzz Date: Sun, 3 Aug 2014 22:55:58 +0000 Subject: [PATCH] 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 --- .../fpspreadsheet/tests/optiontests.pas | 28 +++++++++++++ components/fpspreadsheet/xlsxooxml.pas | 42 ++++++++++++++++++- 2 files changed, 68 insertions(+), 2 deletions(-) diff --git a/components/fpspreadsheet/tests/optiontests.pas b/components/fpspreadsheet/tests/optiontests.pas index 46b070e78..524907405 100644 --- a/components/fpspreadsheet/tests/optiontests.pas +++ b/components/fpspreadsheet/tests/optiontests.pas @@ -69,6 +69,12 @@ type procedure TestWriteRead_ODS_Panes_Hor; procedure TestWriteRead_ODS_Panes_Vert; 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; implementation @@ -220,6 +226,28 @@ begin TestWriteReadGridHeaders(sfOpenDocument, false, false); 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 } procedure TSpreadWriteReadOptionsTests.TestWriteReadPanes(AFormat: TsSpreadsheetFormat; diff --git a/components/fpspreadsheet/xlsxooxml.pas b/components/fpspreadsheet/xlsxooxml.pas index ea262480d..53b04d4b6 100755 --- a/components/fpspreadsheet/xlsxooxml.pas +++ b/components/fpspreadsheet/xlsxooxml.pas @@ -79,6 +79,7 @@ type procedure ReadRowHeight(ANode: TDOMNode; AWorksheet: TsWorksheet); procedure ReadSharedStrings(ANode: TDOMNode); procedure ReadSheetList(ANode: TDOMNode; AList: TStrings); + procedure ReadSheetViews(ANode: TDOMNode; AWorksheet: TsWorksheet); procedure ReadWorksheet(ANode: TDOMNode; AWorksheet: TsWorksheet); protected procedure ApplyCellFormatting(ACell: PCell; XfIndex: Integer); @@ -1014,6 +1015,30 @@ begin 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); var rownode: TDOMNode; @@ -1124,6 +1149,7 @@ begin FWorksheet := AData.AddWorksheet(SheetList[i]); + ReadSheetViews(Doc.DocumentElement.FindNode('sheetViews'), FWorksheet); ReadCols(Doc.DocumentElement.FindNode('cols'), FWorksheet); ReadWorksheet(Doc.DocumentElement.FindNode('sheetData'), FWorksheet); @@ -1851,6 +1877,8 @@ var row: PRow; rh: String; h0: Single; + showGridLines: String; + showHeaders: String; begin FCurSheetNum := Length(FSSheets); SetLength(FSSheets, FCurSheetNum + 1); @@ -1863,14 +1891,24 @@ begin FSSheets[FCurSheetNum] := TMemoryStream.Create; // 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], XML_HEADER); AppendToStream(FSSheets[FCurSheetNum], Format( '', [SCHEMAS_SPREADML, SCHEMAS_DOC_RELS])); AppendToStream(FSSheets[FCurSheetNum], ''); - AppendToStream(FSSheets[FCurSheetNum], - ''); + AppendToStream(FSSheets[FCurSheetNum], Format( + '', [showGridLines, showHeaders])); AppendToStream(FSSheets[FCurSheetNum], '');