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