繁体   English   中英

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 实例。 打开一个新文档/工作簿 关闭它。 打开您要使用的文档/工作簿。

当用户通过快捷方式打开时,这通常会停止通过您的实例打开任何文档/工作簿。

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

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

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

这个过程的最后一部分很笨拙,但我看不到任何其他方法。

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

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM