快速上手之 C#操作WORD对象模型

想当年省计算机一级考了60飘过,暗自窃喜。

如今要考虑它是怎么给我判了个60分。

当年不会做Excel题,OUTLOOK题,IE题。

如今要搞清楚它判分的逻辑是什么。

两年如此大的差距,晕晕的开始没有头绪,后来...


矫情一番,收。什么是WORD对象模型?


初步认识:


word主要有五大对象,Application,Document,Selection,Bookmarks,Range。


  • Application:代表Microsoft Word应用程序本身,是所有对象的基类,对word环境的控制是通过Application的一些属性和方法。
  • Document:代表一个word文档,就是点击你桌面上右击,新建一个word文档,那个实例化出来的对象就是document对象。因为是Application的子类,所以可以通过Application对象的activedocument属性获取当前文档对象。
  • Selection:代表当前选中的区域(高亮),没有选中区域时代表光标点。
  • Bookmarks:书签。
  • Range(很常用):代表一块区域,与Selection类似,不过一般不可见

  1>包含一个起始位置和一个结束位置
  2>它可以包含光标点,一段文本或者整个文档
  3>它包含空格,tab以及paragraph marks
  4>它可以是当前选中的区域,当然也可以不是当前选中区域
  5>它被动态创建
  6>当你在一个Range的末尾插入文本,这将扩展该Range



快速上手之 C#操作WORD对象模型_第1张图片



找到技巧:


  我用了一天的时间查了很多资料关于VBA,关于C# Winform开发word对象。发现这些知识很散很零碎,为什么这么说呢?首先word对象很多,譬如一个文档,一个段落,一个可选区域等等。一个对象又有N多的属性和方法。查了一天的资料,除了震惊它的强大之外,没别的想法。。冷静过后,觉得,大海捞针一般去查去找。不如把这一年的word操作题分类汇总,包括所有的操作题分类汇总。

  

  于是我们做了以下的工作:

1、将所有题进行横向对比,找到固定题型,将一个大问题word操作,使它的粒度变小。

2、分到任务的人,主要去找这个东西是word下的什么对象,找它对应的属性和方法。

3、判分的关键点在于最后结果,至于过程不重要。例如:不管他是怎么移动的,总之最后结果是A存在,B不存在就好。


实例操作:


1、第一步引用word对象。在扩展中选择Microsoft.Office.Interop.Word。


快速上手之 C#操作WORD对象模型_第2张图片

在类文件中添加应用如下:

using Word = Microsoft.Office.Interop.Word;
using System.IO;
using System.Reflection;

2、找到你要操作的对象,和想查找该对象的某个属性。


例1:

  题目是将全文的“.”替换为“。”   因为我们要最后的结果,我就想到用IndexOf()去查找“.”的位置,如果找不到它的位置返回为-1,就证明没有这个符号。

首先对复用的语句可以写成一个Wordhelper:

  /// <summary>
        /// 读取 word文档 返回内容
        /// </summary>
        /// <param name="path"></param>
        /// <returns></returns>
        public static string GetWordContent(string path)
        {
            try
            {
                Microsoft.Office.Interop.Word.Application app = new Microsoft.Office.Interop.Word.Application();
                Type wordType = app.GetType();
                Microsoft.Office.Interop.Word.Document doc = null;
                object unknow = Type.Missing;
                app.Visible = false;

                object file = path;
                doc = app.Documents.Add (ref file,
                    ref unknow, ref unknow, ref unknow);
                int count = doc.Paragraphs.Count;
                StringBuilder sb = new StringBuilder();
                for (int i = 1; i <= count; i++)
                {
                    
                    sb.Append(doc.Paragraphs[i].Range.Text.Trim());
                }
                //关闭word进程
                doc.Close (ref unknow, ref unknow, ref unknow);
                wordType.InvokeMember("Quit", System.Reflection.BindingFlags.InvokeMethod, null, app, null);
                doc = null;
                app = null;
                //垃圾回收
                GC.Collect();
                GC.WaitForPendingFinalizers();

                string temp = sb.ToString();
                return temp;
            }
            catch
            {
                return "";
            }
        }

