title: Excel 2007 automation on top of a Windows Server 2008 x64
body: <p>I’m well aware of the Microsoft support base article stating that it’s not supported to automate office products UI less. It seems that <b>Windows Server 2008 x64 and Excel 2007</b> enforce the given statement. </p>
  
  <p>I’m running the following code in a NT Service (Local System account) OnStart method. All it does is Excel automation the way it’s working when you run the same code in a Console Application. </p>
  
  <p>The provided code has two parts. The first part launches Excel, creates a new work book and saves it to the given filename. The second part launches a new instance of Excel and opens the given file. The open operation ends in this exception:</p>
  
  <p>Service cannot be started. System.Runtime.InteropServices.COMException (0x800A03EC): Microsoft Office Excel cannot access the file 'c:\temp\test.xls'. There are several possible reasons:</p>
  
  <p>• The file name or path does not exist.
  • The file is being used by another program.
  • The workbook you are trying to save has the same name as a currently open workbook.</p>
  
  <p><b>Why was the automated excel able to launch and write files to disk but fails when it’s asked “just “ to open an existing file?</b></p>
  
  <pre><code>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();
  </code></pre>