Power Query动态追加查询
这是Power Query实战工作场景第一期--动态追加查询(同一工作簿下)
实现即使修改数据文件路径,依然可以动态实时刷新数据
数据资源已经与这篇博客捆绑,有需要者可以下载通过网盘分享的文件:数据.xlsx
链接: https://pan.baidu.com/s/15vAIXoMw8CMwmHugykzrNQ?pwd=0623 提取码: 0623
在工作中我们经常要用Power Query对数据进行处理后实时增加数据,实现动态刷新。首先是最常规的办法
方法一
1.复制我们的数据.xlsx文件,这里我们的数据-副本.xlsx文件位于E:\数据-副本.xlsx,打开文件,
获取数据-->来自文件-->从Excel工作簿,找到位于E:\数据-副本.xlsx,选择多项,全部导入。,点击转换数据。
2.点击追加查询-->将查询追加作为新查询(不会修改原表),选择三个或更多表,添加我们这里的三个表,点击确定就是我们已经追加完后的表了。
3.点击关闭并上载至,这里可以选择新工作表也可以选择在原工作表
4.点击确定后,我们发现多了四张表,一个是追加后的表,另外三张分别是原来三张表转化为表格形式的表。
5.修改表3的张三的语文成绩从100为60,并点击保存,然后回到追加1这个表,点击数据-->刷新,注意看张三的语文成绩会由100变为60
6.在表3里增加一列历史,成绩都为66,点击保存,然后回到追加1这个表,点击数据-->刷新,历史成绩就会追加出来了。
7.但是这里有个问题,关闭我们的文件并保存。现在我们的工作簿在E:\数据-副本.xlsx,我们将文件移动到C:\数据-副本.xlsx,并打开数据-副本.xlsx,找到表3,并将历史的分数都改为1314,并点击保存,点击数据-->刷新,发现无法刷新数据
这个方法在于简单易懂,但是一旦数据源文件位置发生变动,就无法实现动态刷新追加数据了,而且还额外产生了原来三个工作表的三个表格
方法二
1.先将前面的操作步骤删除并将文件重新移动到E:\数据-副本.xlsx,按住shift键右键删除表,点击数据-->查询与链接,点击右侧的追加1,右键删除,以此内推,将表1,表2,表3依次删除。然后保存一下。
2.数据-->获取数据-->来自文件-->从Excel工作簿,随便选取一张表,这里以选取表1为例
3.进来后,删除右侧多余的步骤,将更改的类型,提升的标题,导航这三个步骤都删除。
详细解释:
Name、Item代表每个表的名字,Kind代表每个表的类型,这里每个表都代表sheet类型(这里没有插入表或定义公式名称各种类型),Hidden代表是否隐藏工作表,没有隐藏工作表就代表FALSE.Data代表具体表的位置,点击Table就可以具体看到表的具体数据。
Excel.Workbook(File.Contents("E:\数据 - 副本.xlsx"), null, true)
Excel.Workbook代表具体打开哪一个工作表
File.Contents("E:\数据 - 副本.xlsx")以二进制形式打开数据-副本.xlsx文件,哪怕移动到文件到别的位置,这里依然是这个路径,如果要实现动态修改路径,后面可以对这里路径进行修改。
第一个null代表把第一行不当作表头,如果要把第一行当作表头就改为true,第二个true代表提升运行速率
这里先把第一个null改为true
4.只保留Name、Data这两列,选中其余三列右键删除,点击Data下拉菜单,选择姓名、语文、数学、历史这四列,点击关闭并上载至,选择新建工作表
5.表1新建一行小六,成绩都为99,点击保存,然后点击数据-->刷新,发现多了许许多多奇怪的数据,怎么解决这个问题呢,右键右侧查询&连接下面的表1,点击编辑,进入后,点击应用的步骤里的源,点击主页的刷新与预览,就会发现多了两行数据
6.我们只要sheet类型的表,点击Kind的倒三角进行筛选,选完表的类型后,我们其实只要表1,
表2,表3,不要表1(2),点击Name倒三角,将合并后的表1(2)筛选出去,此时关闭并上载就没有奇奇怪怪的多余数据了。比如在表1增加一行数据小七成绩为88,88,88,保存,回到表1(2)点击刷新与预览
出现的问题:
但是你发现原来数据是语文、数学、英语,现在是语文、历史、数学,因为表3有一列历史数据进行抢占了。
并且你新输入一列数据在表1,如地理 100,100,100,点击保存,回到表1(2),点击刷新与预览,发现数据并没有变化,增加不了一列的数据。怎么解决这个问题呢
7.回到表1(2)的编辑,在应用步骤里的展开的"Data“前面增加一个步骤,右键删除的列这一步骤,点击插入步骤后,在展开的"Data“里将自定义1改为删除的列(一旦自定义1这个步骤写东西就会影响展开的"Data“这一步骤),自定义1重名为:列标题
8.在列标题这个步骤里,将函数粘贴上去。= List.Distinct(List.Combine(List.Transform(删除的列[Data],each Table.ColumnNames(_)))) 这个函数可以把所有表中不重复的列标题都拿到。(第一个表1是语文、历史,第二个表是语文,数学,第三个表是语文、数学、英语、地理,那么就拿到了语文、数学、英语、历史、地理这几个字段)
注意的是你的应用步骤里,删除的列[Data],列标题上面一个应用步骤是不是删除的列,这几个Table是不是在Data这个列下面,如果不是就改成别的字段名
9.点击展开的"Data“这个应用步骤,= Table.ExpandTableColumn(删除的列, "Data", {"姓名", "语文", "历史", "数学"}, {"姓名", "语文", "历史", "数学"}) 这个函数代表展开删除的列这个表的Data这个字段,而列标题是第一个{"姓名", "语文", "历史", "数学"},代表这个表里有有哪些列名。第二个是{"姓名", "语文", "历史", "数学"}为改的名字。把函数改为= Table.ExpandTableColumn(删除的列, "Data",列标题)。这样就可以用我们从上面列标题这个应用步骤获得的不重复列标题作为这里的列名。关闭并上载至,就可以发现可以正常刷新与预览到正确的数据了
10.下面我们来检验是否可以正常加列,比如在表3增加列生物 70,70,70,并点击保存,回到表1(2),在数据-->刷新与预览,发现可以正常正确的刷新数据(这个方法相比方法一,虽然步骤复杂,但是灵活性更高,并且不会增加其他奇奇怪怪的表).但是还有一个问题,就是将E:\数据-副本.xlsx修改到别的路径下,依然不可以刷新使用(也就是说路径要做到随机动态的,而不是写死的)
11.比如将E:\数据-副本.xlsx文件移动到桌面,保存并在桌面打开文件,比如将语文成绩由60改为100.回到表1(2),点击数据-->刷新与浏览,发现没有刷新,依然做不到刷新
12.重新将数据-副本.xlsx文件移动到E:\数据-副本.xlsx,打开文件。右键表,插入工作表。改名为路径位置。在工作表1A1单元格增加自动识别路径: 同一文件下: =left(SUBSTITUTE(CELL("filename"),"[",""),Find("]",SUBSTITUTE(CELL("filename"),"[",""))-1) 这个函数就会自动识别这个工作表的路径了 。切记这里一定是同一文件下的工作表才可可以,下一期会讲不同文件夹下。
13.识别文件路径后,点击保存。Excel Power Query支持两种格式。第一种是在插入选项卡里的表格,记住选中A1这个单元格
14.第二种是公式这个选项卡里,选中A1这个单元格,定义公式名称。这里取名为勇太的数分之旅。然后点击保存。回到数据选项卡,右侧的查询&连接,右键表1,点击编辑进入。
15.回到源的应用步骤。= Excel.Workbook(File.Contents("E:\数据 - 副本.xlsx"), true, true),这里的路径写死了,只能在E:\数据 - 副本.xlsx这个路径下才可以动态查询。所以这里
E:\数据 - 副本.xlsx"替换下面的函数
复制替换的内容: Excel.CurrentWorkbook(){[Name="勇太的数分之旅"]}[Content]{0}[Column1]
这里的Name为刚刚定义的名称,这里你自己定义的名字,那么就修改这里的Name
16.筛选Kind里的sheet表与Name里的表1,表2,表3,最后关闭并上载并保存。
17.这里我们已经实现了动态识别文件路径,可以在系统里任意位置动态刷新数据,实现动态追加查询。比如我们将E:\数据 - 副本.xlsx"移动到桌面上。在表1里增加化学列,为77,77,77,77,77.点击保存,回到表1(2),点击刷新与预览。
这里我们不仅实现了动态追加查询,还实现了系统任意路径下都可以刷新数据。这在实际工作场景中,特别是运营与数据分析的场景中十分常用,下一期我们还会介绍追加查询-汇总多个工作表【不同工作簿下】的运用