基于VSTO的word文档格式检查插件的开发与研究
2016-11-24刘艳平
刘艳平
摘要:随着无纸化办公的不断推进,Microsoft Office办公软件逐渐成为主要的办公工具。利用Word写作文档时,难免会出现各种格式和内容错误,人工校对错误难免产生疏漏。因此研究基于VSTO的文档格式自动化检查辅助插件能够帮助使用者检查相关错误。从VSTO的特性入手,首先分析了Word的对象层次模型,然后就标题格式检查、正文重复词组、段落格式化、表格信息校对等功能的实现进行了研究。
关键词:VSTO;格式检查;Office 插件
中图分类号:TP317 文献标识码:A 文章编号:1009-3044(2016)26-0106-03
The Development and Research of Word Document Format-Checking Plug-in Based on VSTO
LIU Yan-ping
(Unit of 91413 PLA, Qinhuangdao 066000, China)
Abstract: With the continuous advancement of paperless office, Microsoft Office software have gradually become the main office tools. Using Word writing documents, there will inevitably be errors in various formats and contents, proofreading errors will inevitably produce omissions. Therefore, the research of document format-checking plug-ins based on VSTO can help users to check the errors. Beginning with the characteristics of VSTO, the object hierarchy model of Word is analyzed firstly. Then, the implementation of the title format-checking, the main body of repeated phrases, paragraph formatting, and Table information checking are studied.
Key words: VSTO; Format-Checking; Office Plug-in
1 背景
Microsoft Office是微软公司提供的一套功能强大的办公软件,具有强大的文件处理能力,但是在处理部分业务内容时,Office自动化程度不够,功能组合不够灵活等问题较为突出,因此一般情况下通常会开发一些功能插件辅助完成个人业务,例如Excel中创建针对不同项目的预算工作表,Word的合同自动生成功能等。
VSTO(Visual Studio Tools for Office )是一个用于创建自定义Office应用程序的Visual Studio工具包,是VBA(Visual Basic for Application)的替代,这个工具包里面提供了许多类库可以调用与Office客户端进行交互[1]。相比传统的VBA,VSTO可以使用Visual studio开发环境中的众多功能和CLR提供的内存管理,垃圾回收等功能,使得可以开发性能更高,功能更加丰富的外接程序[2]。VSTO最早支持Office 2000开发相关组件,最新版本已经支持Office 2015。VSTO可以开发文档级自定义项和应用程序级自定义项,文档级自定义项是只和单一、特定的文档相关联,应用程序级外接程序与某个Microsoft Office应用程序相关联。
Microsoft Office Word是一款强大的文字处理软件,可以很好地处理常见的文字任务,但是在处理繁琐的、机械性的、智能性的任务时,功能支持较为不佳。在工作中,部分单位常要处理大量的文字任务,文档的格式问题极易忽略和漏改,这种“低级”问题常会给文档阅读者留下不好的印象,让文档写作者头疼不已。本文的研究针对Word的常见文档格式检查插件的开发技术。
2 Word对象模型
在Visual Studio中开发Word的解决方案时,是通过与Word的对象模型交互实现的,这种对象模型由Word的主互操作程序集中提供的类和接口组成,并且在Microsoft.Office.Intertop.Word命名空间中定义。这些对象排列在一个与用户界面密切相关的层次结构中,Word对象模型抽象图如图1所示。
从图1可以看出,对象模型存在重叠,这种层次关系可以方便开发者通过多种方式访问相同类型的对象,例如要设置Bookmarks格式,可以访问当前选定内容、当前文档的范围。在对象层次模型中,Application对象代表Microsoft Word应用程序,该对象的属性可以控制Word环境;Document对象代表Word文档及其所有内容,是Word编程的中枢;Selection对象代表当前选择的区域,没有选中区域时代表光标插入点,Selection对象可以表示不连续的区域;Range对象表示文档的一个连续区域,一个文档可以包含多个Range;Bookmarks是具有名称的、可隐藏的书签。图1所示的对象层次结构明确了对象之间的调用路径和方式,通过这5个基本对象的属性、方法实现对Word文档的操作。
3 插件功能的实现
3.1 项目的建立
建立Office操作项目的方式为通过Visual Studio开发平台提供的模板,以C#语言开发Word2010为例,建立过程为“文件”→“新建项目”→“Visual C#”→“Office”→“2010”→“Word 2010 外接程序”→“输入项目名称”→完成。刚创建的VSTO外接程序只有一个ThisAddIn.cs文件,该文件即是一个宿主项,此宿主项提供对宿主应用程序(Office Word)和成员的对象模型的访问,可以通过宿主项添加数据绑定的能力和提供额外的事件来扩展本地Office文档。同时该类中有ThisAddIn_Startup和ThisAddIn_Shutdown两个方法,ThisAddIn_Startup方法的逻辑是在加载外接程序时运行的,VSTO外接程序主要是在该方法中调用运行,ThisAddIn_Shutdown方法中的内容是在卸载外接程序时运行,例如警告对话框等[3]。新建的项目的头部增加了如下两行代码:
using Office = Microsoft.Office;
using Microsoft.Office.Tools;
using Word = Microsoft.Office.Interop.Word;
此为Visual Studio自动引用的主互操作程序集(PIA),程序集中包含了Word的各级对象以及对象的属性和方法,从而能够与Office的COM对象交互。
3.2 标题格式
标题的章节号往往是手动添加,在修改文档时,有时会调整章节顺序,造成章节顺序错序,需要对标题章节号进行修改,手工修改容易因视觉疲劳产生疏漏,因此通过插件判别章节需要是否正确具有一定的实际意义。
标题序号的判断过程为:如果是一级标题,如果不是第一个标题,则该一级标题比上一个一级标题大1,如果是第一个标题则为1;如果是二级标题,则此二级标题的第一个部分和上一个一级标题相同,第二个部分属递增模式,如果是三级标题,则该标题的前两个部分和上一个二级标题相同,第三个部分属递增模式。VSTO实现该过程的简要过程如下:
Word.Application app= Globals.ThisAddIn.Application;
Word.Paragraphs paras = app.ActiveDocument.Paragraphs;
int count=paras.Count;
for(int k=1;k<=count;k++)
{
switch(paras[k].OutlineLevel)
{
case Word.WdOutlineLevel.wdOutlineLevel1:
step1:字符串分割,取标题序号,判断序号格式是否正确
step2:和上一个一级标题比较,判断序号是否递增
break;
case Word.WdOutlineLevel.wdOutlineLevel2:
case Word.WdOutlineLevel. wdOutlineLevel3:
}
VSTO向段落(paragraph)设置了大纲层次属性,属性用WdOutlineLevel枚举(enum)集合表示,WdOutlineLevel集合包括9个级别的标题和正文。在上文的实现过程中,可以通过判断段落的大纲层次识别当前段落是几级标题,然后通过正则表达式获取标题序号,判断当前序号的格式和内容是否正确[4]。
3.3 正文格式
在文章写作中,在整合不同来源的文章时,可能导致引入内容和源内容的格式不同,这种不同可能是行间距、字体大小、字体背景以及颜色的不同,如果手动检查调整所有段落的格式,工作量大,部分错误可能被疏漏,因此需要研究一种自动化的统一设定段落格式的工具。
在操作时,需要选中一个设定完毕格式的段落,然后选择格式化所有正文段落。在实现时,首先保存选定段落的格式,然后依次判断每个段落的大纲级别是不是段落,如果是就把该段落的格式设定为已保存的格式。
Word.Paragraphs paras = app.ActiveDocument.Paragraphs;
int count=paras.Count;
var format= app.Selection.ParagraphFormat;
for(int k=1;k<=count;k++)
if(para[i]. OutlineLevel== wdOutlineLevel)
{
paras[i]. Format= format
}
在文档写作时,绝大多数时候字或词组不会连续出现,如果连续出现,则可能是错误的,因此开发自动检测重复字段的功能,向文档写作者提示重复字段具有现实意义。重复字段的检查依赖正则表达式,开发时首先引入正则表达式的命名空间和相关类库:
using System.Text.RegularExpressions;
然后取得当前选定区域的内容:
string content = Globals.ThisAddIn.Application.ActiveDocument.Content;
var words = Globals.ThisAddIn.Application.Selection.Words;
设计正则表达式并将重复字段的背景色置位黄色的的实现过程如下:
string pattern = @"(.{1,5})\1+[5]";
Regex regex = new Regex(pattern);
foreach (Match match in regex.Matches(input))
{
if (regex.IsMatch(input))
{
i = match.Index;
l = match.Length;
for(var k=I;i<=(i+l);i++)
{
words[k].HighlightColorIndex = Word.WdColorIndex.wdYellow;
}
}
else{
MessageBox.Show(“没有重复词组”)}
}
3.4 检查表格中数字串
在信息登统计时,往往会处理银行卡号、手机号、身份证号等长度较长的数字串,这些数字信息中常有重复的连续数字出现,导致多输入或者少输入若干位,通过插件检测数字串的长度,进行初步的错误排查,能较大程度降低减少信息核对的工作量。
在功能开发时,如果当前鼠标未选中单元格集,则检查当前鼠标所在单元格的列中的所有数字单元格的内容,如果选中了单元格集,则只判断当前选中内容,实现方法的主要过程如下所示:
var cells = app.Selection.Range.Cells;
int count=cells.Count;
if (count == 1)
{
context = cells[k].Range.Text;
length = context.Length-2;
}
string context;
int length;
for (int k=1;k<=count;k++)
{
context = cells[k].Range.Text;
length = context.Length-2;
MessageBox.Show(length.ToString());
if (length != 11)
{
cells[k].Range.HighlightColorIndex = Word.WdColorIndex.wdRed;
}
}[6]
上文的方法检测了手机号的长度是否为11,在开发检查身份证信息功能时,可以在此基础上进行功能扩展。
4 结束语
相比VBA,VSTO有了更多的开发选择,在强大的Visual Studio开发环境下,可以向Office系列的应用程序增加和业务紧密相关的辅助性功能,也可以将应用程序二次开发为一个完整的桌面程序。
本文研究了VSTO在Word插件开发方面的应用,实现了标题序号检查、正文格式检查、重复内容检查、表格数字信息检查等功能,能够在一定程度上减少文档写作的工作量。VSTO强大的功能还需要进一步研究,接下来的研究工作主要研究VSTO与数据库的结合。
参考文献:
[1] McGrath K. VSTO开发指南[M]. 李永伦,译.北京: 机械工业出版社, 2009: 5-7.
[2] 张印. 基于VSTO的高校毕业论文格式化处理软件的设计与实现[D]. 北京: 北京邮电大学, 2012.
[3] 张未未, 吴宇峰, 刘仁权, 等. 基于VSTO技术的Office计时器插件的设计与实现[J]. 电子设计工程, 2016(11): 31-34,37.
[4] Microsoft. the Word 2010 Primary Interop Reference[DB/OL].(2016-01-08).https://msdn.microsoft.com/en-us/library/ff597928(v=office.14).aspx.
[5] Goyvaerts, Steven Levithan.正则表达式经典实例[M]. 郭耀, 迟骋,译. 北京: 人民邮电出版社, 2014: 25-28.
[6] 周顺, 朱成彪, 辛皓炜. 一种基于VSTO的Office操作题自动评分算法[J]. 电子制作, 2015(8): 102-103.