Мне хорошо известно о базовой статье поддержки Microsoft, в которой говорится, что она не поддерживается для автоматизации пользовательского интерфейса офисных продуктов. Кажется, что Windows Server 2008 x64 и Excel 2007 применяют данный оператор.
Я запускаю следующий код в методе OnStart службы NT (Local System account). Все, что он делает, - это автоматизация 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();