C#操作Word (2)-- 打开&关闭Word文档
本文正式开始在VS2010中使用C#语言操作Word2007.
不是十分了解Word对象模型的朋友,请参考上一篇文章,或者下载:C#操作Word2007.pdf。
----------------------------------华丽分割--------------------------------------------
1.添加Reference,添加命名空间
新建一个Winform工程后,首先需要给工程添加Reference

由于我的Word是2007的,所以我选择了 Microsoft Word 12.0 Object Library,
添加完成后,在Reference表单中应该多出如下两个条目:
Microsoft.Office.Core
Microsoft.Office.InterOP.Word
--------------------------------------------------------------------------
下面就正式开始编写C#代码了挖。
首先,在你的Form1.cs中添加Word命名空间:我添加的是:
- using MSWord = Microsoft.Office.Interop.Word;
2.打开Word文档
然后给Form添加一个Load事件的消息响应函数OnLoad:

好了。下一步,我们完善OnLoad函数:
- private MSWord.Application m_word;
- private MSWord.Document m_doc;
- public Form1()
- {
- InitializeComponent();
- }
- private void OnLoad(object sender, EventArgs e)
- {
- m_word = new MSWord.Application();
- }
在OnLoad中我们实例化了一个Word的Application对象,代表Word2007应用程序。
这样只打开了一个应用程序的空壳,里面还没有文档。下面我们就打开一个已有的文档吧。
在打开之前,我们先添加一个按钮,然后为其设置Click事件的监听器OnOpen()
- private void OnOpen(object sender, EventArgs e)
- {
- Object filename = "test.docx";
- Object filefullname = @"C:\Users\David_ss\Desktop\项目管理\test.docx";
- Object confirmConversions = Type.Missing;
- Object readOnly = Type.Missing;
- Object addToRecentFiles = Type.Missing;
- Object passwordDocument = Type.Missing;
- Object passwordTemplate = Type.Missing;
- Object revert = Type.Missing;
- Object writePasswordDocument = Type.Missing;
- Object writePasswordTemplate = Type.Missing;
- Object format = Type.Missing;
- Object encoding = Type.Missing;
- Object visible = Type.Missing;
- Object openConflictDocument = Type.Missing;
- Object openAndRepair = Type.Missing;
- Object documentDirection = Type.Missing;
- Object noEncodingDialog = Type.Missing;
- for (int i = 1; i <= m_word.Documents.Count; i++)
- {
- String str = m_word.Documents[i].FullName.ToString();
- if (str == filefullname.ToString())
- {
- MessageBox.Show("请勿重复打开该文档");
- return;
- }
- }
- try
- {
- m_word.Documents.Open(ref filefullname,
- ref confirmConversions, ref readOnly, ref addToRecentFiles,
- ref passwordDocument, ref passwordTemplate, ref revert,
- ref writePasswordDocument, ref writePasswordTemplate,
- ref format, ref encoding, ref visible, ref openConflictDocument,
- ref openAndRepair, ref documentDirection, ref noEncodingDialog
- );
- m_word.Visible = true;
- //MessageBox.Show(m_word.Documents.Count.ToString());
- //MessageBox.Show(m_word.Documents[1].FullName.ToString());
- }
- catch (System.Exception ex)
- {
- MessageBox.Show("打开Word文档出错");
- }
- }
可以看到,这里调用的是Documents对象的Open方法,参数很多,感兴趣的朋友可以参考MSDN。
上面代码中我直接写出了文件路径,当然更好的方法是弹出对话框然后选择文件。
代码中也检查了该文档是否已经打开,这样也就避免了重复打开同一文档两次。另外需要注意的是,Word应用程序打开文档的数量是从1开始数的(即1 based),不是常见的从0开始,这点需要注意一下:
for(int i=1;i<m_word.Documents.Count;i++)
在Open方法调用完成后,别忘记把application对象的visiable属性设置为True,否则你是看不到打开的文档的。
OK,可以编译运行啦。如下图:

3.查看Word文档信息
下面,我们来看一下文档的有关信息,对应上图中的文档信息按钮(监听器OnShowInfo):
- private void OnShowInfo(object sender, EventArgs e)
- {
- System.Diagnostics.Debug.WriteLine("当前打开文档数量: "+m_word.Documents.Count.ToString()+"\n");
- System.Diagnostics.Debug.WriteLine(m_word.ActiveDocument.Paragraphs.Count.ToString());
- }
由于Word里面的对象属性实在是太多,这里也就随便选择两个吧。第一行是当前打开文档数量,第二行是当前激活的文档的自然段个数:

