Автоматизация Excel 2007 поверх Windows Server 2008 x64

Мне хорошо известна статья в базе поддержки 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();

person Chris Richner    schedule 14.05.2009    source источник
comment
К вашему сведению: тот же код работает как чудо, развернутый на Windows Server 2003 R2 x64 и Excel 2007.   -  person Chris Richner    schedule 18.05.2009
comment
-1 за помощь новым читателям в испытании автоматизации Office из серверных процессов.   -  person John Saunders    schedule 29.02.2012
comment
@ Джон Сондерс. ну а что делать при следующем требовании: запускать 'update' макрос внутри xls файла, без автоматизации? Просто любопытно (не то чтобы такой дизайн - хорошая идея для начала, но пользователи есть пользователи ...)   -  person Vinzz    schedule 07.06.2012
comment
@Vinzz: что бы вы сделали с любым другим невыполнимым требованием: говори правду.   -  person John Saunders    schedule 07.06.2012
comment
@John Saunder: Увы, в данном конкретном случае это возможно (и уже было) выполнено. Но действительно, попытка убедить другое решение - лучшая идея - это правильный поступок.   -  person Vinzz    schedule 08.06.2012
comment
@Vinzz: вы имеете в виду, что это было выполнено запуском Excel в неподдерживаемом сценарии? Я предполагаю, что это соблюдено, если они не указали поддержку в требованиях.   -  person John Saunders    schedule 08.06.2012


Ответы (5)


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

Короче говоря, я публикую решение здесь, спасибо Х. Огава

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

・ Windows 2008 Server x64

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

C: \ Windows \ SysWOW64 \ config \ systemprofile \ Desktop

・ Windows 2008 Server x86

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

C: \ Windows \ System32 \ config \ systemprofile \ Desktop

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

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

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

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

person Chris Richner    schedule 07.07.2009
comment
Вау, вот и все? У меня также была эта проблема, и я думал, что это происходит с Excel, запущенным в сеансе 0. Я использовал удаленное взаимодействие .Net для запуска Excel под пользователем, вошедшим в сеанс 1 ... - person wm_eddie; 20.08.2009
comment
И ты, и Х. Огава - настоящий рок. Я также изучал ситуацию с Сеансом 0, которая, похоже, была полным отвлекающим маневром. - person Jeroen Ritmeijer; 11.09.2009
comment
Я рад сообщить, что это решает ту же проблему в Windows 7 + IIS. Спасибо за это фантастическое решение! - person Jeff Sharp; 15.10.2009
comment
+1 за самое простое решение и ужасную ошибку, которую нужно выяснить. - person Dayton Brown; 29.12.2009
comment
СПАСИБО!!! У меня была такая же проблема в 64-битной Windows 7 с IIS7. Создание C: \ Windows \ SysWOW64 \ config \ systemprofile \ Desktop исправило для меня вещи. Раньше я тоже пробовал делать предложения о разрешениях dcomcnfg.exe, которые я нашел в других сообщениях на форуме. Поэтому, хотя я не могу быть уверен, что создание папки рабочего стола единолично решило мои проблемы, я точно знаю, что все заработало, как только я создал эту папку! Большое спасибо Крису! - person Dean L; 23.04.2010
comment
Я разместил связанный вопрос о том, как заставить это работать с несистемной учетной записью пользователя. stackoverflow.com/questions/5226473/ - person SFun28; 08.03.2011
comment
@Chris - Удалось ли вам найти объяснение, почему нужно создать эту папку? Это решило мою проблему, но я хотел бы знать, зачем нужна эта папка. - person thiag0; 07.04.2011

Также, как указано в источнике, вам необходимо установить правильные права для папки рабочего стола. Это сработало для меня в 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)» следующие права для созданной папки:

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

Джон.

person Jonx    schedule 06.12.2010
comment
это был последний недостающий кусок ужасной головоломки. Спасибо! - person Michael Paulukonis; 19.12.2011

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

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

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

person Stuart Whiteford    schedule 14.05.2009
comment
Спасибо, угадайте что, я отбросил эту часть кода, чтобы сделать пример как можно более простым. Кстати: ReleaseComObject возвращает int и должен быть помещен в цикл - person Chris Richner; 15.05.2009
comment
Также приятно дождаться GarbageCollector, если ваша программа завершится: GC.Collect (); GC.WaitForPendingFinalizers (); - person sonstabo; 23.02.2010

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

person Borgon    schedule 15.04.2011

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

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

Для Apache:

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

MS Word:

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

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

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

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

person A.O.    schedule 29.05.2014