当powerquery遇上受保护的视图?[图片]![Uploading file...](),需要启用编辑才能获取数据,有更好或者更快的办法吗 ?
当powerquery遇上受保护的视图?[图片]![Uploading file...](),需要启用编辑才能获取数据,有更好或者更快的办法吗 ?
题主问题描述不全,但私聊发了文件,症状是直接导入只能获取到表格的前几行,获取不到所有数据。
系统导出的文件经常会有这种问题,具体原因不太清楚,但测试了一下打开文件直接保存关闭,再导入就没问题了。
所以问题就变成:Power Query 如何在导入文件夹中的 Excel 文件之前, 批量打开并保存文件?
用 VBA 啥的就不介绍了,网上搜索代码一堆,介绍一个调用 JS 的方法吧,之前在 《在Power Query中使用VB/JavaScript》中也讲过,首先要在 IE 浏览器中开启ActiveX控件。
群里有现成的示例文件,由@飞天篮球 提供,代码为:
let
path = "D:/8月份/", // 文件夹路径;
源 = Folder.Files(path),
fileName = Text.Combine(源[Name],","), // 获取文件名合并成文本字符串;
open_save = Web.Page("<script>
var oXL = new ActiveXObject('Excel.application');
var arr = '"&fileName&"'.split(','); // 把fileName文本字符串转变为JS中的数组array,供下一步遍历使用;
for (var i=0;i<arr.length;i++){
oWB = oXL.Workbooks.open('"&path&"'+arr[i]);
oWB.Save()};
oXL.Quit();
</script>"),
parse = Table.TransformColumns(源,{"Content",each Excel.Workbook(_)[Data]{0}})
in
parse
直接复制到高级编辑器,修改第一步的文件夹路径即可。
看到Alex、飞天篮球两位大神的答案,便又搜索一番研究了一下该问题。「受保护的视图」一般是从网上下载的文档,由于office选项里设置里相应选项为启用状态,打开后便显示受保护了。先前,从网络上下载chm格式文件打开显示空白,office文档打开失败、无法解析、被占用或者空白,或者受保护的视图启用编辑再修改后只能另存,这些多半是文件被锁定的症状。如何解决下载的网络文件被锁定的这个问题,一则可以手动设置取消启用,或者修改组策略、注册表等,二则用第三方软件实现。一般从IE、Chrome等浏览器下载的网络文档,在NTFS分区下,都附加交换数据流(备用数据流),针对Alternate Data Streams, 考虑一个名为unblock_file的自定义pq函数(利用Web.Page解析Jscript)重写Zone.Identifier,如下
unblock_file=let
源 = (filepath as text) => let
escape_path=Text.Replace(filepath,"\","/")&"/",
源 = Folder.Files(escape_path),
筛选的行 = Table.SelectRows(源, each ([Extension] = ".xls" or [Extension] = ".xlsx")),
filepathName = Text.Combine(List.Transform(List.Transform(List.Zip({筛选的行[Folder Path],筛选的行[Name]}),Text.Combine),each Text.Replace(_,"\","/")),"|"), // 获取文件绝对路径名并合并为文本字符串;
remove_ads = Web.Page("<script>
var fso = new ActiveXObject('Scripting.FileSystemObject');
var arr = '"&filepathName&"'.split('|');
for (var i=0;i<arr.length;i++){ //Bulk rewrite Streams
var fullpath= arr[i]+':Zone.Identifier';
var ex=fso.FileExists(fullpath);
if (!ex) {continue;} //跳过没有ads的文件
var f=fso.CreateTextFile(fullpath);
f.WriteLine('[ZoneTransfer]' + '\r\n' + 'ZoneId=2');
f.Close();
document.write(fullpath)}
document.write('\r\nover')
</script>"),
bodytext= Table.Buffer(remove_ads{0}[Data][Children]{0}{1}[Children]),
parseTable = if bodytext is table then Table.TransformColumns(筛选的行,{"Content",each Excel.Workbook(_)[Data]{0}}) else "error"
in
parseTable
//remove_ads
// bodytext
in
源
//fileName = Text.Combine(筛选的行[Name],","),
//myfilepath = "D:\\My\ Documents\\whitespace\\path\\", //路径需要转义,注意空格的转义
//var fullpath= "& "'"& escape_path & "'"&" +arr[i]+':Zone.Identifier';
在cmd命令提示符下,可以用notepad或者more<读取ads,通过dir /r可以查看目录下是否有:Zone.Identifier:$DATA标识的备用数据流文件,微软也提供了Sysinternals Stream工具修改或删除交换数据流。PowerShell的Remove-Item或Unblock-File也能批量解除ADS设置导致的文件锁定。当然还有其他软件支持类似操作,搜索一下就清楚了。图示为非自定义函数下的操作,