当.visible = $ false时,Powershell excel刷新失败并且"Call被Callee拒绝"

Eth*_*han 9 com excel powershell

我已经有很长一段时间没有这个问题而且只是因为懒惰而忽略了它,但我现在需要找到一个解决方案.我有一个脚本可以自动刷新大量的Excel文档.这很好用,但是,如果我将Visible属性设置为false,则存储在网络共享上的工作簿上会失败.

重申一下,使用设置为false的visible属性刷新在LOCAL文件上工作正常,但保存在\ location上的任何工作簿都会失败,并显示错误"调用被被调用者拒绝".所有刷新工作正常,可见属性设置为true.

这是我的代码:

#Create Excel COM object and set it up for use.
$excel = new-object -comobject Excel.Application;
$excel.DisplayAlerts = $false;
#If this is set to false, saving the file on a network share will fail. Reason : Unknown.
$excel.Visible = $true;
#Open workbook which should be refreshed. 
$excelworkbook = $excel.workbooks.Open($workbook);
#Refresh WB
$excelworkbook.RefreshAll();
#Save
$excelworkbook.Save();
#Quit Excel
$excel.Quit();
#Destroy COM object. (VERY IMPORTANT!!!!!)
[System.Runtime.Interopservices.Marshal]::ReleaseComObject($excel);
Run Code Online (Sandbox Code Playgroud)

我尝试过以下方法:

  1. 在创建excel对象和设置visible属性之间添加Start-Sleep 30
  2. 在DisplayAlerts之前设置可见
  3. 希望它能够真正发挥作用

有任何想法吗?

Mat*_*sen 3

似乎RefreshAll()不会等待刷新在后台实际成功Visible = $False设置。

RefreshAll()在和之间引入人为延迟Save(),如下所示:

$excelworkbook.RefreshAll();
Start-Sleep -Seconds 30
$excelworkbook.Save();
Run Code Online (Sandbox Code Playgroud)

或者,您可以通过设置工作簿中的所有查询表来强制RefreshAll()同步执行,类似问题的答案中所建议的:BackgroundQuery = $False

foreach ($Sheet in $excelworkbook.Worksheets) {
    foreach ($QTable in $Sheet.QueryTables) {
        $QTable.BackgroundQuery = $false
    }
}
Run Code Online (Sandbox Code Playgroud)