using MSWord = Microsoft.Office.Interop.Word;//word的操作方法库
using System.Reflection;//其中的Missing.Value类型可以作为函数参数的默认值传进去
MSWord.Application wordApp = new MSWord.Application();
//如果是ApplicationClass(),也是一样的,但需要修改Microsoft.Office.Interop.Word引用的属性中潜入互操作类型改为False
MSWord.Document wordDoc = wordApp.Documents.Open(fileName, Missing.Value, true);
//使用wordApp.Documents.Add(...)也可以,用法类似
//其实该函数的参数很多,在VS下鼠标放上去就可以显示出来
//这里的第一个参数fileName表示word文件路径,第三个参数true,表示readOnly=ture,即以只读方式打开,防止出现读写冲突
wordDoc.Close(false); //第一个参数为false表示退出时不保存更改。
wordApp.Quit(false); //第一个参数为false表示退出时不保存更改
MSWord.Range range = null;
通过MSWord.Ducument对象的Paragraphs属性获取,返回Paragraph的数组,Paragraphs对象的Count属性可以返回数组的长度。
MSWord.Paragraphs paras = wordDoc.Paragraphs;
MSWord.Paragraph []para = new MSWord.Paragraph[100];
for (i = 1; i <= paras.Count; i++) para[i-1] = para[i];
注意: 在这里,word库里面封装好的对象和属性,数组下标一般都是从1开始的,取0会报错
然后通过para[i].Range即可获取到某一段的Range,同时可以通过在调试的时候查看para[i].Range.Text的内容判断当前为哪一段。
但是很多时候,仅仅获取到一个段落的Range是远远不够的,我们需要更精确的选中某几个字的Range,同样有方法获取,请继续看。
我们知道在office中都是可以通过Ctrl + F实现查找功能的,而且一旦找到,会自动选中该找到的部分,所以我们同样可以通过C#调用查找功能,实现对Range的精确定位。
MSWord.Range objRange = null;
MSWord.Find findObj = null;
objRange = wordDoc.Range();//设置查找范围,这里选用的是全文范围,也可以通过para[i].Range使得在指定段落范围内查找
findObj = objRange.Find;//获取该范围的查找器对象
findObj.Text = "你需要查找的文本";
bool finded = findObj.Execute();//执行查找,返回bool类型表示是否查找成功,若成功则返回True
if( finded )//如果查找成功
{
......
}
执行完Execute()方法后,objRange将自动设置为找到的部分,可以通过objRange.Text查看是否查找正确(查找将返回找到的第一个匹配结果)
这里没有找到一个很好的方式来判断是否插入了一个正确的封面,但插入封面其实就是插入了一个有封面内容的page,封面样式不同,其内容也是不同的,所以可以直接取出封面部分的字符串来判断是否添加正确的封面。
例:
string wordText = wordDoc.Content.Text;
string cover = wordText.Substring(0, wordText.IndexOf("创业成功"));
if (cover.Equals("正确的字符串内容和格式")) grade += 1.0f;//操作正确,加分
通过MSWord.Range对象的Font对象获取字体的相关属性。
通过MSWord.Range.Font.×××获取
属性名 | 返回类型 | 含义 |
---|---|---|
Name | string | 获取字体名称,如“宋体”、“楷体”等 |
Size | float | 获取字体大小 |
Bold | int | 获取字体是否加粗,若加粗则值为-1 |
Italic | int | 获取字体是否倾斜,若倾斜则值为-1 |
Color | MSWord.WdColor | 获取字体颜色 |
Underline | MSWord.WdUnderline | 获取字体下划线类型 |
例:
if (range.Font.Color == MSWord.WdColor.wdColorRed &&
range.Font.Bold == -1 && objRange.Font.Italic == -1 &&
range.Font.Underline == MSWord.WdUnderline.wdUnderlineSingle &&
range.Font.Name == "黑体") grade += 1.0f;
通过MSWord.Range对象的ParagraphFormat对象获取段落格式的相关属性。
通过MSWord.Range.ParagraphFormat.×××获取
属性名 | 返回类型 | 含义 |
---|---|---|
CharacterUnitFirstLineIndent | float | 获取首行缩进字符数 |
LineSpacing | float | 获取行间距 |
Alignment | MSWord.WdParagraphAlignment | 获取段落对齐方式 |
例:
if (range.ParagraphFormat.CharacterUnitFirstLineIndent == 2) grade += 0.5f;
if (range.ParagraphFormat.LineSpacing == 37.2f) grade += 0.5f;
if (range.ParagraphFormat.Alignment == MSWord.WdParagraphAlignment.wdAlignParagraphCenter)
grade += 0.5f;
通过MSWord.Range对象的Borders对象获取边框的相关属性。
通过MSWord.Range.Borders.×××获取
属性名 | 返回类型 | 含义 |
---|---|---|
InsideColor | MSWord.WdColor | 获取内边框的颜色 |
OutsideColor | MSWord.WdColor | 获取外边框的颜色 |
InsideLineStyle | MSWord.WdLineStyle | 获取内边框的线条类型 |
OutsideLineStyle | MSWord.WdLineStyle | 获取外边框的线条类型 |
InsideLineWidth | MSWord.WdLineWidth | 获取内边框的线宽 |
OutsideLineWidth | MSWord.WdLineWidth | 获取外边框的线宽 |
例:
if (range.Borders.OutsideLineStyle == MSWord.WdLineStyle.wdLineStyleDouble &&
range.Borders.OutsideLineWidth == MSWord.WdLineWidth.wdLineWidth150pt )
grade += 0.5f;
if (range.Borders.OutsideColor == MSWord.WdColor.wdColorRed) grade += 0.5f;
通过MSWord.Range对象的Shading对象获取边框的相关属性。
通过MSWord.Range.Shading.×××获取
属性名 | 返回类型 | 含义 |
---|---|---|
Texture | MSWord.WdTextureIndex | 获取底纹的颜色深度 |
ForegroundPatternColor | MSWord.WdColor | 获取底纹的前景颜色 |
BackgroundPatternColor | MSWord.WdColor | 获取底纹的后景颜色 |
例:
if (range.Shading.Texture == MSWord.WdTextureIndex.wdTexture10Percent &&
range.Shading.ForegroundPatternColor == MSWord.WdColor.wdColorGreen &&
range.Shading.BackgroundPatternColor == MSWord.WdColor.wdColorGreen)
grade += 1.0f;
通过MSWord.Range对象的Hyperlinks[i]对象获取超链接的相关属性,i表示第i条超链接,如果只有一个超链接,i=1即可。
同时还可以通过Hyperlinks对象的Count属性获取Range中超链接的总个数。
通过MSWord.Range.Hyperlinks[i].×××获取
属性名 | 返回类型 | 含义 |
---|---|---|
Address | string | 获取超链接的地址字符串 |
TextToDisplay | string | 获取被链接文本 |
例:
if (range.Hyperlinks.Count > 0)
{
if (range.Hyperlinks[1].Address.Contains("www.×××.×××.cn")
&& range.Hyperlinks[1].TextToDisplay.Equals("××××")) grade += 1.0f;
}
通过MSWord.Range对象的Comments[i]对象获取边框的相关属性,i表示第i条批注,如果只有一条批注,i=1即可
同时还可以通过Comments对象的Count属性获取Range中批注的总条数。
通过MSWord.Range.Comments[i].×××获取
属性名 | 返回类型 | 含义 |
---|---|---|
Scope.Text | string | 获取被批注的文本内容 |
Range.Text | string | 获取批注内容 |
例:
if (range.Comments.Count > 1)
{
MSWord.Comment comment = range.Comments[1];
if (comment.Scope.Text == "缩略时代" && comment.Range.Text == "来自中国信息网")
grade += 1.0f;
}
通过MSWord.Document.Sections[1].Headers[MSWord.WdHeaderFooterIndex.wdHeaderFooterFirstPage].Shapes[1]获取水印的相关属性
通过MSWord.Document.Sections[1].Headers[MSWord.WdHeaderFooterIndex.wdHeaderFooterFirstPage].Shapes[1]].×××获取
属性名 | 返回类型 | 含义 |
---|---|---|
TextEffect.Text | string | 水印内容 |
TextEffect.FontName | string | 水印字体名称 |
TextEffect.FontSize | float | 水印字体大小 |
Fill.Transparency | float | 水印透明度,0.5表示半透明 |
Fill.ForeColor.Name | string | 水印字体的前景颜色 |
Fill.BackColor.Name | string | 水印字体的背景颜色 |
Fill.ForeColor.RGB | int | 水印字体的前景颜色rgb值,rgb = B×2552+G×2551+R×2550 |
Fill.BackColor.RGB | int | 水印字体的背景颜色rgb值,rgb = B×2552+G×2551+R×2550 |
Rotation | float | 旋转角度,设置为斜式的话值为315.0f |
例:
if(wordDoc.Sections[1].Headers[MSWord.WdHeaderFooterIndex.wdHeaderFooterFirstPage].Shapes.Count > 0)
{
grade += 0.5f;
MSWord.Shape shape = wordDoc.Sections[1].Headers[MSWord.WdHeaderFooterIndex.wdHeaderFooterFirstPage].Shapes[1];
if (shape.TextEffect.Text.Equals("计算机基础")) grade += 0.5f;
if (shape.TextEffect.FontName == "楷体") grade += 0.5f;
if (shape.TextEffect.FontSize == 44.0f) grade += 0.5f;
if (shape.Fill.Transparency == 0.5 && shape.Fill.ForeColor.RGB == 255) grade += 0.5f;
if (shape.Rotation == 315) grade += 0.5f;
}