摘要:隨著辦公量的日益增大,對(duì)辦公軟件的二次開(kāi)發(fā)以適應(yīng)需求的趨勢(shì)變得必要。該文介紹了VB.NET環(huán)境下通過(guò)Office PIA對(duì)Word工程配筋計(jì)算報(bào)告書(shū)進(jìn)行編程設(shè)計(jì)的方法,包括文檔文字、圖片和表格等的自動(dòng)生成與排版設(shè)計(jì)。采用該方法可大幅度提高辦公效率。
關(guān)鍵詞:Office PIA;VB.NET;Word;自動(dòng)化
中圖分類(lèi)號(hào):TP311 文獻(xiàn)標(biāo)識(shí)碼:A 文章編號(hào):1009-3044(2013)12-2899-05
計(jì)算機(jī)的程序開(kāi)發(fā)應(yīng)用廣泛,對(duì)Office軟件的二次開(kāi)發(fā)實(shí)現(xiàn)辦公的自動(dòng)化大幅提高辦公的效率和準(zhǔn)確性。Office的編程接口都是通過(guò)COM組件公開(kāi)的,任何訪問(wèn)Office編程接口的程序,實(shí)際上都必須要最終調(diào)用Office COM組件?;贠ffice PIA,.Net能夠讓開(kāi)發(fā)人員非常方便的訪問(wèn)COM組件。該文使用VB.NET進(jìn)行Word內(nèi)容的排版、頁(yè)眉頁(yè)碼的插入、目錄生成和保存等,實(shí)現(xiàn)報(bào)告文檔的自動(dòng)化輸出,并以某冷卻塔工程配筋內(nèi)容為測(cè)試數(shù)據(jù)為實(shí)例,將主程序的配筋計(jì)算過(guò)程與結(jié)果以計(jì)算書(shū)的形式體現(xiàn)。
1 Office PIA與VB.NET概述
Office PIA(Primary Interop Assembly),PIA的意思可以理解為“官方互操作程序集”,PIA按照Office的各個(gè)組件(Word、Excel、PowerPoint等),分成多個(gè)單獨(dú)的程序集。比如Word對(duì)應(yīng)的PIA程序集是Microsoft.Office.Interop.Word.dll(程序集里面的類(lèi)都放在命名空間Microsoft.Office.Interop.Word中)。
VB.NET是Visual Basic.NET的簡(jiǎn)稱(chēng),是Visual Basic語(yǔ)言演變而來(lái),是基于.NET框架的完全面向?qū)ο蟮木幊陶Z(yǔ)言。Visual Basic允許開(kāi)發(fā)人員開(kāi)發(fā)面向Web、 Windows、和移動(dòng)設(shè)備的程序。使用VB. NET編寫(xiě)的程序都具有安全性和代碼易于維護(hù),可擴(kuò)展性,代碼重用技術(shù)的優(yōu)點(diǎn)。使用VB.NET能夠非常方便的通過(guò)PIA來(lái)訪問(wèn)Office.COM組件。
2 實(shí)現(xiàn)方法[1-3]
本文將從添加程序集引用、添加新文檔、插入文本、圖片和表格、設(shè)置標(biāo)題樣式、插入頁(yè)眉頁(yè)碼、生成目錄、保存文檔等分別進(jìn)行闡述。
1) 添加office組件的引用
在程序的解決方案資源管理器中添加對(duì)添加一個(gè)對(duì)Word COM組件的引用,操作為選擇“引用”中的“添加”,選擇COM組件中Word2010版本的“Microsoft Word 14.0 Object Library”,Word2007版本為“Microsoft Word 12.0 Object Library”。
然后,需要在程序中聲明對(duì)命名空間“Microsoft.Office.Interop.Word”的引用,具體操作為:
Imports Microsoft.Office.Interop.Word
2) 新建Word文檔
首先,使用下面的代碼激活Word COM接口:
myWordApp= New Application
myWordApp.Visible = True
然后使用Document.Add()方法添加新文檔。Office編程接口中添加新文檔的方法中不需要的參數(shù)可以使用.NET中自帶的靜態(tài)對(duì)象Type.Missing,如下面代碼所示:
Dim missing = System.Reflection.Missing.Value
myDoc = myWordApp.Documents.Add(missing,missing,missing,missing)
3) 插入文字
為了便于設(shè)置文本格式,以Paragraph為對(duì)象設(shè)置每個(gè)段落文字的字體、字號(hào)和縮進(jìn)等格式。
Dim mypara(1) As Paragraph
mypara(1) = myDoc.Paragraphs.Add()
mypara(1).Range.Text = ("段落文本")
mypara(1).Range.Font.Size = 12
mypara(1).Range.ParagraphFormat.FirstLineIndent = myWordApp.CentimetersToPoints(0.35)
同樣這里可以設(shè)置行距(LineSpacingRule),大綱級(jí)別(OutlineLevel),對(duì)齊方式(Alignment)等的段落格式。
然而,對(duì)于一篇文檔而言,可能用到的標(biāo)題樣式可能只有幾種,測(cè)試表明,Word文檔自動(dòng)化生成過(guò)程中,使用設(shè)置標(biāo)題樣式要比對(duì)每個(gè)段落分別設(shè)置段落格式的速度要快得多。因此,建議使用標(biāo)題樣式方法來(lái)設(shè)置文本格式,如下述代碼所示:
myDoc.Styles.Add("標(biāo)題1", 1)
With myWordApp.ActiveDocument.Styles("標(biāo)題1")
.ParagraphFormat.OutlineLevel = WdOutlineLeve
l.wdOutlineLevel1
.Font.Size = 20
.Font.Bold = True
……
End With
mypara(1).Range.Style = myDoc.Styles("標(biāo)題1")
4) 插入圖片
Dim Picshaps(1) As InlineShape
Picshaps(1)=myWordApp.Selection.InlineShapes.AddPicture("圖片路徑+圖片名")
Picshaps(1).Height = myWordApp.CentimetersToPoin
ts("圖片高度值")
Picshaps(1).Width = myWordApp.CentimetersToPoin
s("圖片寬度值")
插入表格(指定Rows、Cols行數(shù)列數(shù)):
Dim mytable(1) As Table
Dim NumRows, NumColumns As Integer
NumRows = Rows : NumColumns = Cols
mytable = myDoc.Tables.Add(myWordApp.Selection.
Range(), NumRows, NumColumns)
mytable(1).Cell(r, c).Range.Text = "單元格內(nèi)容"
5) 插入頁(yè)眉
With myWordApp.ActiveWindow
.ActivePane.View.SeekView=Microsoft.Office.Interop.Word.WdSeekView.wdSeekPrimaryHeader
.ActivePane.Selection.TypeText("頁(yè)眉名")
End With
6) 插入頁(yè)碼
myDoc .ActiveWindow.View.SeekView=Microsoft.Office.Interop.Word.WdSeekView.wdSeekPrimaryFooter‘光標(biāo)移到頁(yè)腳處
With MyWordApp.Selection.HeaderFooter.PageNumb
ers
.NumberStyle=WdPageNumberStyle.wdPageNumberStyleArabic
.StartingNumber = 1
End With
myWordApp.ActiveDocument.Sections(1).Footers(WdHeaderFooterIndex.wdHeaderFooterPrimary).PageNumbers.Add(PageNumberAlignment:=WdPageNumberAlignment.wdAlignPageNumberCenter,F(xiàn)irstPage:=True)
7) 在文檔第一頁(yè)生成目錄
With myDoc
Dim myRange = myDoc .Range(Start:=0, End:=0)
.TablesOfContents.Add(Range:=myRange,RightAlignPageNumbers:=True,UseHeadingStyles:=True,
UpperHeadingLevel:=1,LowerHeadingLevel:=3,IncludePageNumbers:=True,AddedStyles:="",UseHyperlinks:=True,HidePageNumbersInWeb:=True,UseOutlineLevels:=True)
.TablesOfContents(1).TabLeader = WdTabLeader.w
dTabLeaderDots
.TablesOfContents.Format =Microsoft.Office.Intero
p.Word.WdIndexType.wdIndexIndent
End With
8) 保存文檔
這里我們只需要使用Document.Save()方法的第一個(gè)參數(shù),即保存路徑)對(duì)于不需要的參數(shù),可以使用.NET中自帶的靜態(tài)對(duì)象:Type.Missing即可。
Dim missing = System.Reflection.Missing.Value
myDoc .SaveAs()第一個(gè)參數(shù)為路徑+文件名,后面的15個(gè)參數(shù)均為missing。
9) 退出Word: myWordApp.Quit()。
3 程序測(cè)試
3.1 文本內(nèi)容
自動(dòng)化輸出文檔的內(nèi)容分為各段落文本內(nèi)容(計(jì)算書(shū)的敘述性文字,公式等)及與其對(duì)應(yīng)的標(biāo)題樣式名稱(chēng)(如表1所示)。
3.2自動(dòng)化過(guò)程
1)新建標(biāo)題樣式
創(chuàng)建表2中的標(biāo)題樣式。下面以“標(biāo)題1”為例展示新建標(biāo)題樣式的方法:
myDoc .Styles.Add(Name:="標(biāo)題1",Type:=WdStyleT
ype.wdStyleTypeParagraph)
With myWordApp.ActiveDocument.Styles(“標(biāo)題1”)
.ParagraphFormat.OutlineLevel =WdOutlineLevel.
wdOutlineLevel1
.Font.Color = WdColor.wdColorBlack
.Font.Size = 14
.Font.Name ="宋體"
.Font.Bold = True
.ParagraphFormat.Alignment =WdParagraphAlign
Ment.wdAlignParagraphRight
……
End With
3.3調(diào)用測(cè)試數(shù)據(jù)出報(bào)告[4]
各段落序號(hào)用 i 表示,其內(nèi)容保存在Data1(i, 1)中,純文本段落代碼如下:
myDoc .ActiveWindow.View.SeekView = Microsoft.Office.Interop.Word.WdSeekView.wdSeekMainDocument‘確保光標(biāo)處于主文檔
mypara(i) = myDoc .Content.Paragraphs.Add()
mypara(i).Range.Text = Trim(Data1(i, 1))
mypara(i).Range.InsertParagraphAfter()
如果某些段落文字中包含有公式圖片,處理方法如下:
用空格替換 “{/圖片名/}”中的特殊字符“{/”和“/}”,使用Split函數(shù)將一個(gè)段落內(nèi)容分為幾段得到一維數(shù)組NewData1(),按順序輸出到Word中。實(shí)現(xiàn)一個(gè)包含公式符號(hào)圖片的段落內(nèi)容插入的代碼如下:
Dim Index as Integer
For i = 0 To UBound(NewData1)
If NewData1(i).Contains(".wmf") Then
Index= Index+1
Picshaps (Index) = oWordApplic.Selection.InlineS
hapes.AddPicture("路徑+圖片名名")
Else oWordApplic.Selection.TypeText(NewData1(i))
End If
Next
為保證一個(gè)段落里的文字和公式圖片在同一行保持整齊,使用“居中”的文本對(duì)其方式:
mypara(i).Range.ParagraphFormat.BaseLineAlignment = WdBaselineAlignment.wdBaselineAlignCenter
然后使用Select語(yǔ)句將各段對(duì)應(yīng)標(biāo)題(保存在Data1(i, 0)中)賦給相應(yīng)段落:
Select Case Data1(i, 0)
Case "標(biāo)題1"
mypara(i).Range.Style =myDoc .Style("標(biāo)題1")
Case "正文文本"
mypara(i).Range.Style =myDoc .Style("正文")
……
End Select
然后按照2 實(shí)現(xiàn)方法中的方法進(jìn)行插入頁(yè)眉頁(yè)碼、插入目錄和保存文檔等工作。
3.4圖片與表格的處理方法
段落內(nèi)容中可能包含表示公式的圖片,使用Mathtype把需要的公式保存為wmf矢量格式圖片,來(lái)代替在Word中使用Mathtype輸入公式的步驟,在測(cè)試數(shù)據(jù)文本中,段落內(nèi)容中相應(yīng)位置的圖片使用特殊符號(hào){/圖片名/}代表該處的公式。這樣,讀取的內(nèi)容均為字符串。
如果文檔中有表格,增加一個(gè)表格內(nèi)容的文本文件,同時(shí)在表 1的段落內(nèi)容位置備注表格內(nèi)容的文本文件地址和文件名,設(shè)計(jì)出表格的布局,讀取包含該表格內(nèi)容的文本文件來(lái)填充表格。
3.5 注意事項(xiàng)
1)對(duì)于多段落的文檔,mypara(i) = myDoc .Content.Paragraphs.Add()應(yīng)與mypara(i).Range.InsertParagraphAfter()搭配使用,實(shí)現(xiàn)段落的連續(xù)插入,使用oWordApplic.Selection.
EndKey(Word.WdUnits.wdStory, missing)實(shí)現(xiàn)光標(biāo)進(jìn)入下一個(gè)段落,然后進(jìn)行該段落的文本插入工作。
2)這種操作Word生成文本的方法,關(guān)鍵是對(duì)Word界面光標(biāo)位置和范圍的定位,例如Selection,Range,.ActivePane.View.SeekView等,控制在不同位置插入內(nèi)容以及不同范圍對(duì)象的格式設(shè)置等。
3.6 程序運(yùn)行結(jié)果
程序自動(dòng)化生成Word文檔的正文、目錄和表格分別如圖1至圖3所示。
4 結(jié)束語(yǔ)
本文對(duì)Word自動(dòng)化生成文檔進(jìn)行論述,針對(duì)工程中鋼筋配筋計(jì)算書(shū)的特點(diǎn),基于Office PIA技術(shù)使用VB.NET自動(dòng)生成了冷卻塔配筋計(jì)算書(shū)報(bào)告,根據(jù)本文研究思路和方法,得到如下結(jié)論:
1)本文以VB.NET為平臺(tái),通過(guò)PIA操作Word自動(dòng)生成文檔,便于作為輔助程序與VB.NET程序中工程計(jì)算的主程序整合,為計(jì)算過(guò)程提供一個(gè)正式、美觀的展示方式。
2)這種操作Word生成文本的方法,關(guān)鍵是對(duì)Word界面光標(biāo)位置和范圍的控制,例如Range,Selection,.ActivePane.View.SeekView等。
3)該方法對(duì)批量處理的文檔具有較好的適用性。
參考文獻(xiàn):
[1] 何振林,胡綠慧.MS Office與VBA高級(jí)應(yīng)用案例教程[M].北京:中國(guó)水利出版社,2010:146-264.
[2] 李政,王月,鄭月鋒.VBA應(yīng)用基礎(chǔ)與實(shí)例教程[M].北京:國(guó)防工業(yè)出版社,2009.
[3] 王鳴.用VBA實(shí)現(xiàn)數(shù)據(jù)庫(kù)中數(shù)據(jù)在Word中置放[J].希望月報(bào),2007(3).
[4] 邵小兵,廖慧芬.利用VBA實(shí)現(xiàn)Word自動(dòng)排版[J].中國(guó)教育技術(shù)裝備,2005(10):45-46.