C# 打开 excel 工作簿后,如何防止用户在同一个 excel 实例中打开另一个 excel 文件(通过 windows)?

C# After opening an excel workbook, how can I prevent a user from opening another excel file(via windows) in the same excel instance?

我创建了一个程序,可以在 excel、word 和 txt 文件中搜索用户输入的字符串。所以我打开每个文件,搜索字符串,如果文档包含此字符串,则将文件(带有信息)添加到数据网格中。

除了一些不可预见的情况外,该程序运行良好。如果用户在开始搜索时没有打开 excel,程序会打开 excel 的新实例并开始搜索。在此搜索期间,如果用户随后从 windows 资源管理器打开 excel 文件,它将在我的程序正在使用的同一实例中打开它,然后继续显示它正在打开的所有文件,搜索,然后关闭。

如果用户已经打开 excel,那么我的程序会打开它自己的实例,没有问题。完全相同的问题也适用于 word 文档。

我的问题是,如何防止用户在我的程序当前正在使用的 excel 的同一实例中打开文件?

以下是我如何访问的基础知识excel:

using Excel = Microsoft.Office.Interop.Excel;

Excel.Application xlsApp = new Excel.Application();
Excel.Workbook wkb = null;
Excel.Workbooks wkbs = xlsApp.Workbooks;


xlsApp.DisplayAlerts = false;
wkb = wkbs.Open(filePath, ReadOnly: true);



//Do search here...


//Close the workbook when necessary...
wkb.Close(false);

//Close the app when necessary...
xlsApp.Quit();

我希望可以设置一些参数来防止用户在同一实例中打开文档。

不确定这么久了您是否还在寻找这个问题的解决方案。我一直在尝试自己解决这个问题,在 Add-In Express 的帮助下,我想出了一个可行的解决方案。以下应该适合您。

使用 ckNewInstance 创建您的 Word/Excel 实例。 打开一个新的document/workbook 关闭它。 打开您打算使用的document/workbook。

当用户通过快捷方式打开时,这通常会阻止任何 documents/workbooks 通过您的实例打开。

但有时这会失败(例如,如果进程中有遗留的 Word 实例)。

为了使我的 Word 实例“独占”,我目前正在执行以下操作(直到出现更好的东西):

  1. 打开一个虚拟文档,如上所述。
  2. 禁用 Word 中允许打开文档的所有功能。
  3. 以防万一 1 失败尝试捕获由我的 Word 实例打开的所有文档并关闭它们。

该过程的最后一部分很糟糕,但我看不出有任何其他解决方法。

最初,我使用 DocumentOpen 和 DocumentNew 事件来捕获文档打开和新文档,这很有效。您可以关闭这些事件中的文档并重新打开它们而不会出现明显问题。

但是,进一步的测试表明,DocumentOpen 和 DocumentNew 事件仅在使用您的 Word 实例打开文档时才会触发,例如,如果用户使用后台。如果他们单击 Word 快捷方式,即使文档在您的实例中打开,它也不会(为什么不是 MS?)触发上述事件。

我能找到的捕获以任何方式打开的 Word 文档的唯一方法是使用 DocumentChange 事件并循环遍历每个文档,如果它不是我想要的,请关闭它并重新打开它。

不幸的是,这不能以直接的方式工作。它似乎适用于新文档,但如果用户打开现有文档并且您尝试在 DocumentChange 事件中关闭它,它会导致您的主要文档挂起(至少对我来说是这样)。

为了解决这个问题,我使用 DocumentChange 事件来查找有问题的文档并启动计时器(100 毫秒似乎可以解决问题)来处理实际的关闭和打开。

总而言之,这太可怕了,我希望有人会回来告诉我,我在上面浪费了很多时间,因为 Office 应用程序有一个“MakeMyInstanceUnique”属性,它正是我需要的!