Проблема производительности объектной модели Excel (кросс-домен приложений и многопоточность) - PullRequest
1 голос
/ 28 апреля 2011

Я пишу Excel AddIn для Office 2007 с VS2010 в VB, и у меня возникают серьезные проблемы с производительностью при взаимодействии с объектной моделью Excel из PowerPoint. Ниже приведен базовый тест для демонстрации проблемы (sub test ()).

Мы пробовали этот код 4 разными способами с разными результатами:

  1. Вызов объектной модели Excel напрямую из PowerPoint: в среднем 13 с
  2. Вызов этого кода из PowerPoint через службы WCF, размещенные в надстройке Excel: в среднем 9 с
  3. Вызов этого кода из надстройки Excel через таймер (при запуске подождите 20 секунд и запустите тест ()): 9 с
  4. Вызов кода непосредственно из надстройки Excel через кнопку ленты: 800 мс

Я могу понять разницу, почему 1. медленный, поскольку код не находится в том же AppDomain, что и Excel. Я также могу понять, почему 2. и 3. работают медленно, поскольку код не выполняется в потоке надстройки. Но я не могу придумать какое-либо дополнительное решение для решения проблемы с производительностью.

В конце у меня два вопроса

1) Я на правильном пути, когда говорю, что методы 2 и 3 медленны из-за многопоточности?

2) В общем, как я могу использовать объектную модель Excel из приложения .Net и не иметь такой потери производительности.

Заранее благодарим вас за любые идеи, которые у вас могут быть.

Nicolas

 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

Ответы [ 2 ]

1 голос
/ 15 июля 2011

Мы столкнулись с похожими проблемами производительности в объектной модели Excel.Мы перешли на использование драйвера MS ACE для чтения Excel.Производительность теперь фантастическая, хотя мы столкнулись с некоторыми проблемами, такими как работа с флагом typeguessrows в реестреДоступно не так много документации, поэтому мы в значительной степени опираемся на службу поддержки Microsoft.

1 голос
/ 29 апреля 2011

.Net производительность в Excel в настоящее время плохая, с каждой ссылкой на объектную модель Excel связаны очень большие издержки.Таким образом, один из способов ускорить это - собрать все данные, которые вы хотите передать, в массив и передать их за один вызов объектной модели.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...