Автоматизация Excel 2007 на базе Windows Server 2008 x64 - PullRequest
25 голосов
/ 14 мая 2009

Мне хорошо известна статья базы поддержки Microsoft, в которой говорится, что она не поддерживается для автоматизации пользовательского интерфейса офисных продуктов. Похоже, что Windows Server 2008 x64 и Excel 2007 применяют данное утверждение.

Я выполняю следующий код в методе OnStart службы NT (учетная запись локальной системы). Все, что он делает - это автоматизация Excel, которая работает, когда вы запускаете тот же код в консольном приложении.

Приведенный код состоит из двух частей. Первая часть запускает Excel, создает новую рабочую книгу и сохраняет ее по указанному имени файла. Вторая часть запускает новый экземпляр Excel и открывает данный файл. Операция открытия заканчивается в этом исключении:

Служба не может быть запущена. System.Runtime.InteropServices.COMException (0x800A03EC): Microsoft Office Excel не может получить доступ к файлу «c: \ temp \ test.xls». Есть несколько возможных причин:

• Имя файла или путь не существует. • Файл используется другой программой. • Книга, которую вы пытаетесь сохранить, имеет то же имя, что и текущая открытая книга.

Почему автоматизированный Excel мог запускать и записывать файлы на диск, но терпит неудачу, когда его просят «просто» открыть существующий файл?

System.Threading.Thread.CurrentThread.CurrentCulture = new System.Globalization.CultureInfo("en-US");
// launch excel and create/save a new work book
Microsoft.Office.Interop.Excel.ApplicationClass excel = new       Microsoft.Office.Interop.Excel.ApplicationClass();
excel.UserLibraryPath, excel.Interactive));
//            
string filename = "c:\\temp\\test.xls";
if(System.IO.File.Exists(filename)) System.IO.File.Delete(filename);
//
excel.Workbooks.Add(System.Reflection.Missing.Value);
excel.Save(filename);
excel.Quit();
excel = null;
// lauch new instance of excel and open saved file
excel = new Microsoft.Office.Interop.Excel.ApplicationClass();
try
{
    Microsoft.Office.Interop.Excel.Workbook book = excel.Workbooks.Open(filename,
                System.Reflection.Missing.Value,
                System.Reflection.Missing.Value,
                System.Reflection.Missing.Value,
                System.Reflection.Missing.Value,
                System.Reflection.Missing.Value,
                true,
                System.Reflection.Missing.Value,
                System.Reflection.Missing.Value,
                false,
                false,
                System.Reflection.Missing.Value,
                false,
                System.Reflection.Missing.Value,
                System.Reflection.Missing.Value);
     book.Close(false, System.Reflection.Missing.Value, System.Reflection.Missing.Value);
      book = null;
  }
  finally
  {
      excel.Quit();
      excel = null;
  }
  //
  GC.Collect();

Ответы [ 5 ]

31 голосов
/ 07 июля 2009

Решение действительно простое. На форуме MSDN можно найти здесь

Короче говоря, я выкладываю решение здесь, кредит идет на H Огава

Это решение ...

・ Windows 2008 Server x64

Пожалуйста, создайте эту папку.

C: \ Windows \ SysWOW64 \ Config \ systemprofile \ Desktop

・ Windows 2008 Server x86

Пожалуйста, сделайте эту папку.

C: \ Windows \ System32 \ Config \ systemprofile \ Desktop

... вместо dcomcnfg.exe.

Эта операция устранила проблемы автоматизации делопроизводства в моей системе.

Похоже, что папка Desktop в папке systemprofile необходима для открытия файла в Excel.

исчезает из Windows2008, в Windows2003 была папка, и я думаю, что это вызывает эту ошибку.

7 голосов
/ 06 декабря 2010

Также, как указано в источнике, вам необходимо установить правильные права для папки Desktop. Это работало для меня на Windows 2008-64bit и Office 2010 32bit.

  1. Создать каталог "C: \ Windows \ SysWOW64 \ config \ systemprofile \ Desktop" (для 64-битной Windows) или "C: \ Windows \ System32 \ config \ systemprofile \ Desktop" (для 32-битной Windows)

  2. Назначьте пользователю «Сетевые службы (Service Réseau)» следующие права для созданной папки:

Чтение и выполнение, Список содержимого папки, Чтение

Джон.

2 голосов
/ 14 мая 2009

Я довольно часто обнаруживал, что вызова Quit () недостаточно для освобождения ресурсов. Попробуйте добавить: -

System.Runtime.InteropServices.Marshal.ReleaseComObject(excel);

между оператором Quit () и установкой его в null.

1 голос
/ 30 мая 2014

Если вы используете Apache, вам также может понадобиться выполнить следующие шаги для правильной работы MS Word (вместе со всем, что описано в других ответах):

Ниже приведен скриншот, показывающий два диалоговых окна, которые вам нужно вызвать: enter image description here

Для Apache:

Сервисы-> Apache-> Правой кнопкой мыши (Свойства) -> Вкладка «Вход»

MS Word:

Запустите dcomcnfg.exe-> Корень консоли-> Службы компонентов-> Компьютеры-> Мой компьютер-> Конфигурация DCOM-> Найти приложение Microsoft-> ​​Щелкните правой кнопкой мыши (Свойства) -> Вкладка «Удостоверение»

** если вы не можете найти MS Word, убедитесь, что вы запускаете правильную конфигурацию DCOM (64-разрядная или 32-разрядная) в зависимости от установленной версии Office.

Здесь есть два варианта, вы можете настроить Apache на использование Локальная системная учетная запись и установить флажок РАЗРЕШИТЬ взаимодействие с рабочим столом. Если вы сделаете это, вам нужно установить Идентичность для MS Word на Интерактивный пользователь .

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

1 голос
/ 16 апреля 2011

Существует гораздо больше ошибок, чем упомянутое выше, что вам необходимо устранить, чтобы заставить Excel работать на 64-битной Windows Server 2007. Смотрите шаги, которые я разработал после работы над этим в течение двух полных дней!

...