劉艷平
摘要:隨著無(wú)紙化辦公的不斷推進(jìn),Microsoft Office辦公軟件逐漸成為主要的辦公工具。利用Word寫作文檔時(shí),難免會(huì)出現(xiàn)各種格式和內(nèi)容錯(cuò)誤,人工校對(duì)錯(cuò)誤難免產(chǎn)生疏漏。因此研究基于VSTO的文檔格式自動(dòng)化檢查輔助插件能夠幫助使用者檢查相關(guān)錯(cuò)誤。從VSTO的特性入手,首先分析了Word的對(duì)象層次模型,然后就標(biāo)題格式檢查、正文重復(fù)詞組、段落格式化、表格信息校對(duì)等功能的實(shí)現(xiàn)進(jìn)行了研究。
關(guān)鍵詞:VSTO;格式檢查;Office 插件
中圖分類號(hào):TP317 文獻(xiàn)標(biāo)識(shí)碼:A 文章編號(hào):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是微軟公司提供的一套功能強(qiáng)大的辦公軟件,具有強(qiáng)大的文件處理能力,但是在處理部分業(yè)務(wù)內(nèi)容時(shí),Office自動(dòng)化程度不夠,功能組合不夠靈活等問(wèn)題較為突出,因此一般情況下通常會(huì)開發(fā)一些功能插件輔助完成個(gè)人業(yè)務(wù),例如Excel中創(chuàng)建針對(duì)不同項(xiàng)目的預(yù)算工作表,Word的合同自動(dòng)生成功能等。
VSTO(Visual Studio Tools for Office )是一個(gè)用于創(chuàng)建自定義Office應(yīng)用程序的Visual Studio工具包,是VBA(Visual Basic for Application)的替代,這個(gè)工具包里面提供了許多類庫(kù)可以調(diào)用與Office客戶端進(jìn)行交互[1]。相比傳統(tǒng)的VBA,VSTO可以使用Visual studio開發(fā)環(huán)境中的眾多功能和CLR提供的內(nèi)存管理,垃圾回收等功能,使得可以開發(fā)性能更高,功能更加豐富的外接程序[2]。VSTO最早支持Office 2000開發(fā)相關(guān)組件,最新版本已經(jīng)支持Office 2015。VSTO可以開發(fā)文檔級(jí)自定義項(xiàng)和應(yīng)用程序級(jí)自定義項(xiàng),文檔級(jí)自定義項(xiàng)是只和單一、特定的文檔相關(guān)聯(lián),應(yīng)用程序級(jí)外接程序與某個(gè)Microsoft Office應(yīng)用程序相關(guān)聯(lián)。
Microsoft Office Word是一款強(qiáng)大的文字處理軟件,可以很好地處理常見的文字任務(wù),但是在處理繁瑣的、機(jī)械性的、智能性的任務(wù)時(shí),功能支持較為不佳。在工作中,部分單位常要處理大量的文字任務(wù),文檔的格式問(wèn)題極易忽略和漏改,這種“低級(jí)”問(wèn)題常會(huì)給文檔閱讀者留下不好的印象,讓文檔寫作者頭疼不已。本文的研究針對(duì)Word的常見文檔格式檢查插件的開發(fā)技術(shù)。
2 Word對(duì)象模型
在Visual Studio中開發(fā)Word的解決方案時(shí),是通過(guò)與Word的對(duì)象模型交互實(shí)現(xiàn)的,這種對(duì)象模型由Word的主互操作程序集中提供的類和接口組成,并且在Microsoft.Office.Intertop.Word命名空間中定義。這些對(duì)象排列在一個(gè)與用戶界面密切相關(guān)的層次結(jié)構(gòu)中,Word對(duì)象模型抽象圖如圖1所示。
從圖1可以看出,對(duì)象模型存在重疊,這種層次關(guān)系可以方便開發(fā)者通過(guò)多種方式訪問(wèn)相同類型的對(duì)象,例如要設(shè)置Bookmarks格式,可以訪問(wèn)當(dāng)前選定內(nèi)容、當(dāng)前文檔的范圍。在對(duì)象層次模型中,Application對(duì)象代表Microsoft Word應(yīng)用程序,該對(duì)象的屬性可以控制Word環(huán)境;Document對(duì)象代表Word文檔及其所有內(nèi)容,是Word編程的中樞;Selection對(duì)象代表當(dāng)前選擇的區(qū)域,沒(méi)有選中區(qū)域時(shí)代表光標(biāo)插入點(diǎn),Selection對(duì)象可以表示不連續(xù)的區(qū)域;Range對(duì)象表示文檔的一個(gè)連續(xù)區(qū)域,一個(gè)文檔可以包含多個(gè)Range;Bookmarks是具有名稱的、可隱藏的書簽。圖1所示的對(duì)象層次結(jié)構(gòu)明確了對(duì)象之間的調(diào)用路徑和方式,通過(guò)這5個(gè)基本對(duì)象的屬性、方法實(shí)現(xiàn)對(duì)Word文檔的操作。
3 插件功能的實(shí)現(xiàn)
3.1 項(xiàng)目的建立
建立Office操作項(xiàng)目的方式為通過(guò)Visual Studio開發(fā)平臺(tái)提供的模板,以C#語(yǔ)言開發(fā)Word2010為例,建立過(guò)程為“文件”→“新建項(xiàng)目”→“Visual C#”→“Office”→“2010”→“Word 2010 外接程序”→“輸入項(xiàng)目名稱”→完成。剛創(chuàng)建的VSTO外接程序只有一個(gè)ThisAddIn.cs文件,該文件即是一個(gè)宿主項(xiàng),此宿主項(xiàng)提供對(duì)宿主應(yīng)用程序(Office Word)和成員的對(duì)象模型的訪問(wèn),可以通過(guò)宿主項(xiàng)添加數(shù)據(jù)綁定的能力和提供額外的事件來(lái)擴(kuò)展本地Office文檔。同時(shí)該類中有ThisAddIn_Startup和ThisAddIn_Shutdown兩個(gè)方法,ThisAddIn_Startup方法的邏輯是在加載外接程序時(shí)運(yùn)行的,VSTO外接程序主要是在該方法中調(diào)用運(yùn)行,ThisAddIn_Shutdown方法中的內(nèi)容是在卸載外接程序時(shí)運(yùn)行,例如警告對(duì)話框等[3]。新建的項(xiàng)目的頭部增加了如下兩行代碼:
using Office = Microsoft.Office;
using Microsoft.Office.Tools;
using Word = Microsoft.Office.Interop.Word;
此為Visual Studio自動(dòng)引用的主互操作程序集(PIA),程序集中包含了Word的各級(jí)對(duì)象以及對(duì)象的屬性和方法,從而能夠與Office的COM對(duì)象交互。
3.2 標(biāo)題格式
標(biāo)題的章節(jié)號(hào)往往是手動(dòng)添加,在修改文檔時(shí),有時(shí)會(huì)調(diào)整章節(jié)順序,造成章節(jié)順序錯(cuò)序,需要對(duì)標(biāo)題章節(jié)號(hào)進(jìn)行修改,手工修改容易因視覺(jué)疲勞產(chǎn)生疏漏,因此通過(guò)插件判別章節(jié)需要是否正確具有一定的實(shí)際意義。
標(biāo)題序號(hào)的判斷過(guò)程為:如果是一級(jí)標(biāo)題,如果不是第一個(gè)標(biāo)題,則該一級(jí)標(biāo)題比上一個(gè)一級(jí)標(biāo)題大1,如果是第一個(gè)標(biāo)題則為1;如果是二級(jí)標(biāo)題,則此二級(jí)標(biāo)題的第一個(gè)部分和上一個(gè)一級(jí)標(biāo)題相同,第二個(gè)部分屬遞增模式,如果是三級(jí)標(biāo)題,則該標(biāo)題的前兩個(gè)部分和上一個(gè)二級(jí)標(biāo)題相同,第三個(gè)部分屬遞增模式。VSTO實(shí)現(xiàn)該過(guò)程的簡(jiǎn)要過(guò)程如下:
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:字符串分割,取標(biāo)題序號(hào),判斷序號(hào)格式是否正確
step2:和上一個(gè)一級(jí)標(biāo)題比較,判斷序號(hào)是否遞增
break;
case Word.WdOutlineLevel.wdOutlineLevel2:
case Word.WdOutlineLevel. wdOutlineLevel3:
}
VSTO向段落(paragraph)設(shè)置了大綱層次屬性,屬性用WdOutlineLevel枚舉(enum)集合表示,WdOutlineLevel集合包括9個(gè)級(jí)別的標(biāo)題和正文。在上文的實(shí)現(xiàn)過(guò)程中,可以通過(guò)判斷段落的大綱層次識(shí)別當(dāng)前段落是幾級(jí)標(biāo)題,然后通過(guò)正則表達(dá)式獲取標(biāo)題序號(hào),判斷當(dāng)前序號(hào)的格式和內(nèi)容是否正確[4]。
3.3 正文格式
在文章寫作中,在整合不同來(lái)源的文章時(shí),可能導(dǎo)致引入內(nèi)容和源內(nèi)容的格式不同,這種不同可能是行間距、字體大小、字體背景以及顏色的不同,如果手動(dòng)檢查調(diào)整所有段落的格式,工作量大,部分錯(cuò)誤可能被疏漏,因此需要研究一種自動(dòng)化的統(tǒng)一設(shè)定段落格式的工具。
在操作時(shí),需要選中一個(gè)設(shè)定完畢格式的段落,然后選擇格式化所有正文段落。在實(shí)現(xiàn)時(shí),首先保存選定段落的格式,然后依次判斷每個(gè)段落的大綱級(jí)別是不是段落,如果是就把該段落的格式設(shè)定為已保存的格式。
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
}
在文檔寫作時(shí),絕大多數(shù)時(shí)候字或詞組不會(huì)連續(xù)出現(xiàn),如果連續(xù)出現(xiàn),則可能是錯(cuò)誤的,因此開發(fā)自動(dòng)檢測(cè)重復(fù)字段的功能,向文檔寫作者提示重復(fù)字段具有現(xiàn)實(shí)意義。重復(fù)字段的檢查依賴正則表達(dá)式,開發(fā)時(shí)首先引入正則表達(dá)式的命名空間和相關(guān)類庫(kù):
using System.Text.RegularExpressions;
然后取得當(dāng)前選定區(qū)域的內(nèi)容:
string content = Globals.ThisAddIn.Application.ActiveDocument.Content;
var words = Globals.ThisAddIn.Application.Selection.Words;
設(shè)計(jì)正則表達(dá)式并將重復(fù)字段的背景色置位黃色的的實(shí)現(xiàn)過(guò)程如下:
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(“沒(méi)有重復(fù)詞組”)}
}
3.4 檢查表格中數(shù)字串
在信息登統(tǒng)計(jì)時(shí),往往會(huì)處理銀行卡號(hào)、手機(jī)號(hào)、身份證號(hào)等長(zhǎng)度較長(zhǎng)的數(shù)字串,這些數(shù)字信息中常有重復(fù)的連續(xù)數(shù)字出現(xiàn),導(dǎo)致多輸入或者少輸入若干位,通過(guò)插件檢測(cè)數(shù)字串的長(zhǎng)度,進(jìn)行初步的錯(cuò)誤排查,能較大程度降低減少信息核對(duì)的工作量。
在功能開發(fā)時(shí),如果當(dāng)前鼠標(biāo)未選中單元格集,則檢查當(dāng)前鼠標(biāo)所在單元格的列中的所有數(shù)字單元格的內(nèi)容,如果選中了單元格集,則只判斷當(dāng)前選中內(nèi)容,實(shí)現(xiàn)方法的主要過(guò)程如下所示:
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]
上文的方法檢測(cè)了手機(jī)號(hào)的長(zhǎng)度是否為11,在開發(fā)檢查身份證信息功能時(shí),可以在此基礎(chǔ)上進(jìn)行功能擴(kuò)展。
4 結(jié)束語(yǔ)
相比VBA,VSTO有了更多的開發(fā)選擇,在強(qiáng)大的Visual Studio開發(fā)環(huán)境下,可以向Office系列的應(yīng)用程序增加和業(yè)務(wù)緊密相關(guān)的輔助性功能,也可以將應(yīng)用程序二次開發(fā)為一個(gè)完整的桌面程序。
本文研究了VSTO在Word插件開發(fā)方面的應(yīng)用,實(shí)現(xiàn)了標(biāo)題序號(hào)檢查、正文格式檢查、重復(fù)內(nèi)容檢查、表格數(shù)字信息檢查等功能,能夠在一定程度上減少文檔寫作的工作量。VSTO強(qiáng)大的功能還需要進(jìn)一步研究,接下來(lái)的研究工作主要研究VSTO與數(shù)據(jù)庫(kù)的結(jié)合。
參考文獻(xiàn):
[1] McGrath K. VSTO開發(fā)指南[M]. 李永倫,譯.北京: 機(jī)械工業(yè)出版社, 2009: 5-7.
[2] 張印. 基于VSTO的高校畢業(yè)論文格式化處理軟件的設(shè)計(jì)與實(shí)現(xiàn)[D]. 北京: 北京郵電大學(xué), 2012.
[3] 張未未, 吳宇峰, 劉仁權(quán), 等. 基于VSTO技術(shù)的Office計(jì)時(shí)器插件的設(shè)計(jì)與實(shí)現(xiàn)[J]. 電子設(shè)計(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.正則表達(dá)式經(jīng)典實(shí)例[M]. 郭耀, 遲騁,譯. 北京: 人民郵電出版社, 2014: 25-28.
[6] 周順, 朱成彪, 辛皓煒. 一種基于VSTO的Office操作題自動(dòng)評(píng)分算法[J]. 電子制作, 2015(8): 102-103.