Автоматизация Excel с помощью ASP.NET

Задний план

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

Проблема

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

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

Решение?

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

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


person Jeff Yates    schedule 12.11.2008    source источник


Ответы (5)


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

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

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

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

person Robert Wagner    schedule 12.11.2008
comment
Я еще не смог попробовать это, но если случится так, что пользователь НЕ может запустить Excel, есть ли способ для страницы ASP получить доступ к Excel в качестве того, кто может его запустить, даже если пользователь обращается к странице не может? - person Jeff Yates; 13.11.2008
comment
Запустите пул приложений от имени пользователя, который может запускать Excel. Ваш код .Net будет работать с учетными данными пользователя, определенного в вашем пуле приложений. Я подозреваю, что если вы работаете как сетевая служба, вы не сможете запустить Excel. - person Robert Wagner; 13.11.2008

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

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

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

person Stephan Eggermont    schedule 12.11.2008

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

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

person Philipp Schmid    schedule 12.11.2008
comment
Я сам думал в этом направлении, но в проекте есть некоторые ограничения, которые, к сожалению, могут не допускать такого подхода. - person Jeff Yates; 13.11.2008

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

<%@ page aspcompat=true %>

Подробнее…

person JaredPar    schedule 13.11.2008

Из Microsoft (курсив в оригинальном источнике):

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

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

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

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

  • CoCreateInstance

    • Run-time error '429': ActiveX component cannot create object
    • Ошибка времени выполнения '70': в доступе отказано
    • CO_E_SERVER_EXEC_FAILURE (0x80080005): сбой при выполнении сервера
    • E_ACCESSDENIED (0x80070005): доступ запрещен
    • висит
    • возвращается без ошибок, но не работает

И наконец:

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

person Ian Boyd    schedule 18.10.2012