簡體   English   中英

讓 PowerShell 等待 Excel 完成刷新數據透視表

[英]Make PowerShell Wait for Excel to Finish Refreshing Pivot Table

所以我開發了一個Powershell腳本來刷新大約40個大型excel文件並保存它們,在這個腳本中我運行一個excel宏來傳遞excel(ODBC)連接參數,然后在刷新完成后從excel文件中刪除它們。 我唯一的問題是(對於這 40 個文件中的 5 個文件),當啟動 RefreshAll 命令時,Powershell 不會等待 Excel 完成刷新並傳遞到下一個命令,即使連接無效的宏,從而導致錯誤宏中的“1004”(文件仍在刷新時無法訪問excel連接。)

經過一番研究,我知道在Powershell v2中,有后台作業的概念,但在我的情況下,這不是一個aside進程,它屬於Excel進程,所以我的Powershell不應該等待Excel退出繼續執行,相反,我需要 excel 保持打開狀態才能繼續執行 Powershell。

我也知道 start-sleep 命令對我的情況不是最好的,因為刷新結束的時間沒有固定值,每個文件都有它的時間,每個月的每個時期都有它的時間(數據量每天增加,直到月底)。

所以我的問題是:如果 Excel 文件已經完成刷新其數據,是否可以進行 Powershell 測試,如果是,則繼續,否則等待更多?

霰彈槍進場:

  1. Excel 具有Application.Ready屬性。 應該指示 Excel 何時准備好進行自動化通信,但詳細信息尚不清楚 嘗試這樣的事情:

     $Excel = New-Object -ComObject Excel.Application # Do your stuff here # Wait for Excel to became ready while (!$Excel.Ready) { Start-Sleep -Seconds 1 } # Do other stuff
  2. QueryTable 具有Refreshing屬性。 嘗試這個:

     $Excel = New-Object -ComObject Excel.Application $Workbook = $Excel.Workbooks.Open('C:\\Path\\To\\Workbook\\Data.xlsx') # Are any of the QueryTables refreshing? # Don't have Excel right now, so expression below might need some tweaking While (($Workbook.Sheets | ForEach-Object {$_.QueryTables | ForEach-Object {if($_.QueryTable.Refreshing){$true}}})) { Start-Sleep -Seconds 1 }
  3. ODBCConnection 具有Refreshing屬性。試試這個:

     $Excel = New-Object -ComObject Excel.Application $Workbook = $Excel.Workbooks.Open('C:\\Path\\To\\Workbook\\Data.xlsx') # Is ODBCConnection refreshing? # Don't have Excel right now, so expression below might need some tweaking While ($Workbook.ODBCConnection.Refreshing) { Start-Sleep -Seconds 1 }
  4. 也許這 5 個文件將PivotCache.BackgroundQueryODBCConnection.BackgroundQueryQueryTable.BackgroundQuery屬性設置為 true?

對我來說,這個簡單的代碼片段起到了作用:

$sheet.Calculate()
$null = $sheet.QueryTables.QueryTable.Refreshing

看起來只是獲取 Refreshing-Attribute 就足以等待刷新/計算周期結束。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM