excel 电源查询根据单元格替换值
excel powerquery replacevalues based on cell
我正在使用 excel powerquery 从站点提取数据,该站点是 http://www.timeanddate.com/holidays/south-africa/2014
网络 table 以 mmm dd so;
格式显示日期
- 1 月 1 日
- 3 月 20 日
- 3 月 21 日等
要获得不同年份的结果,我可以调用提示来请求年份输入并替换 URL 中的相关值,如下所示;
= let
#"Table 0" = (myParm)=>
let
Source = Web.Page(Web.Contents("http://www.timeanddate.com/holidays/south-africa/" & Number.ToText(myParm))),
但是 - 没有在网络结果中指定年份 table,当导入到 excel 时,它可以理解地在(Excel 本机中使用当前年份 2015, powerquery 以完全不同的方式解释信息) alla such;
- 2001/01/01
- 2020/03/01
- 2021/03/01
特此提出问题:
- 我希望能够使用单元格在查询中指定年份,将 myParm 替换为单元格值并在更改时刷新(可以使用 excel 本机实现,需要知道如何做它与 powerquery)
- 我希望能够用上述单元格中的任何内容替换结果年份列数据中的年份值
对于 #1,假设您有一个名为 YearTable 的 Excel Table,其中包含一个名为 Year 的列和一个包含所需年份值的详细信息行(例如 2015) , 你可以使用这个 M 表达式:
Excel.CurrentWorkbook(){[Name="YearTable"]}[Content]{0}[Year]
这会深入 table 并从第一个详细信息行中提取值。
例如,您可以将其嵌入到您的开头步骤中,例如
Web.Page(Web.Contents("http://www.timeanddate.com/holidays/south-africa/" & Number.ToText(Excel.CurrentWorkbook(){[Name="YearTable"]}[Content]{0}[Year])))
对于 #2,我将使用该表达式添加使用类似以下公式的添加列:
[Date] & " " & Number.ToText(Excel.CurrentWorkbook(){[Name="YearTable"]}[Content]{0}[Year])
然后,如果需要,您可以使用“解析”按钮(“转换”功能区,在“日期”下方)将其转换为“日期”数据类型。
请注意生成的更改类型步骤,我从该页面将日期转换为带有隐含年份的日期(您注意到的问题)。只需编辑该步骤的公式,将 "Date" 列设置为 "text" 即可避免这种情况。
这是我的整个测试 M 脚本:
let
Source = Web.Page(Web.Contents("http://www.timeanddate.com/holidays/south-africa/" & Number.ToText(Excel.CurrentWorkbook(){[Name="YearTable"]}[Content]{0}[Year]))),
Data0 = Source{0}[Data],
#"Changed Type" = Table.TransformColumnTypes(Data0,{{"Header", type text}, {"Date", type text}, {"Weekday", type text}, {"Holiday name", type text}, {"Holiday type", type text}}),
#"Added Derived Date" = Table.AddColumn(#"Changed Type", "Derived Date", each [Date] & " " & Number.ToText(Excel.CurrentWorkbook(){[Name="YearTable"]}[Content]{0}[Year])),
#"Parsed Date" = Table.TransformColumns(#"Added Derived Date",{{"Derived Date", each Date.From(DateTimeZone.From(_)), type date}})
in
#"Parsed Date"
Colin Banfield 的另一个解决方案;
1) 在Excel中,创建一个table,以Year作为列名,并输入年份作为行值。然后从 table 创建一个查询。您的查询应具有一列和一行值。适当地命名查询并保存。
2) 从网站获取数据。假设我们将查询命名为 HolidayTable。将查询转换为函数查询,例如
(Year as number)=>
let
Source = Web.Page(Web.Contents("www.timeanddate.com/holidays/south-africa/"&Number.ToText(Year))),
Data0 = Source{0}[Data],
#"Changed Type" = Table.TransformColumnTypes(Data0,{{"Header", type text}, {"Date", type date}, {"Weekday", type text}, {"Holiday name", type text}, {"Holiday type", type text}}),
#"Removed Columns" = Table.RemoveColumns(#"Changed Type",{"Header"})
in
#"Removed Columns"
3) 在步骤(1) 查询中将此函数添加为新列,并添加新的日期自定义列。在其他一些转换(列重新排序、列删除)之后,您应该得到如下所示的查询:
let
Source = Excel.CurrentWorkbook(){[Name="Table1"]}[Content],
#"Changed Type" = Table.TransformColumnTypes(Source,{{"Year", Int64.Type}}),
#"Added Custom" = Table.AddColumn(#"Changed Type", "Custom", each HolidayTable([Year])),
#"Expanded Custom" = Table.ExpandTableColumn(#"Added Custom", "Custom", {"Date", "Weekday", "Holiday name", "Holiday type"}, {"Date", "Weekday", "Holiday name", "Holiday type"}),
#"Added Custom1" = Table.AddColumn(#"Expanded Custom", "Calendar Date", each #date([Year],Date.Month([Date]),Date.Day([Date]))),
#"Reordered Columns" = Table.ReorderColumns(#"Added Custom1",{"Year", "Date", "Calendar Date", "Weekday", "Holiday name", "Holiday type"}),
#"Removed Columns" = Table.RemoveColumns(#"Reordered Columns",{"Year","Date"})
in
#"Removed Columns"
备注:
a) 前两行来自步骤 (1) 中的原始 table 查询。
b)#"Added Custom"步骤添加了一个新的自定义列,它将Year列中的值传递给HolidayTable函数
c) #"Added Custom1" 步骤添加了一个新的自定义列,它根据 Year 列中的值创建新日期,并根据原始 Date 列中的月和日值创建新日期。
我正在使用 excel powerquery 从站点提取数据,该站点是 http://www.timeanddate.com/holidays/south-africa/2014
网络 table 以 mmm dd so;
格式显示日期- 1 月 1 日
- 3 月 20 日
- 3 月 21 日等
要获得不同年份的结果,我可以调用提示来请求年份输入并替换 URL 中的相关值,如下所示;
= let
#"Table 0" = (myParm)=>
let
Source = Web.Page(Web.Contents("http://www.timeanddate.com/holidays/south-africa/" & Number.ToText(myParm))),
但是 - 没有在网络结果中指定年份 table,当导入到 excel 时,它可以理解地在(Excel 本机中使用当前年份 2015, powerquery 以完全不同的方式解释信息) alla such;
- 2001/01/01
- 2020/03/01
- 2021/03/01
特此提出问题:
- 我希望能够使用单元格在查询中指定年份,将 myParm 替换为单元格值并在更改时刷新(可以使用 excel 本机实现,需要知道如何做它与 powerquery)
- 我希望能够用上述单元格中的任何内容替换结果年份列数据中的年份值
对于 #1,假设您有一个名为 YearTable 的 Excel Table,其中包含一个名为 Year 的列和一个包含所需年份值的详细信息行(例如 2015) , 你可以使用这个 M 表达式:
Excel.CurrentWorkbook(){[Name="YearTable"]}[Content]{0}[Year]
这会深入 table 并从第一个详细信息行中提取值。
例如,您可以将其嵌入到您的开头步骤中,例如
Web.Page(Web.Contents("http://www.timeanddate.com/holidays/south-africa/" & Number.ToText(Excel.CurrentWorkbook(){[Name="YearTable"]}[Content]{0}[Year])))
对于 #2,我将使用该表达式添加使用类似以下公式的添加列:
[Date] & " " & Number.ToText(Excel.CurrentWorkbook(){[Name="YearTable"]}[Content]{0}[Year])
然后,如果需要,您可以使用“解析”按钮(“转换”功能区,在“日期”下方)将其转换为“日期”数据类型。
请注意生成的更改类型步骤,我从该页面将日期转换为带有隐含年份的日期(您注意到的问题)。只需编辑该步骤的公式,将 "Date" 列设置为 "text" 即可避免这种情况。
这是我的整个测试 M 脚本:
let
Source = Web.Page(Web.Contents("http://www.timeanddate.com/holidays/south-africa/" & Number.ToText(Excel.CurrentWorkbook(){[Name="YearTable"]}[Content]{0}[Year]))),
Data0 = Source{0}[Data],
#"Changed Type" = Table.TransformColumnTypes(Data0,{{"Header", type text}, {"Date", type text}, {"Weekday", type text}, {"Holiday name", type text}, {"Holiday type", type text}}),
#"Added Derived Date" = Table.AddColumn(#"Changed Type", "Derived Date", each [Date] & " " & Number.ToText(Excel.CurrentWorkbook(){[Name="YearTable"]}[Content]{0}[Year])),
#"Parsed Date" = Table.TransformColumns(#"Added Derived Date",{{"Derived Date", each Date.From(DateTimeZone.From(_)), type date}})
in
#"Parsed Date"
Colin Banfield 的另一个解决方案;
1) 在Excel中,创建一个table,以Year作为列名,并输入年份作为行值。然后从 table 创建一个查询。您的查询应具有一列和一行值。适当地命名查询并保存。
2) 从网站获取数据。假设我们将查询命名为 HolidayTable。将查询转换为函数查询,例如
(Year as number)=>
let
Source = Web.Page(Web.Contents("www.timeanddate.com/holidays/south-africa/"&Number.ToText(Year))),
Data0 = Source{0}[Data],
#"Changed Type" = Table.TransformColumnTypes(Data0,{{"Header", type text}, {"Date", type date}, {"Weekday", type text}, {"Holiday name", type text}, {"Holiday type", type text}}),
#"Removed Columns" = Table.RemoveColumns(#"Changed Type",{"Header"})
in
#"Removed Columns"
3) 在步骤(1) 查询中将此函数添加为新列,并添加新的日期自定义列。在其他一些转换(列重新排序、列删除)之后,您应该得到如下所示的查询:
let
Source = Excel.CurrentWorkbook(){[Name="Table1"]}[Content],
#"Changed Type" = Table.TransformColumnTypes(Source,{{"Year", Int64.Type}}),
#"Added Custom" = Table.AddColumn(#"Changed Type", "Custom", each HolidayTable([Year])),
#"Expanded Custom" = Table.ExpandTableColumn(#"Added Custom", "Custom", {"Date", "Weekday", "Holiday name", "Holiday type"}, {"Date", "Weekday", "Holiday name", "Holiday type"}),
#"Added Custom1" = Table.AddColumn(#"Expanded Custom", "Calendar Date", each #date([Year],Date.Month([Date]),Date.Day([Date]))),
#"Reordered Columns" = Table.ReorderColumns(#"Added Custom1",{"Year", "Date", "Calendar Date", "Weekday", "Holiday name", "Holiday type"}),
#"Removed Columns" = Table.RemoveColumns(#"Reordered Columns",{"Year","Date"})
in
#"Removed Columns"
备注:
a) 前两行来自步骤 (1) 中的原始 table 查询。
b)#"Added Custom"步骤添加了一个新的自定义列,它将Year列中的值传递给HolidayTable函数
c) #"Added Custom1" 步骤添加了一个新的自定义列,它根据 Year 列中的值创建新日期,并根据原始 Date 列中的月和日值创建新日期。