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以上的版本号的时候.难道是网速不够好? ...
随机推荐
- OpenERP 7.0 中文报表PDF乱码(WindowsXP)
OpenERP默认安装输出的PDF中文报表都是一些方块: 此问题可以通过oecn_base_fonts模块解决: 更多关于oecn_base_fonts的信息请参考: 1. OpenERPv7.0 中 ...
- 链接服务器"(null)"的 OLE DB 访问接口 "Microsoft.Jet.OLEDB.4.0" 返回了消息 "未指定的错误"。[手稿]
消息 7302,级别 16,状态 1,第 1 行 无法创建链接服务器 "(null)" 的 OLE DB 访问接口 "Microsoft.JET.OLEDB.4.0&qu ...
- linux系统中内存爆满之后会如何?
在使用python写程序的时候,发现一个可以无限迭代的迭代器,从而可以直接将系统中的内存占满,那么占满之后会发生什么呢? 1. 创建无限迭代,生成列表,如下: [root@python ~]# pyt ...
- js动画框架设计
当你不再依赖JQuery时,当你已经厌倦了引入js类库实现一些动画效果的方式,当你想实现一个简单而实用的动画框架......下面介绍下愚人设计的动画框架:支持动画缓动算法函数,如Linear.Cubi ...
- 初识-----基于Socket的UDP和TCP编程及测试代码
一.概述 TCP(传输控制协议)和UDP(用户数据报协议是网络体系结构TCP/IP模型中传输层一层中的两个不同的通信协议. TCP:传输控制协议,一种面向连接的协议,给用户进程提供可靠的全双工的字节流 ...
- erlang 时间处理
常用代码 date()返回P{年,月,日} erlang:now转本地时间 > calendar:now_to_local_time(erlang:now()). {{,,},{,,}} erl ...
- Tachyon框架的Worker心跳及Master高可用性分析
0 概述 分布式框架中的Master-Slave类型,Slave节点负责工作的具体执行,Master负责任务的分发或者相关元数据的存储等.一般情况下,一个Master节点都会对应多个Slave节点,M ...
- 学生成绩管理系统 1.0(Java+MySql)
真难…… 数据库建立不会,中文编码不会,插入数据不会,删除不会…… Java读入数据不会……数据库连接不会…… 你也好意思说自己是学计算机的啊魂淡…… 我会慢慢写2.0,3.0版的……噗…… src/ ...
- spring properties resolve 问题
在stackoverflow上看到一个问题 配置如下: <context:property-placeholder location="/WEB-INF/application-cus ...
- Session和Cookie的分析与区别
首先说一下Web.config文件中的cookieless="false"的理解 cookieless="false"表示: 如果用户浏览器支持cookie时启 ...