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])
,最后再展开。