想当年省计算机一级考了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、给自己及时的反馈,积累有信心去解决下一个大问题!
版权声明:本文为博主原创文章,未经博主允许不得转载。
原文地址:http://blog.csdn.net/zhou2s_101216/article/details/47379989