![](/img/trans.png)
[英]How to copy excel worksheets Into another excel workbook without opening the excel file in c# winforms?
[英]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 实例“独占”,我目前正在执行以下操作(直到出现更好的结果):
这个过程的最后一部分很笨拙,但我看不到任何其他方法。
最初,我使用 DocumentOpen 和 DocumentNew 事件来捕获文档打开和新文档,并且效果很好。 您可以关闭这些事件中的文档并重新打开它们,而不会出现明显问题。
但是,进一步的测试表明 DocumentOpen 和 DocumentNew 事件仅在使用 Word 实例打开文档时才会触发,例如,如果用户使用后台。 如果他们单击 Word 快捷方式,即使文档在您的实例中打开,它也不会(为什么不 MS?)触发上述事件。
我能找到的捕获以任何方式打开的 Word 文档的唯一方法是使用 DocumentChange 事件并循环遍历每个文档,如果它不是我想要的文档,请关闭它并重新打开它。
不幸的是,这不能以直接的方式工作。 对于新文档似乎可以正常工作,但是如果用户打开现有文档并且您尝试在 DocumentChange 事件中关闭它,它会导致您的主要文档挂起(至少对我来说是这样)。
为了解决这个问题,我使用 DocumentChange 事件来查找有问题的文档并触发一个计时器(100 毫秒似乎可以解决问题)来处理实际的关闭和打开。
总而言之,太可怕了,我希望有人会回来告诉我,我在上面浪费了几天的时间,因为 Office 应用程序有一个“MakeMyInstanceUnique”属性,它正是我所需要的!
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.