我正在尝试将XML文件导入Excel。该文件基本上是一个站点地图,它只是所有页面的一棵树。如果在数据选项卡下,我使用"来自Web"选项(该文件来自API在线),导入只返回标题和根节点,而忽略其他3000多页。
我认为问题源于子页面的表示方式。主页有一个包含所有较低页面的子页面元素,而那些较低页面也都有子页面。我认为Excel只是忽略了子页面(也许它不知道如何处理它)。
Here is a picture of the top of the XML file:
提前感谢您的任何帮助。在在线帮助中,我甚至无法找到其他任何有此问题的人。
答案 0 :(得分:0)
好的,我已经找到了解决方案。我会尽力解释它。
首先,让我以一般方式重述问题(省略一些细节)。我有一个根数据节点,其中一个字段是一个包含更多相同类型节点的表。这些新节点也有相同类型节点的表,这可以永远持续下去。使用Power Query / Excel导入时,只显示根节点。我可以单击表格单元格,然后查看下一级别,但不能同时查看所有内容。
我需要做的是提取这些子表的内容并将它们附加到现有表的底部,并为表中的每一行(包括这些新添加的节点)执行此操作。如果您熟悉搜索算法,可以将其视为广度优先搜索(不是很重要,但对我有帮助)。
要复制的一篇有用的文章/代码来自此链接:https://blog.crossjoin.co.uk/2014/05/21/expanding-all-columns-in-a-table-in-power-query/
这不是解决方案,而是类似的(我的是基于它)。它水平扩展列,而我希望垂直附加内容。
最后,这是解决方案的代码。它是一个可以调用的Power Query函数,输入是要扩展的表。请注意,很多此解决方案都是针对我的问题而定的,如果您需要使用它,则需要对其进行编辑。我在评论中为你可能需要改变的东西做了一些笔记。
let
//Define function
Source = (TableToExpand as table, optional RowNumber as number) =>
let
//We only want subpages column, *you will need to change this*
ActualColumnNumber = 6,
//RowNumber starts at 0 by default
ActualRowNumber = if (RowNumber=null) then 0 else RowNumber,
//Find the column name relating to the column number
ColumnName = Table.ColumnNames(TableToExpand){ActualColumnNumber},
//Expands whole column once, only replaces column with next table
//*My subpage table was under another table, you will probably not need this line*
TempExpand1 = Table.ExpandTableColumn(TableToExpand, ColumnName, {"page"}, {"subpages.page"}),
//Get Cell for this iteration, the expansion table of the Cell
Cell = TempExpand1{ActualRowNumber}[subpages.page],
CanExpandCell = if Cell is table then true else false,
//*This just fixes up the data types. You will need to edit or delete this.*
ExpandedTable = if CanExpandCell = true
then
Table.TransformColumnTypes(Cell,{{"uri.ui", type text}, {"title", type text}, {"namespace", type text}, {"date.created", type datetime}, {"language", type text}, {"Attribute:id", Int64.Type}, {"Attribute:guid", type text}, {"Attribute:draft.state", type text}, {"Attribute:href", type text}, {"Attribute:deleted", type logical}})
else
Cell,
//If there was nothing to be expanded, just go to the next iteration
//Otherwise, Append ExpandedTable to TableToExpand,
NewTable = if CanExpandCell = false
then
TableToExpand
else
Table.Combine({TableToExpand, Cell}),
//If the row number is now greater than the number of row in the table
//Then return the table as it is
//Else call the ExpandAndAppend function recursively with the expanded table
NewRowNumber = ActualRowNumber + 1,
OutputTable = if NewRowNumber>(Table.RowCount(NewTable)-1)
then
NewTable
else
ExpandAndAppend(NewTable, NewRowNumber)
in
OutputTable
in
Source
希望它有某种意义。显然,如果其他人需要它,则需要进行修改。我想确保我的解决方案已记录在案,因为我无法在网上找到答案。