Реализовать Excel UDF, который может вызывать веб-методы асинхронно - PullRequest
5 голосов
/ 19 сентября 2011

Изначально я реализовал UDF, который будет вызывать веб-методы Синхронно , но у меня было много проблем с этим, особенно когда я пытался запросить огромный объем данных короче говоря, Excel зависал бы и зависал до тех пор, пока все данные не были извлечены, что серьезно угрожает работе пользователя.

Я предполагаю, что синхронное использование веб-службы является настоящей причиной. Поэтому мне интересно, есть ли способ сделать это Асинхронно ? Кто-нибудь может дать мне несколько советов? Какие инструменты или платформы предпочтительнее? (Лично я все еще предпочитаю использовать C #)

Ответы [ 4 ]

5 голосов
/ 20 сентября 2011

RTD будет работать.Вы должны реализовать интерфейс IRtdServer.Когда ваша надстройка запущена, Excel дает вам указатель на функцию.Для каждой ячейки вам будет дан «идентификатор Excel» и список аргументов.Отправьте свой асинхронный веб-запрос.Когда приходит ответ, вы вызываете функцию notfiy, которую дал вам Excel.Когда Excel будет готов, он вызовет ваш метод GetData для фактического получения данных.

См. Как мне создать надстройку автоматизации Excel в реальном времени в C # с использованием RtdServer? для примеракак это сделать в C #.

Как только вы поймете, как работает RTD, Excel-DNA отлично справится с абстракцией COM-соединения ... настоятельно рекомендуется.

1 голос
/ 20 сентября 2011

У меня нет опыта работы с этой технологией, но кажется, что Excel RTD (данные в реальном времени) может быть подходом. Проверьте эту ветку , относящуюся к ExcelDNA, в которой изложен подход. Надеюсь это поможет!

0 голосов
/ 20 сентября 2011

Отличный учебник с примерами доступен здесь .

0 голосов
/ 20 сентября 2011

Я не использую c # с Excel, только VBA, но я предполагаю, что применяются аналогичные ограничения.Проблема с вызовом чего-то удаленного через udf (особенно когда вы делаете это много) заключается в том, что рабочая книга перестает отвечать на запросы, и вы не можете контролировать процесс вычисления.Однако даже если бы вы могли выяснить, как асинхронно запускать ваш udf, это, вероятно, нарушило бы внутреннее отслеживание Excel того, как рассчитать рабочую книгу для учета зависимостей ячеек.

Какие вычисления выполняются на сервере?Не могли бы вы просто переместить их в надстройку и таким образом повысить производительность UDF?

Если вы не можете этого сделать, то вы можете попробовать подход, основанный на событиях (например, используя событие изменения рабочего листа какупоминалось ранее), но у вас все еще есть трудности, которые могут вам понадобиться для того, чтобы весь лист в конечном итоге был полностью рассчитан, и выполнение этой работы может оказаться более трудоемким, чем оно того стоит.Не забывайте также, что даже при асинхронной работе существует ограничение на количество подключений, которые ваша ОС может открыть за один раз, поэтому нельзя отправлять вызовы для десятков ячеек одновременно ...

...