想当年省计算机一级考了60飘过,暗自窃喜。
如今要考虑它是怎么给我判了个60分。
当年不会做Excel题,OUTLOOK题,IE题。
如今要搞清楚它判分的逻辑是什么。
两年如此大的差距,晕晕的开始没有头绪,后来...
矫情一番,收。什么是WORD对象模型?
word主要有五大对象,Application,Document,Selection,Bookmarks,Range。
1>包含一个起始位置和一个结束位置
2>它可以包含光标点,一段文本或者整个文档
3>它包含空格,tab以及paragraph marks
4>它可以是当前选中的区域,当然也可以不是当前选中区域
5>它被动态创建
6>当你在一个Range的末尾插入文本,这将扩展该Range
我用了一天的时间查了很多资料关于VBA,关于C# Winform开发word对象。发现这些知识很散很零碎,为什么这么说呢?首先word对象很多,譬如一个文档,一个段落,一个可选区域等等。一个对象又有N多的属性和方法。查了一天的资料,除了震惊它的强大之外,没别的想法。。冷静过后,觉得,大海捞针一般去查去找。不如把这一年的word操作题分类汇总,包括所有的操作题分类汇总。
于是我们做了以下的工作:
1、将所有题进行横向对比,找到固定题型,将一个大问题word操作,使它的粒度变小。
2、分到任务的人,主要去找这个东西是word下的什么对象,找它对应的属性和方法。
3、判分的关键点在于最后结果,至于过程不重要。例如:不管他是怎么移动的,总之最后结果是A存在,B不存在就好。
1、第一步引用word对象。在扩展中选择Microsoft.Office.Interop.Word。
在类文件中添加应用如下:
using Word = Microsoft.Office.Interop.Word; using System.IO; using System.Reflection;
例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("我发现了英文句号哦,替换失败,不加分!!"); } }
例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、给自己及时的反馈,积累有信心去解决下一个大问题!