【问题标题】:C# After opening an excel workbook, how can I prevent a user from opening another excel file(via windows) in the same excel instance?C#打开一个excel工作簿后,如何防止用户在同一个excel实例中打开另一个excel文件(通过windows)?
【发布时间】:2020-01-10 20:59:46
【问题描述】:

我创建了一个程序,用于搜索 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();

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

【问题讨论】:

    标签: c# excel mdi


    【解决方案1】:

    不确定您是否仍在寻找解决此问题的方法。我一直在尝试自己解决这个问题,在 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”属性,它完全符合我的需要!

    【讨论】:

    • 我仍然使用我的这个小程序,我只是知道它的局限性。我一定会尝试一下您的解决方案,看看效果如何。感谢您花时间写这篇文章。如果我将来碰巧遇到更好的解决方案,我一定会在这里发布。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-11
    相关资源
    最近更新 更多