-
Notifications
You must be signed in to change notification settings - Fork 13
Open
Labels
Description
Power-Query-Excel-Formats/RowsOutline/ExcelWorksheetsRowOutlines.pq
Lines 111 to 165 in 8909b10
Source = Excel.Workbook(File.Contents(FullPath), false, true), | |
// leave sheets only | |
FilteredSheets = Table.SelectRows(Source, each ([Kind] = "Sheet")), | |
// sheets in PQ initially in appearance order, i.e. sheets index (despite visibility) | |
AddSheetsIndex = Table.AddIndexColumn(FilteredSheets, "Index", 1, 1), | |
// check SheetNames parameter | |
SheetNames = if SheetNames is text then {SheetNames} else if SheetNames is list then SheetNames else null, | |
// filter sheets by name if provided | |
FilteredByNames = if SheetNames = null or List.IsEmpty(SheetNames) then AddSheetsIndex else Table.SelectRows(AddSheetsIndex, each List.Contains(SheetNames, [Name])), | |
// UnZip file | |
UnZipped = Table.Buffer(fnUnZip(File.Contents(FullPath))), | |
/* | |
let | |
Source = Folder.Files(Folder), | |
file = Source{[Name = FileName, Folder Path = Folder & "\"]}[Content], | |
UnZippedFile = Table.Buffer(fnUnZip(file)) | |
in | |
Table.Buffer(UnZippedFile), | |
*/ | |
// relations id table for sheets | |
workbook = | |
let | |
Source = UnZipped, | |
Content = Source{[FileName ="xl/workbook.xml"]}[Content], | |
ImportedXML = Xml.Tables(Content,null,TextEncoding.Utf8), | |
sheetsTable = ImportedXML{[Name = "sheets"]}[Table], | |
sheetTable = sheetsTable{[Name = "sheet"]}[Table], | |
ExpandedRel = Table.ExpandTableColumn(sheetTable, "http://schemas.openxmlformats.org/officeDocument/2006/relationships", {"Attribute:id"}, {"Attribute:id"}), | |
typed = Table.TransformColumnTypes(ExpandedRel,{{"Attribute:name", type text}, {"Attribute:sheetId", Int64.Type}, {"Attribute:id", type text}}) | |
in | |
typed, | |
// sheets relations id to XML target files | |
workbook_rels = | |
let | |
Source = UnZipped, | |
Filtered = Table.SelectRows(Source, each [FileName]="xl/_rels/workbook.xml.rels"), | |
GetXML = Table.TransformColumns(Filtered, {"Content", each Xml.Tables(_,null,65001)}), | |
XMLContent = GetXML{0}[Content]{[Name="Relationship"]}[Table], | |
FilteredSheetsRel = Table.SelectRows(XMLContent, each [#"Attribute:Type"] = "http://schemas.openxmlformats.org/officeDocument/2006/relationships/worksheet"), | |
Removed = Table.RemoveColumns(FilteredSheetsRel,{"Attribute:Type"}) | |
in | |
Removed, | |
// merge relations id (via sheets name) | |
MergedRelationsID = Table.Join(FilteredByNames, {"Name"}, workbook, {"Attribute:name"}), | |
// join workbook relations | |
MergedRelationsTarget = Table.Join(MergedRelationsID,{"Attribute:id"},workbook_rels,{"Attribute:Id"}), |