Редактирование документа Excel с помощью макросов в ASP.net - PullRequest
1 голос
/ 29 февраля 2012

Можно ли каким-либо образом отредактировать таблицу Excel через страницу ASP.net, которая содержит макрос. Я попытался открыть лист Excel, и он, кажется, просто зависает, а не загружает Excel. Тестирование на странице без макросов работает отлично?

Ответы [ 2 ]

3 голосов
/ 29 февраля 2012

Отказ от ответственности : я не знаю лицензионное соглашение Excel и не знаю, нарушает ли его использование в процессе сервера.Это чисто техническое описание того, как заставить его работать.Читателю рекомендуется проверить лицензионное соглашение, чтобы узнать, разрешено ли это делать или нет.Разные версии Office могут иметь разные лицензионные соглашения.Я использовал этот метод в нескольких компаниях из списка Fortune 100/500, и, похоже, им было все равно.Перейти к рисунку.

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

Для начала убедитесь, что вы выполнили полную установку каждой отдельной функции Office на сервере, чтобы Excel не пытался что-то установить, если выпопытайтесь использовать функцию, которой нет.

Вам также необходимо создать выделенную учетную запись пользователя на сервере с соответствующими правами. Я не могу сказать вам, что именно, потому что в моем случае мы контролировали сервер и дали права администратора этому пользователю.

Если у вас есть учетная запись пользователя, вам необходимо войти в систему какэтого пользователя и запустите Excel (желательно все приложения Office) хотя бы один раз, чтобы он мог создать свои настройки.

Вам также необходимо настроить Excel для запуска под этой учетной записью, когда он создается как объект COM.Для этого вам нужно зайти в DCOM Config на сервере и настроить Launch and Activation Permissions для объекта Excel.Application для использования вашей новой учетной записи пользователя. Я не уверен, правильно ли я помню, но я думаю, что после этого шага запуск Excel в качестве интерактивного пользователя был несколько проблематичным.

По умолчанию приложения Office пытаются отображать различные сообщения наэкран: предупреждения, вопросы и т. д. Они должны быть отключены, потому что когда вы используете приложение Office из веб-приложения, оно запускается на сервере, так что пользователь не будет рядом, чтобы отклонить эти сообщения - программа Office простосидеть без дела бесконечно, ожидая отклонения сообщения.

Вам необходимо установить (как минимум) эти свойства:

DisplayAlerts = false
AskToUpdateLinks = false
AlertBeforeOverwriting = false
Interactive = false
Visible = false
FeatureInstall = 0 'msoFeatureInstallNone

, чтобы отключить сообщения пользовательского интерфейса из Excel. Если вы используете Excel 2010, их может быть больше, но я не знаком с этим.

Если у вас есть файлы Excel с макросами, возможно, вам придется отключить защиту макросов вExcel - это не может быть сделано программно по понятным причинам.

Чтобы получить доступ к службам Excel, реализуйте объект диспетчера, который фактически будет содержать ссылку на Excel - не пытайтесь удерживать объект Excel.Application вpage, потому что код вашей страницы станет очень сложным, и вы не сможете должным образом очистить вещи.

Объект, который содержит ссылку на Excel, может быть отдельной DLL или сервером вне процесса.Однако вы должны убедиться, что когда вы приобретаете экземпляр Excel в заданном потоке, вы всегда создаете новый экземпляр Excel .По умолчанию уже запущенный экземпляр Excel также будет обслуживать другие запросы, но это не будет работать для вас, поскольку один и тот же экземпляр Excel не может быть общим для нескольких потоков.Каждый поток обработки запросов в IIS должен иметь свой собственный экземпляр Excel - если вы совместно используете экземпляры, у вас возникнут всевозможные проблемы.Это означает, что на вашем сервере должно быть достаточно памяти для запуска многих экземпляров Excel. Это не было проблемой для меня, потому что мы контролировали сервер.

Если вы можете, попробуйте создать COM-сервер вне процесса (.exe), потому что таким образом вы можете удерживатьссылка на Excel в отдельном процессе.Можно заставить его работать с помощью внутрипроцессного (.dll) COM-объекта, но это будет более рискованным для пула приложений - если произойдет сбой Excel, это также приведет к падению вашего пула приложений.

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

  1. Заставьте вашего менеджера связать объект COM и передать параметры в виде свойств.
  2. Передайте параметры в качестве параметров командной строки в .exe при запуске.
  3. передать параметры в текстовом / двоичном файле; передайте имя файла в командной строке.

Я использовал все это и нашел вариант COM-объекта самым чистым.

В вашем объекте менеджера следуйте этим рекомендациям:

  • Оберните каждую отдельную функцию, использующую Excel, в блок try..catch, чтобы зафиксировать любое возможное исключение.
  • Всегда явно освобождайте все объекты Excel, вызывая Marshal.ReleaseComObject(), а затем устанавливая переменные на null, как только они вам не нужны. Всегда выпускайте эти объекты в блоке finally, чтобы убедиться, что неудачный вызов метода Excel не приведет к зависанию COM-объекта.
  • Если вы пытаетесь использовать какие-либо функции форматирования в Excel (заголовок страницы, поля и т. Д.), У вас должен быть установлен принтер и он доступен для учетной записи пользователя, которую вы используете для запуска Excel. Если у вас нет активного принтера (желательно подключенного к серверу), функции форматирования могут не работать.
  • При возникновении ошибки закройте используемый вами экземпляр Excel. Маловероятно, что вы сможете восстановить ошибки, связанные с Excel, и чем дольше вы сохраняете экземпляр, тем дольше он использует ресурсы.
  • Когда вы выходите из Excel, убедитесь, что вы защищаете этот код от рекурсивных вызовов - если ваши обработчики исключений попытаются завершить работу Excel, когда ваш код уже находится в процессе завершения работы Excel, вы получите мертвый Excel экземпляр.
  • Вызовите GC.Collect() и GC.WaitForPendingFinalizers() сразу после вызова метода Application.Quit(), чтобы убедиться, что .NET Framework немедленно освобождает все объекты COM COM Excel.

Редактировать : Джон Сондерс может иметь точку зрения относительно лицензионного соглашения - я не могу сообщить об этом. Все проекты, которые я выполнял с использованием Word / Excel, были приложениями интранета для крупных клиентов, и требование использования Word / Excel было само собой разумеющимся.

Ссылка, которую он предоставил, также содержит некоторые инструменты, которые могут быть полезны, хотя эти библиотеки не будут иметь полной функциональности Excel, и если это то, что вам нужно, у вас нет выбора. Если вам не нужна полная функциональность Excel, проверьте эти библиотеки - они могут быть намного проще в использовании.

Несколько ссылок, которые могут быть полезны для людей, пытающихся реализовать этот подход:

0 голосов
/ 27 марта 2012

История изменилась совсем недавно, с HPC Services for Excel .

С этим вы можете выполнять автоматизацию Office на веб-сервере.Я все еще пытаюсь определить, как это соответствует моей ситуации, но вы можете проверить это.

...