使用 Power Query 加载保存为 .xls 的 *.htm 文件(从第 5 行开始)
Load *.htm file saved as .xls (starting from row number 5) Using Power Query
我必须导入一个保存为 .*htm、.*html 的 .xls 文件。我附上了一个 link,它提供了该格式的示例文件。
table的实际第一行是从第5行开始的。但是上面有数据。
文件如下所示,
但请确保在其顶部包含一些行和一些测试值,并使其看起来像上面的屏幕截图。
如果上面没有行,则提供的以下M代码有效
let
Source = Folder.Files("C:\Users\aolson\Downloads\example-html.xls"),
#"Filtered Rows" = Table.SelectRows(Source, each ([Extension] = ".xls")),
#"C:\Users\aolson\Downloads\example-html xls\_example-html xls" = #"Filtered Rows"{[#"Folder Path"="C:\Users\aolson\Downloads\example-html.xls\",Name="example-html.xls"]}[Content],
#"Imported Excel" = Web.Page(#"C:\Users\aolson\Downloads\example-html xls\_example-html xls"){0}[Data]
in
#"Imported Excel"
当我在示例顶部添加行并单击 excel 中的保存时 - 它会警告我是否要继续使用相同的格式,然后单击 "YES"。
我尝试在查询编辑器上使用 children table。但它并没有带我去任何地方。
Source = Table cannot be found inside it at all.
无论出于何种原因,示例文件中的 HTML 具有 XML 解析器不喜欢的不匹配标签。如果您将数据作为文本加载并删除或修复解析器遇到问题的任何部分,您可以通过一些工作来获取数据。
考虑这个 M 代码:
let
Source = Table.FromColumns({Lines.FromBinary(File.Contents("C:\Users\aolson\Downloads\example-html.xls\example-html.xls"))}),
#"Kept Range of Rows" = Table.Range(Source,60,22),
Column1 = Text.Combine(#"Kept Range of Rows"[Column1]),
#"Parsed XML" = Xml.Tables(Column1),
Table = #"Parsed XML"{0}[Table],
#"Expanded td" = Table.ExpandTableColumn(Table, "td", {"i", "b", "span", "Element:Text"}, {"td.i", "td.b", "td.span", "td.Element:Text"}),
#"Expanded td.span" = Table.ExpandTableColumn(#"Expanded td", "td.span", {"Element:Text", "Attribute:style"}, {"td.span.Element:Text", "td.span.Attribute:style"})
in
#"Expanded td.span"
这里的步骤大致是:
- 将文件加载为文本
- Select 只是
<tbody>
部分。
- 将这些行连接成一个文本值。
- 将该文本解析为 XML。
- 展开找到的所有 table。
当我最初这样做时,我注意到 <b>
标签没有关闭,所以我在我的源文件中添加了一个 </b>
。
结果有点难看,但我怀疑如果你的实际数据文件不包含太多格式或不一致的 table 结构,那么你可以按照这些思路得到一些工作得很好的东西,特别是如果你只有一列要处理。
我必须导入一个保存为 .*htm、.*html 的 .xls 文件。我附上了一个 link,它提供了该格式的示例文件。
table的实际第一行是从第5行开始的。但是上面有数据。
文件如下所示,
但请确保在其顶部包含一些行和一些测试值,并使其看起来像上面的屏幕截图。
如果上面没有行,则
let
Source = Folder.Files("C:\Users\aolson\Downloads\example-html.xls"),
#"Filtered Rows" = Table.SelectRows(Source, each ([Extension] = ".xls")),
#"C:\Users\aolson\Downloads\example-html xls\_example-html xls" = #"Filtered Rows"{[#"Folder Path"="C:\Users\aolson\Downloads\example-html.xls\",Name="example-html.xls"]}[Content],
#"Imported Excel" = Web.Page(#"C:\Users\aolson\Downloads\example-html xls\_example-html xls"){0}[Data]
in
#"Imported Excel"
当我在示例顶部添加行并单击 excel 中的保存时 - 它会警告我是否要继续使用相同的格式,然后单击 "YES"。
我尝试在查询编辑器上使用 children table。但它并没有带我去任何地方。
Source = Table cannot be found inside it at all.
无论出于何种原因,示例文件中的 HTML 具有 XML 解析器不喜欢的不匹配标签。如果您将数据作为文本加载并删除或修复解析器遇到问题的任何部分,您可以通过一些工作来获取数据。
考虑这个 M 代码:
let
Source = Table.FromColumns({Lines.FromBinary(File.Contents("C:\Users\aolson\Downloads\example-html.xls\example-html.xls"))}),
#"Kept Range of Rows" = Table.Range(Source,60,22),
Column1 = Text.Combine(#"Kept Range of Rows"[Column1]),
#"Parsed XML" = Xml.Tables(Column1),
Table = #"Parsed XML"{0}[Table],
#"Expanded td" = Table.ExpandTableColumn(Table, "td", {"i", "b", "span", "Element:Text"}, {"td.i", "td.b", "td.span", "td.Element:Text"}),
#"Expanded td.span" = Table.ExpandTableColumn(#"Expanded td", "td.span", {"Element:Text", "Attribute:style"}, {"td.span.Element:Text", "td.span.Attribute:style"})
in
#"Expanded td.span"
这里的步骤大致是:
- 将文件加载为文本
- Select 只是
<tbody>
部分。 - 将这些行连接成一个文本值。
- 将该文本解析为 XML。
- 展开找到的所有 table。
当我最初这样做时,我注意到 <b>
标签没有关闭,所以我在我的源文件中添加了一个 </b>
。
结果有点难看,但我怀疑如果你的实际数据文件不包含太多格式或不一致的 table 结构,那么你可以按照这些思路得到一些工作得很好的东西,特别是如果你只有一列要处理。