Вопрос

Предыстория

Мы разрабатываем некоторые собственные утилиты, используя ASP.NET 2.0.Одним из которых является извлечение некоторой информации из баз данных и создание рабочей книги Excel, содержащей ряд электронных таблиц с данными на основе запросов к базе данных.

Проблема

Прототип, подтверждающий правильность концепции (простой ASP.NET страница, которая запрашивает отдельный элемент из базы данных и открывает Excel для добавления данных на рабочий лист), хорошо работает при локальном запуске на компьютерах разработки, успешно создавая и отображая электронную таблицу Excel по запросу.Однако при запуске на нашем сервере мы получаем следующую ошибку при попытке создать экземпляр Excel.

Не удалось привести COM-объект типа 'Microsoft.Офис.Взаимодействие.Excel.ApplicationClass"для ввода интерфейса"Microsoft.Офис.Взаимодействие.Excel._приложение'.Эта операция завершилась неудачно, поскольку вызов QueryInterface COM-компонента для интерфейса с IID '{000208D5-0000-0000-C000-000000000046}' завершился неудачно из-за следующей ошибки:Такой интерфейс не поддерживается (Исключение из HRESULT:0x80004002 (E_NOINTERFACE)).

Решение?

Мы используем PIA для Excel 2003, и у нас есть Excel 2003 и PIA, установленные на сервере.Кто-нибудь может объяснить, почему это не работает, или дать нам несколько советов о том, как мы могли бы отследить проблему?

Спасибо за любую помощь, которую вы можете оказать.

Это было полезно?

Решение

Может ли пользователь, под которым работает пул приложений ASP.NET, иметь доступ к приложению? Попробуйте войти в систему под этим пользователем (или измените пул приложений для запуска под этим пользователем) и откройте Excel. Если это работает, попробуйте запустить приложение WinForms на сервере как пользователь с кодом, который не работает.

Не уверен, но я думаю, что сборки PIA, возможно, должны быть зарегистрированы через regsvr32.

Я подозреваю, что если вы запустите службу в сети, вы не сможете запустить Excel (без интерактивного входа, ограниченной учетной записи и т. д.). Ваш код ASP.NET работает внутри пула приложений. Вы можете изменить пользователя, из которого запускается пул приложений, через диспетчера IIS Если вы хотите проверить, какой код выполняется в данный момент, посмотрите на процесс w3wp в диспетчере задач.

Для тестирования измените пул приложений, чтобы он работал как пользователь, которого вы знаете, работает с Excel.

Другие советы

Мы используем Aspose (коммерческий).Работать на сервере - это не очень весело.

  • Вы должны быть осторожны с лицензированием.
  • Время от времени вам нужно прерывать зависающий процесс.
  • Правильное оформление прав требует определенных усилий.

Он называется PI (t) A не просто так...

Подумайте над тем, чтобы работать с файлами XLSX (впервые в Office 2007, но есть плагин для Office 2003), которые представляют собой просто ZIP-файлы, содержащие файлы XML, которыми вы можете манипулировать без использования Excel. SpreadsheetML (на основе XML) хорошо документирован и не слишком сложен для программирования (вы даже можете найти LINQ для SpreadsheetML где-нибудь в Интернете).

Как указывалось выше, Excel на самом деле не является серверным продуктом, и при его использовании на сервере вы можете столкнуться с различными проблемами.

Думаю, проблема в том, что после развертывания приложения в IIS вы неожиданно запускаете внутри MTA COM Apartment. Я считаю, что Excel является компонентом STA и поэтому не может быть создан внутри MTA. Вам нужно будет установить опцию aspcompat на странице, которую вы используете

<%@ page aspcompat=true %>

Подробнее здесь

От Майкрософт, (выделено в первоисточнике):

В настоящее время Корпорация Майкрософт не рекомендует и не поддерживает автоматизацию приложений Microsoft Office с помощью какого-либо автоматического неинтерактивного клиентского приложения или компонента (включая ASP, ASP.NET , DCOM и NT Services), поскольку Office может демонстрировать нестабильное поведение и / или взаимоблокировку при запуске Office в этой среде.

Со списком причин, по которым вам не следует этого делать:

  • ...Многие службы работают под учетными записями, у которых нет профилей пользователей (например, СИСТЕМНАЯ учетная запись или учетные записи IWAM_[имя_сервера]).Таким образом, Office может неправильно инициализироваться при запуске.В этой ситуации Office возвращает ошибку в функции CreateObject или функции CoCreateInstance.Даже если приложение Office можно запустить, другие функции могут работать некорректно, если не существует профиля пользователя.
  • Если возникает непредвиденная ошибка или для выполнения какой-либо функции требуется неуказанный параметр, Office предназначен для того, чтобы выдавать пользователю модальное диалоговое окно, в котором спрашивается, что пользователь хочет сделать.Модальное диалоговое окно на неинтерактивном рабочем столе не может быть закрыто.Следовательно, этот поток перестает отвечать (зависает) на неопределенный срок.Хотя определенные методы кодирования могут помочь снизить вероятность возникновения этой проблемы, эти методы не могут полностью предотвратить проблему. Один этот факт делает запуск приложений Office из серверной среды рискованным и неподдерживаемым.
  • Серверные компоненты должны быть с высокой степенью реентерабельности, многопоточными COM-компонентами, которые имеют минимальные накладные расходы и высокую пропускную способность для нескольких клиентов.Офисные приложения почти во всех отношениях являются полной противоположностью.Приложения Office - это нереентерабельные серверы автоматизации на базе STA, предназначенные для предоставления разнообразной, но ресурсоемкой функциональности одному клиенту.

И ваш код может выдавать следующие ошибки:

  • CoCreateInstance

    • Ошибка времени выполнения '429':Компонент ActiveX не может создать объект
    • Ошибка времени выполнения '70':В разрешении отказано
    • CO_E_SERVER_EXEC_FAILURE (0x80080005):Сбой при выполнении сервера
    • E_ACCESSDENIED (0x80070005):Доступ запрещен
    • висит
    • возвращает без ошибок, но не сработало

И, наконец,:

Из-за ограничений дизайна Office изменений в конфигурации Office недостаточно для решения всех проблем. Корпорация Майкрософт настоятельно рекомендует ряд альтернатив, которые не требуют установки Office на стороне сервера и которые позволяют выполнять большинство обычных задач более эффективно и быстрее, чем автоматизация. Прежде чем использовать Office в качестве серверного компонента в своем проекте, рассмотрите альтернативные варианты.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top