可以看到分别输出1和2,没错吧。
4.关闭Word文档,退出Word应用程序
最后,我们再来看看如何关闭吧,同样的,先添加按钮,然后添加OnClose()监听器。
- private void OnClose(object sender, EventArgs e)
- {
- //避免弹出normal.dotm被使用的对话框,自动保存模板
- m_word.NormalTemplate.Saved = true;
- //先关闭打开的文档(注意saveChanges选项)
- Object saveChanges = MSWord.WdSaveOptions.wdSaveChanges;
- Object originalFormat = Type.Missing;
- Object routeDocument = Type.Missing;
- m_word.Documents.Close(ref saveChanges,ref originalFormat, ref routeDocument);
- //若已经没有文档存在,则关闭应用程序
- if (m_word.Documents.Count == 0)
- {
- m_word.Quit(Type.Missing, Type.Missing, Type.Missing);
- }
- }
这里面需要注意的是为了防止弹出 normal.dotm被使用的对话框,最好先自动保存模板。
然后设置好你需要的saveOption.有三种,分别是
- wdSaveChanges
- wdDoNotSaveChanges
- wdPromptToSaveChanges
C#操作Word (2)-- 打开&关闭Word文档的更多相关文章
- C#操作Excel(2)-- 打开-读取Excel文档
由于要为某软件实现导出Excel功能,故有此文. 本文的开发环境是Visual Studio 2010 ,C#, Excel 2007. 新建C#工程后打开Solution Explorer,可以看到 ...
- java操作office和pdf文件java读取word,excel和pdf文档内容
在平常应用程序中,对office和pdf文档进行读取数据是比较常见的功能,尤其在很多web应用程序中.所以今天我们就简单来看一下Java对word.excel.pdf文件的读取.本篇博客只是讲解简单应 ...
- 通过freemarker生成一个word,解决生成的word用wps打开有问题的问题,解决出word时中文文件名乱码问题,解决打开出word时打开的word出现问题的问题,出图片,解决动态列表
通过freemarker制作word比较简单 步骤:制作word模板.制作方式是:将模板word保存成为xml----在xml的word模板中添加相应的标记----将xml的word文件的后缀名 ...
- Ubuntu 14 如何打开 .chm格式文档?
好多手册是.chm格式,Ubuntu是需要安装第三方软件才能打开.chm格式文档,操作方式如下: 到“软件中心” -> 搜索“xchm”,并安装 -> 右键某个.chm文档,选择“属性” ...
- VC多文档编程技巧(取消一开始时打开的空白文档)
VC多文档编程技巧(取消一开始时打开的空白文档) http://blog.csdn.net/crazyvoice/article/details/6185461 VC多文档编程技巧(取消一开始时打开的 ...
- [转]C# 关闭嵌在程序中的word进程而不关闭用户通过word手动打开的word进程
命名空间 :System.Diagnostics 以前在word的时候,经常碰到word进程产生一大堆,怕关错了,把用户自己打开的word也关闭,一直搞忽悠,今天上网花了10块钱,下了个文件,给我了一 ...
- MarkDown语法记录,还在用word,txt编写项目文档吗?
开始之前 是不是在github上看项目的时候第一眼就要看项目介绍? 是不是经常在某些项目的代码里面看到一个README.MD文档 却不知道怎么写? 你是不是不知道,反正我是的. 作为一个程序员,可能写 ...
- 流操作text文件------读取、保存文档
************************************一.读取指定text文档中的内容:**************************************** 方法一. t ...
- 提高打开Android本地文档的速度
非常多Android开发人员在參考Android官方API时,都有一个令人头疼的问题:打开一个index.html平均都须要几分钟甚至更长.尤其是在打开API 8以上的版本号的时候.难道是网速不够好? ...
随机推荐
- .NET下用C#实现邮箱激活功能
最近要用到安全邮箱激活的功能,故写篇博客记录下. 思路:在表中增加一个字段State来记录邮箱是否激活(0激活,1未激活.) 1.发送邮件. 1-1,给邮箱发送邮件.内容:激活地址+GUID. ...
- 数往知来C#之 正则表达式 委托 XML<六>
C# 正则表达式篇 一.正则表达式 正则表达式就是一个字符串,不要想着一下子可以写出一个通用的表达式,先写,不正确再改 写正则表达式就是在找规律 关键字:Regex -->引入命名空间 ...
- 使用U盘安装win7系统,遇到“无法定位现有系统分区”问题
朋友的本子貌似因为安装360wifi而导致一进入系统就蓝屏重启,虽然之后就卸载了360wifi,但是问题依旧,上网Google了一下,发觉网上不少网友诉苦,也有人分析原因,说是因为360wifi导致了 ...
- UML的类图关系分为: 关联、聚合/组合、依赖、泛化(继承)
UML的类图关系分为: 关联.聚合/组合.依赖.泛化(继承).而其中关联又分为双向关联.单向关联.自身关联:下面就让我们一起来看看这些关系究竟是什么,以及它们的区别在哪里. 1.关联 双向关联:C1- ...
- 线性时间内确定T[0:n]是否有一个主元素
设T[0:n-1]是n 个元素的数组.对任一元素x,设S(x)={ i | T[i]=x}.当| S(x) |>n/2 时,称x 为T 的主元素.设计一个算法,确定T[0:n-1]是否有一个主元 ...
- Android APP的安装路径
转载自:http://blog.csdn.net/libaineu2004/article/details/25247711 一.安装路径在哪? Android应用安装涉及到如下几个目录: syste ...
- Java基础 —— DOM
DOM:文档对象模型(Document Object Model) 定义: 文档:标记型文档:html,xml 对象:将文档或文档中的标签等内容都封装到对象中 模型:只要是标记型文档都通用 将html ...
- html5 canvas图片翻转
<!doctype html> <html> <head> <meta charset="utf-8"> <title> ...
- 【转】大数据以及Hadoop相关概念介绍
原博文出自于: http://www.cnblogs.com/xdp-gacl/p/4230220.html 感谢! 一.大数据的基本概念 1.1.什么是大数据 大数据指的就是要处理的数据是TB级别以 ...
- [翻译]创建ASP.NET WebApi RESTful 服务(9)
一旦成功的发布API后,使用者将依赖于你所提供的服务.但是变更总是无法避免的,因此谨慎的制定ASP.NET Web API的版本策略就变得非常重要.一般来说,新的功能需要无缝的接入,有时新老版本需要并 ...