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# 调用word进程操作文档关闭进程的更多相关文章
- 基于DevExpress实现对PDF、Word、Excel文档的预览及操作处理
http://www.cnblogs.com/wuhuacong/p/4175266.html 在一般的管理系统模块里面,越来越多的设计到一些常用文档的上传保存操作,其中如PDF.Word.Excel ...
- Aspose.Words操作word生成PDF文档
Aspose.Words操作word生成PDF文档 using Aspose.Words; using System; using System.Collections.Generic; using ...
- jQuery 选择器 筛选器 样式操作 文本操作 属性操作 文档处理 事件 动画效果 插件 each、data、Ajax
jQuery jQuery介绍 1.jQuery是一个轻量级的.兼容多浏览器的JavaScript库. 2.jQuery使用户能够更方便地处理HTML Document.Events.实现动画效果.方 ...
- word ppt excel文档转换成pdf
1.把word文档转换成pdf (1).添加引用 using Microsoft.Office.Interop.Word; 添加引用 (2).转换方法 /// <summary> /// ...
- 用R创建Word和PowerPoint文档--转载
https://www.jianshu.com/p/7df62865c3ed Rapp --简书 Microsoft的Office软件在办公软件领域占有绝对的主导地位,几乎每个职场人士都必须掌握Wor ...
- 第12章:MongoDB-CRUD操作--文档--查询--游标详解
①是什么游标 游标不是查询结果,可以理解为数据在遍历过程中的内部指针,其返回的是一个资源,或者说数据读取接口. 客户端通过对游标进行一些设置就能对查询结果进行有效地控制,如可以限制查询得到的结果数量. ...
- dede只调用当天发布的文档
dede只调用当天发布的文档 dede文章的调用 我需要织梦的模板分别调用,一天内发布的文章,三天内发布的文章,和七天内发布的文章,请问是代码是怎么写的,如何调用,如图所示. 点一天内,显示最近24的 ...
- js操作文档对象的节点
好吧,为了能让大家不至于睡着,我们先回顾先前面的东东吧~ 1.首先我们写了javaScriput的是一门弱类型的解释性的脚本语言:弱类型:我们的变量不用申明其具体的数据类型,在使用的时候浏览器根据其存 ...
- swagger2 导出离线Word/PDF/HTML文档
swagger2离线导出Word/PDF/HTML文档 1.前言 通过前面的两篇博客 我们已经介绍了如何使用spring boot整合swagger2 生成在线的API文档. 但是某些情况下,我们需要 ...
随机推荐
- UPC 2019年第二阶段我要变强个人训练赛第六场
传送门 A.上学路线 题目描述 小D从家到学校的道路结构是这样的:由n条东西走向和m条南北走向的道路构成了一个n*m的网格,每条道路都是单向通行的(只能从北向南,从西向东走). 已知小D的家在网格的左 ...
- Redis - 命令行工具
使用Redis内置的命令行工具 redis-cli一些便捷的命令: 1.执行单条命令 平时在访问 Redis 服务器,一般都会使用 redis-cli 进入交互模式,然后一问一答来读写服务器,这种情况 ...
- H3C IPv6地址解析
- C语言 屏幕截图 (GDI)
截取全屏幕 #include <windows.h> void echo(CHAR *str); int CaptureImage(HWND hWnd, CHAR *dirPath, ...
- Android APP开发内容图片不显示
I/Glide: Root cause (1 of 1) Cause (1 of 1): class java.io.FileNotFoundException: No content provide ...
- 第二阶段:4.商业需求文档MRD:4.PRD-用例和规则
类似之前的泳道图 可以在下面添加一些描述 有时候用图还是会有一些限制 不能够很好的表达
- 将 Sidecar 容器带入新的阶段
作者 | 徐迪.张晓宇 导读:本文根据徐迪和张晓宇在 KubeCon NA 2019 大会分享整理.分享将会从以下几个方面进行切入:首先会简单介绍一下什么是 Sidecar 容器:其次,会分享几个阿里 ...
- redis 的持久化方式
redis 持久化的两种方式 RDB:RDB 持久化机制,是对 redis 中的数据执行周期性的持久化. AOF:AOF 机制对每条写入命令作为日志,以 append-only 的模式写入一个日志文件 ...
- Python 元类的基本介绍及使用
一.什么是元类 二.如何使用元类 (一)不依赖class关键字创建一个自定义类 (二)自定义元类控制类的产生 (三)自定义元类控制类的调用 一.什么是元类 在python中,一切皆对象,而对象都是由类 ...
- linux MySQL 5.7.20安装教程
安装MySQL 5.7.20shell> cd /usr/localshell> groupadd mysqlshell> useradd -g mysql mysqlshell&g ...