当 powerquery 遇上受保护的视图?

Power Query PowerBI-825513142 ⋅ 于 2018-09-26 18:25:00 ⋅ 最后回复由 geyee 2019-08-21 14:08:04 ⋅ 3016 阅读

当powerquery遇上受保护的视图?[图片]![Uploading file...](),需要启用编辑才能获取数据,有更好或者更快的办法吗 ?

最佳答案
  • 飞天篮球 Talk is cheap, show me your code.
    2018-09-27 16:44:43

    @Alex
    如果是这样的话,可以换成vbs批量打开保存,这个效率貌似要高一些。之前的代码文件找不到了,将就着看看图吧。

    file

回复数量: 3
  • Alex MOD 社区清洁工
    2018-09-27 16:32:02

    题主问题描述不全,但私聊发了文件,症状是直接导入只能获取到表格的前几行,获取不到所有数据。
    系统导出的文件经常会有这种问题,具体原因不太清楚,但测试了一下打开文件直接保存关闭,再导入就没问题了。
    所以问题就变成: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

    直接复制到高级编辑器,修改第一步的文件夹路径即可。

  • 飞天篮球 Talk is cheap, show me your code.
    2018-09-27 16:44:43

    @Alex
    如果是这样的话,可以换成vbs批量打开保存,这个效率貌似要高一些。之前的代码文件找不到了,将就着看看图吧。

    file

  • geyee
    2019-08-21 14:08:04

    看到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设置导致的文件锁定。当然还有其他软件支持类似操作,搜索一下就清楚了。图示为非自定义函数下的操作,

    file

暂无评论~~
  • 请务必阅读并严格遵守《社区管理规范与使用说明》
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`, 更多语法请见这里 Markdown 语法
  • 支持表情,使用方法请见 发送表情,可用的 Emoji 见 :metal: :point_right: Emoji 列表 :star: :sparkles:
  • 上传图片, 支持拖拽和剪切板粘贴上传, 格式限制 - jpg, png, gif
  • 不支持上传附件,请尽可能用文字和图片将问题描述清楚,如实在需要上传附件,可上传到 共享网盘 后分享链接
  • 发布框支持本地存储功能,会在内容变更时保存,「提交」按钮点击时清空
  请勿发布不友善或者负能量的内容。与人为善,比聪明更重要!
Ctrl+Enter