我试图获取所有当前打开的Excel工作簿的列表,以便用户可以选择其中哪一个从中获取某些数据。查找所有打开的Excel工作簿
我尝试这样做:
List<string> excelList = new List<string>();
Process[] processList = Process.GetProcessesByName("excel");
foreach (Process p in processList)
{
excelList.Add(p.MainWindowTitle);
Console.WriteLine(p.MainWindowTitle);
}
但是只得到Excel的第一个打开的实例和最近打开的情况下,所以这两个之间被打开,任何工作簿是未在列表中。
我也开始探索在回答this SO question在blog link描述的解决方案,并试图获得与在博客中建议的代码访问运行对象表:这里
IBindCtx bc;
IRunningObjectTable rot;
CreateBindCtx(0, out bc);
bc.GetRunningObjectTable(out rot);
问题是, CreateBindCtx
实际上接受UCOMIBindCTX
而不是IBindCTX
,但UCOMIBindCTX
已过时MSDN。
有没有更简单的方法来做我想做的事情:获取对应于所有打开的Excel书籍的Workbook
对象的列表?
我没有看到你超越Excel类的第一个实例。您需要继续循环查看最后一个excel窗口的z索引处的其余窗口。 – Sorceri
对,构造函数'ExcelApplicationRetriever()'只查看单个实例。我在程序中使用它来获取所有实例的方式是调用GetProcesses()来获取所有正在运行的进程的列表,然后将每个进程的句柄传递给ExcelApplicationRetriever(),并返回Excel应用程序实例, ExcelApplicationRetriever。xl'不是'null'。 – sigil
谷歌缓存版本已经死亡。万岁https://web.archive.org/web/20060110230904/http://blogs.officezealot.com/whitechapel/archive/2005/04/10/4514.aspx – ThunderFrame