Не удается получить доступ к файлу Excel

Я занимаюсь разработкой службы Windows, создаю отчет. Этот отчет имеет шаблон. Этот шаблон подготовлен в файле Excel. Этот файл копируется в выходную папку.

При разработке я запустил сервис как консольное приложение и не имел проблем с доступом к этому файлу.

Затем я подготовил сервисный установщик. Сервис установлен под Local System учетная запись. Таким образом, этот файл шаблона Excel помечается как содержимое и копируется в каталог установки вместе с исполняемым файлом.

Но при запуске службы Excel, похоже, не имеет доступа к этому файлу. Служба установлена ​​в c:\Program Files (x86)\Our Company\Service Name\, Целевой ОС является Windows Server 2008. Во время тестирования я использую Windows 7 и сталкиваюсь с той же проблемой.

Я использую следующий код для доступа к Excel.

using Excel = Microsoft.Office.Interop.Excel;    
//...
Excel.Application xlApp = new Microsoft.Office.Interop.Excel.Application();
//the following line throws an exception
Excel.Workbook xlWorkBook = xlApp.Workbooks.Open(@"path"); 

Я также попытался скопировать файл шаблона Excel во временный каталог (где служба имеет право писать - это проверено) и попытался открыть его оттуда, но безуспешно (хотя этот вариант хорошо работает в консольном приложении, так как Что ж).

Сообщение об ошибке говорит:

Microsoft Office Excel не может получить доступ к файлу / пути /. Есть несколько возможных причин:

1. The file name or path does not exist.
2. The file is being used by another program.
3. The workbook you are trying to save has the same name as a currently open workbook.

Как сделать так, чтобы служба Windows обращалась к этому файлу шаблона Excel? Или есть другая альтернатива?

2 ответа

Решение

Существует подробная статья базы знаний MS под названием " Соображения для автоматизации Office на стороне сервера". Некоторые ключевые выдержки:

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

  • Интерактивность с рабочим столом: приложения Office предполагают, что они запускаются под интерактивным рабочим столом. В некоторых случаях приложения могут потребоваться сделать видимыми, чтобы определенные функции автоматизации работали правильно. Если возникает непредвиденная ошибка или если для завершения функции требуется неуказанный параметр, Office предназначен для запроса пользователю модального диалогового окна, в котором спрашивается, что пользователь хочет сделать. Модальное диалоговое окно на неинтерактивном рабочем столе не может быть закрыто. Поэтому этот поток перестает отвечать (зависает) на неопределенный срок. Хотя определенные методы кодирования могут помочь уменьшить вероятность этой проблемы, эти методы не могут полностью предотвратить проблему. Уже один этот факт делает запуск приложений Office из серверной среды рискованным и неподдерживаемым.

Очевидно, как было указано в комментариях, используя SYSTEM аккаунт это ошибка. Вам нужно будет запустить службу под учетной записью, которая имеет профиль пользователя.

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

Для обеспечения безопасности запуска приложений Office (Excel и других) под управлением пользователя с локальной системной учетной записью необходимо знать две важные вещи: 1) В Windows Server 2008/2008 R2 необходимо вручную создать две папки: C:\Windows\system32\config\systemprofile\ рабочий стол
C:\Windows\SysWow64\config\systemprofile\desktop (только для версии x64) Без этих папок невозможно исправить запуск офисных приложений из локальной системной учетной записи

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

Другая информация там(используйте Google Translater, чтобы прочитать).

Я просто столкнулся с той же проблемой.

Я сделал файл.bat, где я назвал файл.exe.

наконец, я вызвал файл.bat из действий планировщика задач.

Это просто отлично работает.

Другие вопросы по тегам