延伸@DylanCorriveau所说的,我发现你需要采取以下方法之一来避免出现此问题。
方法一
我发现在某些情况下(Excel 2010),先打开Excel可以解决此问题。您需要调整路径并等待以适应您的需求和版本。
注:Original Answer翻译成“最初的回答”
string pathToTheVersionOfExcel = @"C:\Program Files (x86)\Microsoft Office\Office14\EXCEL.EXE";
System.Diagnostics.Process.Start(pathToTheVersionOfExcel);
Thread.Sleep(5000); //"WaitForInputIdle" waits for way too long, generally it takes 5 seconds to start for me
方法二
过去我采用的另一种方法是以不同的方式调用Excel:
最初的回答:
var oExcelApp = new Microsoft.Office.Interop.Excel.Application();
方法三
最终在我的应用程序中(适用于Excel 2010和2016),我使用了一个变通方法:
[DllImport("user32.dll")]
private static extern bool ShowWindow(IntPtr hWnd, int nCmdShow);
//In your method...
string pathToTheVersionOfExcel = @"C:\Program Files (x86)\Microsoft Office\root\Office16\EXCEL.EXE";
Application oExcelApp = null;
Process process = new Process();
process.StartInfo.FileName = pathToTheVersionOfExcel;
process.Start();
Thread.Sleep(5000);
//Opening a closing notepad seems to "register" excel 2016, not needed for excel 2010 though...
Process processNotepad = new Process();
processNotepad.StartInfo.FileName = @"C:\Windows\system32\notepad.exe";
processNotepad.Start();
ShowWindow(process.MainWindowHandle, 2); //Minimize
ShowWindow(process.MainWindowHandle, 3); //Maximize
Thread.Sleep(5000);
processNotepad.CloseMainWindow();
oExcelApp = (_Application)Marshal.GetActiveObject("Excel.Application");
如果您在RDP会话中的Excel 2016中运行此代码,它可能非常挑剔。我发现您需要自定义RDP以忽略其最小化状态。我发现
这篇文章非常有帮助。
如果您正在尝试通过某种自动化构建/发布平台(如TFS / Azure DevOps)在远程服务器上调用Excel,则需要尝试使用
autologin。我自己还没有使其
正常工作。