2012-12-24 39 views
5

我有一個.NET應用程序,它使用COM接口讀取數據庫,進行一些分析並更新Excel電子表格中的統計數據。我有應用程序打開工作簿(或檢測到它,如果它已經打開),並找到它需要更新的工作表。如何在通過COM進行交互時「鎖定」Excel

我現在遇到了一個問題,用戶仍然可以使用Excel的互動我的應用程序運行時(關閉應用程序/工作簿,更改數據等)。我曾考慮在我的應用程序咀嚼數據時隱藏Excel,但這是應用程序範圍的,並阻止用戶與任何打開的電子表格進行交互。

有沒有辦法通過COM接口鎖定Excel的變化,但仍然有用戶可見/可讀?另外,有沒有辦法只是隱藏/鎖單個工作簿?

+0

您應該使用File.Move將文件移動到一個臨時位置,進行更改,然後將其複製回來 – JMK

+0

@JMK我不是OP的問題是用戶打開文件本身,更多的是與用戶與打開文件的Excel實例進行交互。 –

回答

0

Worksheets("Sheet1").protect(<password>)unprotect(<password>)會訣竅嗎?

+0

不,我試過了。 – gregsdennis

+0

((Excel.Worksheet)excelApp.ActiveWorkbook.Sheets [1])。EnableSelection = Excel.XlEnableSelection.xlUnlockedCells; ((Excel.Worksheet)excelApp.ActiveWorkbook.Sheets [1])。Protect(Password:protectionPassword,AllowFormattingCells:false); – MethodMan

+0

保護表單不會有幫助! –

0

......我能想到的唯一真正智能的方法就是創建一個Excel應用程序的新實例,將其隱藏起來並在其中進行更改。

然後,如果工作簿已經打開,只需通知用戶並要求他們關閉它。

+0

我能做到這一點。我需要確保在應用程序完成後取消隱藏實例,因爲用戶需要在表單內手動執行一些更多操作... – gregsdennis

+0

我發現從資源管理器打開Excel工作簿會導致Windows最大化並使其可見隱藏的Excel實例(假設它是當前唯一可用的實例)。 –

+0

@gregsdennis,這很容易做 - 只需創建一個ExcelApp對象,在變更結束時將它的visible屬性設置爲False,將它的visible屬性設置爲True,並釋放該對象而不關閉它,在這一點,它只是成爲用戶使用另一個開放的應用程序...我經常這樣做。 –

0

我能想到的最好辦法就是打開並立即隱藏整個工作簿。這樣,你仍然可以通過Interop與它交互,但是用戶沒有可見性(除非他們特意取消隱藏它,但我認爲很多用戶不知道該怎麼做)。

xlWorkbook.Windows[1].Visible = false; 
3
Application.Interactive=false; 
1
Application.Interactive=false; 

爲希德建議是你最好的選擇 我也建議改變:

Application.ScreenUpdating = false; // to avoid screen flicker 
    Application.DisplayAlerts = false; // if you wish to suppress most excel messages 
    Application.EnableEvents = false; // if there is vba in the workbook you wish to avoid triggering 

    Application.Calulation = xlCalculationManual; // if it's a calc intensive automation 

一個好主意,收集你的狀態預先自動化,並設置所有這些屬性當您完成自動化時返回原始文件。

+0

如果這是商業產品或與其他商業產品一起使用,我建議不要更改'EnableEvents'屬性。 Office產品是共享的沙箱 - 可能會加載其他附件,這些附件依賴於事件才能正常工作。作爲Office開發人員,爭取與其他加載項兼容的加載項非常重要,並且將「EnableEvents」設置爲false是最廣泛實施的不兼容問題之一。 –

相關問題