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# 调用word进程操作文档关闭进程的更多相关文章

  1. 基于DevExpress实现对PDF、Word、Excel文档的预览及操作处理

    http://www.cnblogs.com/wuhuacong/p/4175266.html 在一般的管理系统模块里面,越来越多的设计到一些常用文档的上传保存操作,其中如PDF.Word.Excel ...

  2. Aspose.Words操作word生成PDF文档

    Aspose.Words操作word生成PDF文档 using Aspose.Words; using System; using System.Collections.Generic; using ...

  3. jQuery 选择器 筛选器 样式操作 文本操作 属性操作 文档处理 事件 动画效果 插件 each、data、Ajax

    jQuery jQuery介绍 1.jQuery是一个轻量级的.兼容多浏览器的JavaScript库. 2.jQuery使用户能够更方便地处理HTML Document.Events.实现动画效果.方 ...

  4. word ppt excel文档转换成pdf

    1.把word文档转换成pdf (1).添加引用 using Microsoft.Office.Interop.Word; 添加引用 (2).转换方法 /// <summary> /// ...

  5. 用R创建Word和PowerPoint文档--转载

    https://www.jianshu.com/p/7df62865c3ed Rapp --简书 Microsoft的Office软件在办公软件领域占有绝对的主导地位,几乎每个职场人士都必须掌握Wor ...

  6. 第12章:MongoDB-CRUD操作--文档--查询--游标详解

    ①是什么游标 游标不是查询结果,可以理解为数据在遍历过程中的内部指针,其返回的是一个资源,或者说数据读取接口. 客户端通过对游标进行一些设置就能对查询结果进行有效地控制,如可以限制查询得到的结果数量. ...

  7. dede只调用当天发布的文档

    dede只调用当天发布的文档 dede文章的调用 我需要织梦的模板分别调用,一天内发布的文章,三天内发布的文章,和七天内发布的文章,请问是代码是怎么写的,如何调用,如图所示. 点一天内,显示最近24的 ...

  8. js操作文档对象的节点

    好吧,为了能让大家不至于睡着,我们先回顾先前面的东东吧~ 1.首先我们写了javaScriput的是一门弱类型的解释性的脚本语言:弱类型:我们的变量不用申明其具体的数据类型,在使用的时候浏览器根据其存 ...

  9. swagger2 导出离线Word/PDF/HTML文档

    swagger2离线导出Word/PDF/HTML文档 1.前言 通过前面的两篇博客 我们已经介绍了如何使用spring boot整合swagger2 生成在线的API文档. 但是某些情况下,我们需要 ...

随机推荐

  1. 浅谈使用spring security中的BCryptPasswordEncoder方法对密码进行加密与密码匹配

    浅谈使用springsecurity中的BCryptPasswordEncoder方法对密码进行加密(encode)与密码匹配(matches) spring security中的BCryptPass ...

  2. springdata jpa使用Example快速实现动态查询

    Example官方介绍 Query by Example (QBE) is a user-friendly querying technique with a simple interface. It ...

  3. java编程规范大全

    JAVA编程规范大全 命名规范 定义这个规范的目的是让项目中所有的文档都看起来像一个人写的,增加可读性,减少项目组中因为换人而带来的损失.(这些规范并不是一定要绝对遵守,但是一定要让程序有良好的可读性 ...

  4. linux flags 参数

    记住 kmalloc 原型是: #include <linux/slab.h> void *kmalloc(size_t size, int flags); 给 kmalloc 的第一个参 ...

  5. JAVA JVM记录

    串行处理器: 适用情况:数据量比较小(100M左右):单处理器下并且对响应时间无要求的应用. 缺点:只能用于小型应用 并行处理器: 适用情况:“对吞吐量有高要求”,多CPU.对应用响应时间无要求的中. ...

  6. dotnet 获取指定进程的输入命令行

    本文告诉大家如何在 dotnet 获取指定的进程的命令行参数 很多的程序在启动的时候都需要传入参数,那么如何拿到这些程序传入的参数? 我找到两个方法,一个需要引用 C++ 库支持 x86 和 x64 ...

  7. vue移动端图片上传压缩

    上传压缩方法 import {api} from '../../api/api.js'; import axios from 'axios'; export function imgPreview ( ...

  8. neo4j-查询示例

    查找名为"Cloud Atlas"的电影 match(cloudAtlas {title:"Cloud Atlas"}) return cloudAtlas 查 ...

  9. 洛谷$P$2286 宠物收养场 $[HNOI2004]$ $splay$

    正解:$splay$ 解题报告: 传送门! $splay$板子,,,? 先考虑这题要实现些什么东西嘛$QwQ$ 其实只要实现一个东西?就查询数列中与给定数字相差最小的数,显然用$splay$查询前驱后 ...

  10. 第 426 期 Python 周刊

    文章,教程和讲座 端到端机器学习:从数据收集到模型部署 链接: https://ahmedbesbes.com/end-to-end-ml.html 在本文中,我们将完成构建和部署机器学习应用程序的必 ...