可以使用数据透视函数合并具有这种结构并存储在不同工作表中的表格。这里有 2 个场景,假设每个表格都保存在一个单个 Excel 工作簿中的单独工作表:
1.每个表格都保存为 Excel 表格。使用 Power Query 将这些表组合成一个表,然后将生成的表加载到一个新的工作表中。
2。这些表格不保存为 Excel 表格,手动执行此操作或弄清楚如何使用 VBA 脚本执行此过程似乎需要做很多工作。在这种情况下,通过创建一个新的 Excel 工作簿,然后使用 Power Query 连接到包含这些表的文件,可以更轻松地组合这些表。
以下是每个场景的示例。该数据集由 3 个表组成,每个表包含 10 行,其中表之间的日期有些重叠。
场景 1 - 存储在 Excel 表格中的数据
这是包含名为Source1 的 Excel 表的第一个工作表中的示例数据:
将所有表保存为 Excel 表并按照相同的约定命名,是时候打开 Power Query 编辑器并完成以下步骤了:
- 创建一个空白查询并在编辑栏中键入
= Excel.CurrentWorkbook() 以列出工作簿中包含的所有命名对象。
- 过滤 Name 列以仅保留名称以
Source 开头的行,以避免在完成和刷新后将包含所有数据的表包含到此查询中。
- 点击Date列的展开按钮,取消勾选Use original column name as prefix,点击OK。
- 将日期列数据类型更改为日期。
- 以 Infected 列作为 Values 列并在高级选项下选择 Don't Aggregate 旋转 Name 列。
现在数据已适当合并,可以加载到新工作表中以创建折线图:
这是 M 代码:
let
Source = Excel.CurrentWorkbook(),
#"Filtered Rows" = Table.SelectRows(Source, each Text.StartsWith([Name], "Source")),
#"Expanded Content" = Table.ExpandTableColumn(#"Filtered Rows", "Content", {"Date", "Infected"}, {"Date", "Infected"}),
#"Changed Type" = Table.TransformColumnTypes(#"Expanded Content",{{"Date", type date}}),
#"Pivoted Column" = Table.Pivot(#"Changed Type", List.Distinct(#"Changed Type"[Name]), "Name", "Infected")
in
#"Pivoted Column"
场景 2 - 数据未存储在 Excel 表格中
在这种情况下,数据存储在外部 Excel 工作簿datasources.xlsx 中。这是第一个工作表中示例数据的样子:
在单独的 Excel 工作簿中,打开 Power Query 编辑器并完成以下步骤:
- 创建一个空白查询并使用适当的文件路径在公式栏中键入以下行:
= Excel.Workbook(File.Contents("C:\FilePath\datasources.xlsx"))
- 删除除名称和数据之外的所有列。
- 点击Data列的展开按钮,取消勾选Use original column name as prefix,点击OK。
- 将第一行提升为列标题。
- 编辑日期和感染列的数据类型。
- 选择日期列并删除包含错误的行。
- 旋转 Sheet1 列,将 Infected 列作为值列,并在 Advanced Options 下选择 Don't Aggregate。
现在数据已适当合并,可以加载到新工作表中以创建折线图,产生与场景 1 相同的结果,但列标题和图例标签除外:
这是 M 代码:
let
Source = Excel.Workbook(File.Contents("C:\FilePath\datasources.xlsx")),
#"Removed Columns" = Table.RemoveColumns(Source,{"Item", "Kind", "Hidden"}),
#"Expanded Data" = Table.ExpandTableColumn(#"Removed Columns", "Data", {"Column1", "Column2"}, {"Column1", "Column2"}),
#"Promoted Headers" = Table.PromoteHeaders(#"Expanded Data", [PromoteAllScalars=true]),
#"Changed Type" = Table.TransformColumnTypes(#"Promoted Headers",{{"Sheet1", type text}, {"Date", type date}, {"Infected", Int64.Type}}),
#"Removed Errors" = Table.RemoveRowsWithErrors(#"Changed Type", {"Date"}),
#"Pivoted Column" = Table.Pivot(#"Removed Errors", List.Distinct(#"Removed Errors"[Sheet1]), "Sheet1", "Infected")
in
#"Pivoted Column"