本文正式开始在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命名空间:我添加的是:

  1. using MSWord    =   Microsoft.Office.Interop.Word;

2.打开Word文档

然后给Form添加一个Load事件的消息响应函数OnLoad:

好了。下一步,我们完善OnLoad函数:

  1. private MSWord.Application m_word;
  2. private MSWord.Document m_doc;
  3. public Form1()
  4. {
  5. InitializeComponent();
  6. }
  7. private void OnLoad(object sender, EventArgs e)
  8. {
  9. m_word = new MSWord.Application();
  10. }

在OnLoad中我们实例化了一个Word的Application对象,代表Word2007应用程序。

这样只打开了一个应用程序的空壳,里面还没有文档。下面我们就打开一个已有的文档吧。

在打开之前,我们先添加一个按钮,然后为其设置Click事件的监听器OnOpen()

  1. private void OnOpen(object sender, EventArgs e)
  2. {
  3. Object filename = "test.docx";
  4. Object filefullname = @"C:\Users\David_ss\Desktop\项目管理\test.docx";
  5. Object confirmConversions = Type.Missing;
  6. Object readOnly = Type.Missing;
  7. Object addToRecentFiles = Type.Missing;
  8. Object passwordDocument = Type.Missing;
  9. Object passwordTemplate = Type.Missing;
  10. Object revert = Type.Missing;
  11. Object writePasswordDocument = Type.Missing;
  12. Object writePasswordTemplate = Type.Missing;
  13. Object format = Type.Missing;
  14. Object encoding = Type.Missing;
  15. Object visible = Type.Missing;
  16. Object openConflictDocument = Type.Missing;
  17. Object openAndRepair = Type.Missing;
  18. Object documentDirection = Type.Missing;
  19. Object noEncodingDialog = Type.Missing;
  20. for (int i = 1; i <= m_word.Documents.Count; i++)
  21. {
  22. String str = m_word.Documents[i].FullName.ToString();
  23. if (str == filefullname.ToString())
  24. {
  25. MessageBox.Show("请勿重复打开该文档");
  26. return;
  27. }
  28. }
  29. try
  30. {
  31. m_word.Documents.Open(ref filefullname,
  32. ref confirmConversions, ref readOnly, ref addToRecentFiles,
  33. ref passwordDocument, ref passwordTemplate, ref revert,
  34. ref writePasswordDocument, ref writePasswordTemplate,
  35. ref format, ref encoding, ref visible, ref openConflictDocument,
  36. ref openAndRepair, ref documentDirection, ref noEncodingDialog
  37. );
  38. m_word.Visible = true;
  39. //MessageBox.Show(m_word.Documents.Count.ToString());
  40. //MessageBox.Show(m_word.Documents[1].FullName.ToString());
  41. }
  42. catch (System.Exception ex)
  43. {
  44. MessageBox.Show("打开Word文档出错");
  45. }
  46. }

可以看到,这里调用的是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):

  1. private void OnShowInfo(object sender, EventArgs e)
  2. {
  3. System.Diagnostics.Debug.WriteLine("当前打开文档数量: "+m_word.Documents.Count.ToString()+"\n");
  4. System.Diagnostics.Debug.WriteLine(m_word.ActiveDocument.Paragraphs.Count.ToString());
  5. }

由于Word里面的对象属性实在是太多,这里也就随便选择两个吧。第一行是当前打开文档数量,第二行是当前激活的文档的自然段个数:

可以看到分别输出1和2,没错吧。

4.关闭Word文档,退出Word应用程序

最后,我们再来看看如何关闭吧,同样的,先添加按钮,然后添加OnClose()监听器。

  1. private void OnClose(object sender, EventArgs e)
  2. {
  3. //避免弹出normal.dotm被使用的对话框,自动保存模板
  4. m_word.NormalTemplate.Saved = true;
  5. //先关闭打开的文档(注意saveChanges选项)
  6. Object saveChanges = MSWord.WdSaveOptions.wdSaveChanges;
  7. Object originalFormat = Type.Missing;
  8. Object routeDocument = Type.Missing;
  9. m_word.Documents.Close(ref saveChanges,ref originalFormat, ref routeDocument);
  10. //若已经没有文档存在,则关闭应用程序
  11. if (m_word.Documents.Count == 0)
  12. {
  13. m_word.Quit(Type.Missing, Type.Missing, Type.Missing);
  14. }
  15. }

这里面需要注意的是为了防止弹出 normal.dotm被使用的对话框,最好先自动保存模板。

然后设置好你需要的saveOption.有三种,分别是

  • wdSaveChanges
  • wdDoNotSaveChanges
  • wdPromptToSaveChanges
OK,今天就介绍这么多吧。下次再介绍有关Selection对象和Range对象吧。
 
-------------------------------华丽分割--------------------------------------
 

MSDN------>Word.Document对象

