【问题标题】:excel powerquery replacevalues based on cellexcel电源查询根据单元格替换值
【发布时间】:2015-09-01 18:46:44
【问题描述】:

我正在使用 excel powerquery 从网站中提取数据,该网站是 http://www.timeanddate.com/holidays/south-africa/2014

网络表格以 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))),

但是 - 如果没有在网络结果表中指定年份,当导入到 excel 中时,它可以理解地插入自己的值(Excel 原生仅使用当前年份为 2015,powerquery 对信息的解释完全不同)等等;

  • 2001/01/01
  • 2020/03/01
  • 2021/03/01

这里有问题:

  1. 我希望能够使用单元格在查询中指定年份,将 myParm 替换为单元格值并在更改时刷新(可以使用 excel native 来完成,需要知道如何使用 powerquery 来完成)李>
  2. 我希望能够将生成的年份列数据中的年份值替换为上述单元格中的任何内容

【问题讨论】:

    标签: excel powerquery excel-web-query


    【解决方案1】:

    对于 #1,假设您有一个名为 YearTable 的 Excel 表,其中包含一个名为 Year 的列和一个包含所需年份值(例如 2015 年)的详细信息行,您可以使用此 M 表达式:

    Excel.CurrentWorkbook(){[Name="YearTable"]}[Content]{0}[Year]

    这会深入该表并从第一个详细信息行中提取值。

    例如,您可以将其嵌入到您的开头步骤中,例如

    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])

    然后,如果需要,您可以使用 Parse 按钮​​(转换功能区,在 Date 下)将其转换为 Date 数据类型。

    请注意我从该页面中获得的生成的更改类型步骤将日期转换为带有隐含年份的日期(您注意到的问题)。只需编辑该步骤的公式,将“日期”列设置为“文本”即可避免这种情况。

    这是我的整个测试 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"
    

    【讨论】:

      【解决方案2】:

      Colin Banfield 的另一个解决方案;

      1) 在 Excel 中,创建一个以 Year 为列名的表,并输入 year 作为行值。然后从表中创建一个查询。您的查询应具有一列和一行值。适当命名查询并保存。

      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) 中的原始表查询。

      b) #“Added Custom”这一步添加了一个新的自定义列,将Year列中的值传递给HolidayTable函数

      c) #"Added Custom1" 步骤添加了一个新的自定义列,该列根据 Year 列中的值以及原始 Date 列中的月份和日期值创建新日期。

      【讨论】:

        猜你喜欢
        • 2019-03-27
        • 1970-01-01
        • 1970-01-01
        • 2021-04-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-11-21
        相关资源
        最近更新 更多