Я потратил много времени на преобразование какого-то старого кода VB6 / * .xla в приложение на C # и теперь обнаружил, что закопал себя в серьезную дыру в производительности.Кажется, что автоматизация Excel из C # (VS 2010) оказывает некоторое влияние на производительность.Я написал «точный» код в тестовом приложении VB6, и вычисления выполняются примерно за 1-2 секунды.Где, как код в C # занимает больше минуты.Общий поток кода выглядит следующим образом ... (где клиент - приложение VB6 или C #).
- выполняется только один раз за время жизни клиентского приложения
Клиент создает и открывает и приложение Excel
Клиент автоматизирует Excel для загрузки необходимых надстроек, необходимых для расчетов.
- Готово длякаждый выполненный расчет
Клиент автоматизирует Excel, чтобы закрыть любой существующий файл * .xls и открыть нужный файл * .xls.
Клиент вызывает макрос из Excel, добавленный с помощью ExcelAppObject.Run («AddIn.xla! GetConfiguration»), чтобы получить конфигурацию * .xls, открытой на шаге 3.
Клиент вызывает макрос из Excelдобавить с помощью ExcelAppObject.Run («AddIn.xla! LoadInputs», InputsXmlString)
- Макрос загружает InputsXmlString в объект MSXML.DOMDocument40.
- Макрос превращает приложение.Расчет = xlCalculationManual (для ускорения заполнениянесколько «таблиц» входных данных)
- Макрос устанавливает Application.EnableEvents = false
- Макрос зацикливает все «настроенные» входы / таблицы на рабочем листе «Ввод» и очищает их (в случае, если переданный в xml не содержит «все» входные данные)
- Макрос зацикливает весь переданный xml и загружает в соответствующие места на рабочем листе «Ввод».
Клиент вызывает макрос из Excel, добавляемый с помощью ExcelAppObject.Run («AddIn.xla! GetResults», DataXmlString)
- Макрос загружает DataXmlString в объект MSXML.DOMDocument40.
- Макрос зацикливает все «сконфигурированные» значения данных на рабочем листе «Ввод» и очищает их (в случае, если переданный в xml не содержит «все» данные или не удаляет предыдущие вычисления)
Это отличается от LoadInputs, потому чтоу нас может быть пакетное вычисление, в котором входные данные одинаковы для каждого вычисления, но «данные участника» очевидно различны для каждого вычисления - Макрос загружает вседанные из DataXmlString в соответствующие местоположения на рабочем листе «Ввод»
- Макрос устанавливает Application.EnableEvents = true
- Макрос превращает Application.Calculation = xlCalculationAutomatic (чтобы убедиться, что вычисление происходит теперь, когдавсе данные / входные данные были загружены)
- Макрос зацикливает все настроенные «ячейки результата» и возвращает их через строку XML.
Итаккак видите, для каждого вычисления у меня есть только три перекрестных вызова из клиента в Excel (GetConfiguration, LoadInputs и GetResults), чтобы попытаться минимизировать эту известную проблему «плохой» производительности.Проблема в том, что при вызове точно такого же кода из приложения VB6 шаги 4-6 занимают около 2 секунд.Когда клиентское приложение является приложением C #, 4-6 занимают около 70 секунд. Все из этих 70 секунд происходят на шаге 6, когда я возвращаю расчет обратно в автоматический режим.
Известна ли проблема в приложениях C #, автоматизирующих Excel по сравнению с устаревшими приложениями VB6, и / или есть ли какие-либо предлагаемыеОбойти это так, чтобы я мог сохранить свой код C #, но каким-то образом достичь той же производительности, что и VB6?