fpspreadsheet: Read/write hidden state of worksheets for xlsx files.

git-svn-id: https://svn.code.sf.net/p/lazarus-ccr/svn@5773 8e941d3f-bd1b-0410-a28a-d453659cc2b4
This commit is contained in:
wp_xxyyzz
2017-03-01 17:58:02 +00:00
parent 2a83ad41eb
commit 3750e3717d

View File

@ -55,6 +55,7 @@ type
FDateMode: TDateMode; FDateMode: TDateMode;
FPointSeparatorSettings: TFormatSettings; FPointSeparatorSettings: TFormatSettings;
FSharedStrings: TStringList; FSharedStrings: TStringList;
FSheetList: TFPList;
FFillList: TFPList; FFillList: TFPList;
FBorderList: TFPList; FBorderList: TFPList;
FHyperlinkList: TFPList; FHyperlinkList: TFPList;
@ -91,7 +92,7 @@ type
procedure ReadRow(ANode: TDOMNode; AWorksheet: TsWorksheet); procedure ReadRow(ANode: TDOMNode; AWorksheet: TsWorksheet);
procedure ReadSharedStrings(ANode: TDOMNode); procedure ReadSharedStrings(ANode: TDOMNode);
procedure ReadSheetFormatPr(ANode: TDOMNode; AWorksheet: TsWorksheet); procedure ReadSheetFormatPr(ANode: TDOMNode; AWorksheet: TsWorksheet);
procedure ReadSheetList(ANode: TDOMNode; AList: TStrings); procedure ReadSheetList(ANode: TDOMNode);
procedure ReadSheetViews(ANode: TDOMNode; AWorksheet: TsWorksheet); procedure ReadSheetViews(ANode: TDOMNode; AWorksheet: TsWorksheet);
procedure ReadThemeElements(ANode: TDOMNode); procedure ReadThemeElements(ANode: TDOMNode);
procedure ReadThemeColors(ANode: TDOMNode); procedure ReadThemeColors(ANode: TDOMNode);
@ -317,6 +318,12 @@ type
Formula: String; Formula: String;
end; end;
TSheetData = class
Name: String;
ID: String;
Hidden: Boolean;
end;
const const
PATTERN_TYPES: array [TsFillStyle] of string = ( PATTERN_TYPES: array [TsFillStyle] of string = (
'none', // fsNoFill 'none', // fsNoFill
@ -351,6 +358,7 @@ begin
FDateMode := XlsxSettings.DateMode; FDateMode := XlsxSettings.DateMode;
FSharedStrings := TStringList.Create; FSharedStrings := TStringList.Create;
FSheetList := TFPList.Create;
FFillList := TFPList.Create; FFillList := TFPList.Create;
FBorderList := TFPList.Create; FBorderList := TFPList.Create;
FHyperlinkList := TFPList.Create; FHyperlinkList := TFPList.Create;
@ -380,6 +388,10 @@ begin
TObject(FHyperlinkList[j]).Free; TObject(FHyperlinkList[j]).Free;
FHyperlinkList.Free; FHyperlinkList.Free;
for j := FSheetList.Count-1 downto 0 do
TObject(FSheetList[j]).Free;
FSheetList.Free;
for j := FSharedStrings.Count-1 downto 0 do for j := FSharedStrings.Count-1 downto 0 do
FSharedStrings.Objects[j].Free; FSharedStrings.Objects[j].Free;
FSharedStrings.Free; FSharedStrings.Free;
@ -1938,21 +1950,22 @@ begin
AWorksheet.WriteDefaultRowHeight(h, suPoints); AWorksheet.WriteDefaultRowHeight(h, suPoints);
end; end;
procedure TsSpreadOOXMLReader.ReadSheetList(ANode: TDOMNode; AList: TStrings); procedure TsSpreadOOXMLReader.ReadSheetList(ANode: TDOMNode);
var var
node: TDOMNode; node: TDOMNode;
nodename: String; nodename: String;
sheetName: String; sheetData: TSheetData;
sheetId: String;
begin begin
node := ANode.FirstChild; node := ANode.FirstChild;
while node <> nil do begin while node <> nil do begin
nodename := node.NodeName; nodename := node.NodeName;
if nodename = 'sheet' then if nodename = 'sheet' then
begin begin
sheetName := GetAttrValue(node, 'name'); sheetData := TSheetData.Create;
sheetId := GetAttrValue(node, 'sheetId'); sheetData.Name := GetAttrValue(node, 'name');
AList.AddObject(sheetName, TObject(ptrInt(StrToInt(sheetID)))); sheetData.ID := GetAttrvalue(node, 'sheetID');
sheetData.Hidden := GetAttrValue(node, 'state') = 'hidden';
FSheetList.Add(sheetData);
end; end;
node := node.NextSibling; node := node.NextSibling;
end; end;
@ -2122,7 +2135,6 @@ procedure TsSpreadOOXMLReader.ReadFromStream(AStream: TStream;
var var
Doc : TXMLDocument; Doc : TXMLDocument;
RelsNode: TDOMNode; RelsNode: TDOMNode;
SheetList: TStringList;
i, j: Integer; i, j: Integer;
fn: String; fn: String;
fn_comments: String; fn_comments: String;
@ -2143,7 +2155,7 @@ var
begin begin
Unused(AParams); Unused(AParams);
Doc := nil; Doc := nil;
SheetList := TStringList.Create;
try try
// Retrieve theme colors // Retrieve theme colors
XMLStream := CreateXMLStream; XMLStream := CreateXMLStream;
@ -2166,7 +2178,7 @@ begin
ReadXMLStream(Doc, XMLStream); ReadXMLStream(Doc, XMLStream);
ReadFileVersion(Doc.DocumentElement.FindNode('fileVersion')); ReadFileVersion(Doc.DocumentElement.FindNode('fileVersion'));
ReadDateMode(Doc.DocumentElement.FindNode('workbookPr')); ReadDateMode(Doc.DocumentElement.FindNode('workbookPr'));
ReadSheetList(Doc.DocumentElement.FindNode('sheets'), SheetList); ReadSheetList(Doc.DocumentElement.FindNode('sheets'));
//ReadDefinedNames(Doc.DocumentElement.FindNode('definedNames')); -- don't read here because sheets do not yet exist //ReadDefinedNames(Doc.DocumentElement.FindNode('definedNames')); -- don't read here because sheets do not yet exist
ReadActiveSheet(Doc.DocumentElement.FindNode('bookViews'), actSheetIndex); ReadActiveSheet(Doc.DocumentElement.FindNode('bookViews'), actSheetIndex);
FreeAndNil(Doc); FreeAndNil(Doc);
@ -2208,9 +2220,11 @@ begin
end; end;
// read worksheets // read worksheets
for i:=0 to SheetList.Count-1 do begin for i:=0 to FSheetList.Count-1 do begin
// Create worksheet // Create worksheet
FWorksheet := FWorkbook.AddWorksheet(SheetList[i], true); FWorksheet := FWorkbook.AddWorksheet(TSheetData(FSheetList[i]).Name, true);
if TSheetData(FSheetList[i]).Hidden then
FWorksheet.Options := FWorksheet.Options + [soHidden];
// unzip sheet file // unzip sheet file
XMLStream := CreateXMLStream; XMLStream := CreateXMLStream;
@ -2261,7 +2275,7 @@ begin
ReadHyperlinks(RelsNode); ReadHyperlinks(RelsNode);
FreeAndNil(Doc); FreeAndNil(Doc);
end else end else
if (SheetList.Count = 1) then if (FSheetList.Count = 1) then
// If the workbook has only one sheet then the sheet.xml.rels file // If the workbook has only one sheet then the sheet.xml.rels file
// is missing // is missing
fn_comments := 'comments1.xml' fn_comments := 'comments1.xml'
@ -2312,7 +2326,6 @@ begin
end; end;
finally finally
SheetList.Free;
FreeAndNil(Doc); FreeAndNil(Doc);
end; end;
end; end;
@ -4264,6 +4277,8 @@ var
actTab: String; actTab: String;
sheetName: String; sheetName: String;
counter: Integer; counter: Integer;
sheet: TsWorksheet;
sheetstate: String;
begin begin
actTab := IfThen(FWorkbook.ActiveWorksheet = nil, '', actTab := IfThen(FWorkbook.ActiveWorksheet = nil, '',
'activeTab="' + IntToStr(FWorkbook.GetWorksheetIndex(FWorkbook.ActiveWorksheet)) + '"'); 'activeTab="' + IntToStr(FWorkbook.GetWorksheetIndex(FWorkbook.ActiveWorksheet)) + '"');
@ -4285,10 +4300,12 @@ begin
'<sheets>'); '<sheets>');
for counter:=1 to Workbook.GetWorksheetCount do for counter:=1 to Workbook.GetWorksheetCount do
begin begin
sheetname := UTF8TextToXMLText(Workbook.GetWorksheetByIndex(counter-1).Name); sheet := Workbook.GetWorksheetByIndex(counter-1);
sheetname := UTF8TextToXMLText(sheet.Name);
sheetState := IfThen(soHidden in sheet.Options, ' state="hidden"', '');
AppendToStream(AStream, Format( AppendToStream(AStream, Format(
'<sheet name="%s" sheetId="%d" r:id="rId%d" />', '<sheet name="%s" sheetId="%d" r:id="rId%d"%s />',
[sheetname, counter, counter])); [sheetname, counter, counter, sheetstate]));
end; end;
AppendToStream(AStream, AppendToStream(AStream,
'</sheets>'); '</sheets>');