zoukankan      html  css  js  c++  java
  • C# 调用word进程操作文档关闭进程

    C# 调用word进程操作文档关闭进程

    作者:Jesai

    时间:2018-02-12 20:36:23

    前言:

    office办公软件作为现在主流的一款办公软件,在我们的日常生活和日常工作里面几乎每天都要用到。到了今天,为了节省人力资源和减轻工作量,减少工作上面的错误以及减轻工作的复杂度,于是办公自动应运而生。于是出现了OA软件的春天,许多政府机关、单位、企业都会选择采购或者定制OA系统。OA软件普遍都涉及到office办公软件的操作。Excel、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();             
    
    } 

    参考资料和文献

  • 相关阅读:
    《面向对象编程》c++ primer 第15章
    extern的作用(综合网络)
    C程序内存区域分配(5个段作用)
    鼓舞自己的名言
    快速指数算法 和 求逆元算法
    HP Xeon 55xx上GPU的带宽问题
    Ubuntu12.04 安装ibusfbterm0.9.1
    Win7下读写Ext2/Ext3/Ext4文件系统
    fbv安装 为console添加背景图片
    CentOS6/7安装fcitx4.2.5
  • 原文地址:https://www.cnblogs.com/dengjiahai/p/8443511.html
Copyright © 2011-2022 走看看