You've already forked lazarus-ccr
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:
@ -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>');
|
||||||
|
Reference in New Issue
Block a user