2011-04-28 28 views
1

我在VB中使用VS2010編寫Office Excel 2007的Excel AddIn,並且在與PowerPoint中的Excel對象模型交互時出現嚴重的性能問題。 請在下面找到一個基本的測試來演示問題(子測試())。Excel對象模型性能問題(跨應用程序域和線程)

  1. 直接從PowerPoint中調用Excel對象模型:

    我們與不同的結果,4周不同的方式嘗試這個代碼在平均13號第

  2. 調用從PowerPoint驗證碼槽通過一個Excel主辦的WCF服務Addin:平均9 s
  3. 通過計時器從Excel插件調用此代碼(啓動時,等待20秒並啓動測試()):9 s
  4. 通過功能區按鈕直接從Excel插件調用代碼:800ms

我可以理解1.爲什麼速度慢,因爲代碼與Excel不在同一AppDomain中。 我也可以理解爲什麼2.和3.因爲代碼沒有在Addin Thread中執行而很慢。 但我想不出任何其他解決方案來解決我的性能問題。

最後,我有兩個問題

1)我在正確的軌道上,當我說的方法2和3是因爲多線程的慢?

2)一般來說,如何從.Net應用程序中使用Excel對象模型,並且不會有這樣的性能損失。

提前感謝您的任何想法。

薩科

Public Sub test(ByVal appE As Excel.Application) 

    Dim chrono As New System.Diagnostics.Stopwatch 

    chrono.Start() 

    appE.Interactive = False 

    appE.ScreenUpdating = False 
    Dim wb As Excel.Workbook = appE.ActiveWorkbook 
    Dim ws As Excel.Worksheet = wb.ActiveSheet 
    Dim rng As Excel.Range = ws.Cells(1, 1) 


    Dim nbit As Integer = 10000 
    For i = 1 To nbit 
    rng.Value = i 
    Next 
    appE.ScreenUpdating = True 

    appE.Interactive = true 

    chrono.Stop() 


    MsgBox(chrono.ElapsedMilliseconds.ToString + " " + System.Threading.Thread.CurrentThread.ManagedThreadId.ToString) 

End Sub 

回答

1

的.Net與Excel的性能是目前較差,存在與每個參考Excel對象模型相關聯很高的開銷。
所以加快速度的一種方法是收集所有要傳輸到數組中的數據並將其傳遞給對象模型。

1

我們遇到了與Excel對象模型類似的性能問題。我們切換到使用MS ACE驅動程序來讀取Excel。性能現在非常棒,儘管我們遇到了一些問題,例如在註冊表中處理typeguessrows標誌。沒有很多可用的文檔,所以我們一直傾向於微軟支持團隊。