我試圖獲取所有當前打開的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