C#操作Word (2)-- 打开&关闭Word文档的更多相关文章

  1. C#操作Excel(2)-- 打开-读取Excel文档

    由于要为某软件实现导出Excel功能,故有此文. 本文的开发环境是Visual Studio 2010 ,C#, Excel 2007. 新建C#工程后打开Solution Explorer,可以看到 ...

  2. java操作office和pdf文件java读取word,excel和pdf文档内容

    在平常应用程序中,对office和pdf文档进行读取数据是比较常见的功能,尤其在很多web应用程序中.所以今天我们就简单来看一下Java对word.excel.pdf文件的读取.本篇博客只是讲解简单应 ...

  3. 通过freemarker生成一个word,解决生成的word用wps打开有问题的问题,解决出word时中文文件名乱码问题,解决打开出word时打开的word出现问题的问题,出图片,解决动态列表

     通过freemarker制作word比较简单 步骤:制作word模板.制作方式是:将模板word保存成为xml----在xml的word模板中添加相应的标记----将xml的word文件的后缀名 ...

  4. Ubuntu 14 如何打开 .chm格式文档?

    好多手册是.chm格式,Ubuntu是需要安装第三方软件才能打开.chm格式文档,操作方式如下: 到“软件中心” -> 搜索“xchm”,并安装 -> 右键某个.chm文档,选择“属性” ...

  5. VC多文档编程技巧(取消一开始时打开的空白文档)

    VC多文档编程技巧(取消一开始时打开的空白文档) http://blog.csdn.net/crazyvoice/article/details/6185461 VC多文档编程技巧(取消一开始时打开的 ...

  6. [转]C# 关闭嵌在程序中的word进程而不关闭用户通过word手动打开的word进程

    命名空间 :System.Diagnostics 以前在word的时候,经常碰到word进程产生一大堆,怕关错了,把用户自己打开的word也关闭,一直搞忽悠,今天上网花了10块钱,下了个文件,给我了一 ...

  7. MarkDown语法记录,还在用word,txt编写项目文档吗?

    开始之前 是不是在github上看项目的时候第一眼就要看项目介绍? 是不是经常在某些项目的代码里面看到一个README.MD文档 却不知道怎么写? 你是不是不知道,反正我是的. 作为一个程序员,可能写 ...

  8. 流操作text文件------读取、保存文档

    ************************************一.读取指定text文档中的内容:**************************************** 方法一. t ...

  9. 提高打开Android本地文档的速度

    非常多Android开发人员在參考Android官方API时,都有一个令人头疼的问题:打开一个index.html平均都须要几分钟甚至更长.尤其是在打开API 8以上的版本号的时候.难道是网速不够好? ...

随机推荐

  1. .NET下用C#实现邮箱激活功能

    最近要用到安全邮箱激活的功能,故写篇博客记录下. 思路:在表中增加一个字段State来记录邮箱是否激活(0激活,1未激活.) 1.发送邮件.     1-1,给邮箱发送邮件.内容:激活地址+GUID. ...

  2. 数往知来C#之 正则表达式 委托 XML<六>

    C# 正则表达式篇 一.正则表达式 正则表达式就是一个字符串,不要想着一下子可以写出一个通用的表达式,先写,不正确再改 写正则表达式就是在找规律 关键字:Regex    -->引入命名空间  ...

  3. 使用U盘安装win7系统,遇到“无法定位现有系统分区”问题

    朋友的本子貌似因为安装360wifi而导致一进入系统就蓝屏重启,虽然之后就卸载了360wifi,但是问题依旧,上网Google了一下,发觉网上不少网友诉苦,也有人分析原因,说是因为360wifi导致了 ...

  4. UML的类图关系分为: 关联、聚合/组合、依赖、泛化(继承)

    UML的类图关系分为: 关联.聚合/组合.依赖.泛化(继承).而其中关联又分为双向关联.单向关联.自身关联:下面就让我们一起来看看这些关系究竟是什么,以及它们的区别在哪里. 1.关联 双向关联:C1- ...

  5. 线性时间内确定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]是否有一个主元 ...

  6. Android APP的安装路径

    转载自:http://blog.csdn.net/libaineu2004/article/details/25247711 一.安装路径在哪? Android应用安装涉及到如下几个目录: syste ...

  7. Java基础 —— DOM

    DOM:文档对象模型(Document Object Model) 定义: 文档:标记型文档:html,xml 对象:将文档或文档中的标签等内容都封装到对象中 模型:只要是标记型文档都通用 将html ...

  8. html5 canvas图片翻转

    <!doctype html> <html> <head> <meta charset="utf-8"> <title> ...

  9. 【转】大数据以及Hadoop相关概念介绍

    原博文出自于: http://www.cnblogs.com/xdp-gacl/p/4230220.html 感谢! 一.大数据的基本概念 1.1.什么是大数据 大数据指的就是要处理的数据是TB级别以 ...

  10. [翻译]创建ASP.NET WebApi RESTful 服务(9)

    一旦成功的发布API后,使用者将依赖于你所提供的服务.但是变更总是无法避免的,因此谨慎的制定ASP.NET Web API的版本策略就变得非常重要.一般来说,新的功能需要无缝的接入,有时新老版本需要并 ...