这个方法,只有你传路径给它,它就可以返回给你文档中的内容。我们就可以去查找文档中的文字了。

 private void button1_Click(object sender, EventArgs e)
        {
            //判断查找替换题,是否完成正确
            string wordcontent = GetWordContent(@"H:\12080141043.docx");
            //得到wordcontent为word中的内容
            int keyword = wordcontent.IndexOf(".");
            //keyword是要查找的关键字
            if (keyword == -1)   //等于-1代表没有找到它的位置,证明替代成功。
            {
                MessageBox.Show("我没有找到英文句号哦,替换成功,加一分!!");
            }
            else
            {
                MessageBox.Show("我发现了英文句号哦,替换失败,不加分!!");
            }
        }

  上面的wordhelper中就用到了Application对象和document对象获取文档中的paragraphs。



例2:设置行间距的最小值等属性。我们要考虑如何取得doc对象,确定是哪个属性。


private void button1_Click(object sender, EventArgs e)
        {
            //设置全文段落:设置文章中正文文字为宋体、小四号字,左对齐,首行缩进2字符,行距为最小值20磅。
            Microsoft.Office.Interop.Word.Application app = new Microsoft.Office.Interop.Word.Application();
            object unknow = Type.Missing;
            object file = "H:\\12080141043.docx";
            Microsoft.Office.Interop.Word.Document doc = app.Documents.Add(ref file, ref unknow, ref unknow, ref unknow);
            
            //行间距为22
            string rightkey = "22";
            if (app.Selection.ParagraphFormat.LineSpacing.ToString()==rightkey )
            {
                MessageBox.Show("当前行距为最小值22磅。设置成功+1分!");
            }
            else
            {
                MessageBox.Show("设置失败!");
            }


           
            //字体设置为小四  ==14
            string rightsize = "14";
            if (doc.Paragraphs.Last.Range.Font.Size.ToString()==rightsize )
            {
                MessageBox.Show("当前正文字体为小四号体,设置成功+1分!");
            }
            else
            {
                MessageBox.Show("设置失败!");
            }


            //字体为黑体
            string rightstyle = "黑体";
            if (doc.Paragraphs[1].Range.Font.Name == rightstyle)
            {
                MessageBox.Show("当前正文字体黑体的,设置成功+1分!");
            }
            else
            {
                MessageBox.Show("设置失败!");
            }


            //左对齐
            //app.Selection.ParagraphFormat.Alignment = Word.WdParagraphAlignment.wdAlignParagraphLeft;
            if (app.Selection.ParagraphFormat.Alignment == Word.WdParagraphAlignment.wdAlignParagraphLeft)
            {
                MessageBox.Show("当前设置为左对齐,加一分!");
            }
            else
            {
                MessageBox.Show("设置失败!");
            }

            
            
            
           // 首行缩进2个字符   32.15
            string firstline = "32.15";
            if (app.Selection.ParagraphFormat.FirstLineIndent.ToString()==firstline )
            {
                MessageBox.Show("设置首行缩进两个字符成功!加一分!!");
            }
            else
            {
                MessageBox.Show("设置失败!");
            }


        }
  

  这两个只是一个例子,比如页面设置,页眉页脚的设置都可以实现的。等着你去发现~


小结:

  开始觉得这个任务很难,之前没有接触过VBA,后来查了一些资料,才发现什么都是可以实现的,就怕你不敢想。开始因为恐惧不敢开始,不如把困难最小化,一个一个的攻破。感谢这篇博客,给我带来很多的帮助:http://www.cnblogs.com/eye-like/p/4121219.html

还有这一篇C#word常用操作汇总BaiDu文库。


最近体会很深刻的:

1、开始都不知道自己在百度什么东西,需要一点点的去改变搜索关键字。

2、遇到多,大,散的东西。就归类,汇总。把问题集中,分到各个人去解决小问题。大问题就不攻自破了。

3、给自己及时的反馈,积累有信心去解决下一个大问题!









你可能感兴趣的:(C#,word,VBA)