当.visible = $ false时,Powershell excel刷新失败,“被调用被拒绝”

我已经有很长一段时间了这个问题,只是懒惰的忽略它,但是我现在需要find一个解决scheme。 我有一个自动刷新大量Excel文档的脚本。 这工作得很好,但是,如果我将Visible属性设置为false在工作簿上存储在networking共享失败。

重申一遍,将可视属性设置为false进行刷新可以在本地文件上正常工作,但是保存在\ location上的任何工作簿都会失败,并显示“被调用者拒绝调用”错误。 所有刷新都可以正常工作。

这是我的代码:

#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); 

我已经尝试了以下内容:

  1. 在创buildexcel对象和设置visible属性之间添加Start-Sleep 30
  2. 在DisplayAlerts之前设置可见
  3. 真的很难,只是工作

有任何想法吗?

似乎RefreshAll()不会等待刷新,实际上在Visible = $False设置的背景下成功。

RefreshAll()Save()之间引入一个延迟,如下所示:

 $excelworkbook.RefreshAll(); Start-Sleep -Seconds 30 $excelworkbook.Save(); 

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

 foreach ($Sheet in $excelworkbook.Worksheets) { foreach ($QTable in $Sheet.QueryTables) { $QTable.BackgroundQuery = $false } } 

我会添加一个DoEvents块:

 [System.Windows.Forms.Application]::DoEvents() 

这将允许队列循环访问Excel中的任何内容,然后返回到脚本执行。 另一件事是设置UserControl = false这样Excel就不是简单的隐藏起来,而是显然超出了用户对事件响应的能力。

最后,在设置其他属性之后,可能会有一些设置Visible的情况 – 可能是Excel通过切换其他一些事情来响应Visible事件(不要记住手中的事情,而是在后面的我的大脑说这是事实,或曾经是)。