Excel.Workbook | Power Query爱好者 合并文件夹下的表格

官方说明:

从Excel工作簿返回工作表的记录。
Excel.Workbook( workbook as binary, optional useHeaders as nullable logical, optional delayTypes as nullable logical) as table

解读:

语法:

若导入的文件为*.csv或*.txt,请参照另一篇《Csv.Document》
第一参数为binary,通常是先使用File.Contents根据指定路径获取Excel文件,返回类型为binary,然后再用Excel.Workbook将binary解析出来,比如= Excel.Workbook(File.Contents("C:\Users\rages\Desktop\excel\test1.xlsx"), null, true)
第二参数为是否使用标题,类型为布尔值。true表示使用第一行作为标题,不填或null或false都表示不使用。
第三参数字面意思为延迟类型,同样为布尔值。据说在合并文件夹的时候填true效率更高,填false在每合并一次后会有延迟。但是经过本人测试填不填并没有什么区别,所以一般省略不填,如果大家测试后有发现区别欢迎反馈。

导入单文件:

如果是导入单个文件,我们一般点击数据-新建查询-从文件-从工作簿即可,能界面操作的也没必要去手写公式。但是系统自动生成的公式第二参数默认为null,第三参数为ture,然后会再加一个提升标题的步骤,看起来很不科学。第三参数又没什么用,我们完全可以把 ,null 删掉,让true变成第二参数使用标题,然后把"提升的标题"删掉。"导航"这个步骤是从表记录中深化出[Data]列中数据所在区域,如果只需要其中的一个sheet那可以直接使用[Data]{0}的形式深化出来,写成= Excel.Workbook(File.Contents("C:\Users\rages\Desktop\excel\test1.xlsx"),true){0}[Data]
如果要的是所有sheet的合并数据那么就使用Table.Combine进行合并,然后"导航"就可以删掉了,写成= Table.Combine(Excel.Workbook(File.Contents("C:\Users\rages\Desktop\excel\test1.xlsx"),true)[Data])
最终只是改了几个字符,就让原来三个步骤做的事现在一个步骤就能完成,看上去清爽很多。

合并文件夹:

我们使用这个函数最多的场景是合并文件夹下的所有excel文件,如果我们导入文件夹后直接点击合并-合并并编辑,会看到如下的效果:

一下多出这么多的查询和步骤,不知道你感觉如何,反正身为重度强迫症患者的我表示接受不了。那怎么办?
可能其他大多数教程都会教你添加一列=Excel.Workbook([Content]),然后展开再删除列。相比自动生成的公式已经简洁很多了,但是既然有强迫症,就必须把强迫症发挥到极致。
首先导入文件夹,不要点合并直接点编辑,看到的应该是如下界面:

思路同解析单个文件一样,只不过现在是要对[Content]字段下的多个binary同时转换,于是要用到List.Transform,最后再将所有表格合并起来。

= Table.Combine(List.Transform(Folder.Files("C:\Users\rages\Desktop\excel")[Content],each Table.Combine(Excel.Workbook(_,true)[Data])))
看到这你会发现,如果懂一点M语言,原本系统自动生成N个查询N个步骤实现的效果,现在也许一行代码就能搞定。

带文件名的合并文件夹:

有些时候可能需要保留文件名,比如说文件以日期命名而表中没有日期。这时候就不能用上面极简的写法了,只能老老实实的先用File.Contents获取路径下所有文件,然后把其他列删掉只保留[Name]和[Content],再添加列使用= Table.Combine(Excel.Workbook([Content],true)[Data]),最后再展开。

打赏赞(15)微海报分享
(0)

相关推荐