该管理系统主要涉及到word的复制、编辑、保存等操作

时间:2021-08-17 05:10:26

office办公软件作为此刻主流的一款办公软件,在我们的日常生活和日常事情里面几乎每天都要用到。到了今天,为了节省人力资源和减轻事情量,减少事情上面的错误以及减轻事情的庞大度,于是办公自动应运而生。于是呈现了OA软件的春天,,许多当局机关、单位、企业城市选择采购或者定制OA系统。OA软件遍及都涉及到office办公软件的操纵。Excel、word是经常用到的。

抛出问题

案例:在为某当局机关研发一个打点系统,应当局机关有大量的合同需要措置惩罚惩罚,包孕合同填写、审阅、呈批、生存、后期打点等一系列问题。而且事情量非常大,于是应当局决定定制一个合同打点的模块。该打点系统主要涉及到word的复制、编纂、生存等操纵。前台是使用了第三方控件。但是我们的后台处事器也要进行文件的复制,打开替换等操纵。需要在处事器挪用word进程。由于挪用了word进程打点不当,导致进程每次操纵都新增一个,进程多到必然的水平之后,就导致处事器瓦解。

该管理系统主要涉及到word的复制、编辑、保存等操作

措施后台挪用word

设置word 可以被措施挪用,其实就是权限问题,这个一般要设置处事器的用户和netword用户。到com组件里面设置。

操纵word

1.

Microsoft.Office.Interop.Word._Application wordApp = new Microsoft.Office.Interop.Word.ApplicationClass(); //新建东西,会孕育产生一个新的word进程



2.

var wordDoc =wordApp.Documents.Open(ref filename)//打开word文档

3.

wordDoc.AcceptAllRevisions(); //接收word中所有的修订 wordDoc.Save();//生存 wordDoc.Close(ref missing, ref missing, ref missing); //*word文档



执行上面三步,你会发明,这三个代码每执行一次,孕育产生一个word进程。直至处事器资源耗尽瓦解!

打点word进程

解决方案:

1.

对Word._Application东西进行退出,这是最根基的,也是必需的。

wordApp.Application.Quit(ref saveOption, ref missing, ref missing);



2.倘若退出,进程还是存在,为了保险起见,我们还可以对进程进行kill。

//杀死打开的word进程 Process myProcess = new Process(); Process[] wordProcess = Process.GetProcessesByName("winword");

但是这里有一个问题,就是会误杀另外处所挪用的进程。下面就可以杀死属于本身的进程。

foreach (Process pro in wordProcess) //这里是找到那些没有界面的Word进程 { IntPtr ip= pro.MainWindowHandle; string str =pro.MainWindowTitle; //发明措施中打开跟用户本身打开的区别就在这个属性 //用户打开的str 是文件的名称,措施中打开的就是空字符串 if (str==文件名) { pro.Kill(); } }


其实上面还有一个处所可以优化,存在现有的进程,不创建新的进程。

A措施叫B措施*,B措施有没有*是不成控的。  

如果word都是new出来的,那么会有越来越多的word进程。使用get的方法,保证只有一个word进程。  

try { this.app = (Application)Microsoft.VisualBasic.Interaction.GetObject(null, "Word.Application"); } catch { this.app = new Application(); }

参考资料和文献