基于Office PIA自动生成Word文档

2013-12-29 00:00:00崔建功
电脑知识与技术 2013年12期

摘要:随着办公量的日益增大,对办公软件的二次开发以适应需求的趋势变得必要。该文介绍了VB.NET环境下通过Office PIA对Word工程配筋计算报告书进行编程设计的方法,包括文档文字、图片和表格等的自动生成与排版设计。采用该方法可大幅度提高办公效率。

关键词:Office PIA;VB.NET;Word;自动化

中图分类号:TP311 文献标识码:A 文章编号:1009-3044(2013)12-2899-05

计算机的程序开发应用广泛,对Office软件的二次开发实现办公的自动化大幅提高办公的效率和准确性。Office的编程接口都是通过COM组件公开的,任何访问Office编程接口的程序,实际上都必须要最终调用Office COM组件。基于Office PIA,.Net能够让开发人员非常方便的访问COM组件。该文使用VB.NET进行Word内容的排版、页眉页码的插入、目录生成和保存等,实现报告文档的自动化输出,并以某冷却塔工程配筋内容为测试数据为实例,将主程序的配筋计算过程与结果以计算书的形式体现。

1 Office PIA与VB.NET概述

Office PIA(Primary Interop Assembly),PIA的意思可以理解为“官方互操作程序集”,PIA按照Office的各个组件(Word、Excel、PowerPoint等),分成多个单独的程序集。比如Word对应的PIA程序集是Microsoft.Office.Interop.Word.dll(程序集里面的类都放在命名空间Microsoft.Office.Interop.Word中)。

VB.NET是Visual Basic.NET的简称,是Visual Basic语言演变而来,是基于.NET框架的完全面向对象的编程语言。Visual Basic允许开发人员开发面向Web、 Windows、和移动设备的程序。使用VB. NET编写的程序都具有安全性和代码易于维护,可扩展性,代码重用技术的优点。使用VB.NET能够非常方便的通过PIA来访问Office.COM组件。

2 实现方法[1-3]

本文将从添加程序集引用、添加新文档、插入文本、图片和表格、设置标题样式、插入页眉页码、生成目录、保存文档等分别进行阐述。

1) 添加office组件的引用

在程序的解决方案资源管理器中添加对添加一个对Word COM组件的引用,操作为选择“引用”中的“添加”,选择COM组件中Word2010版本的“Microsoft Word 14.0 Object Library”,Word2007版本为“Microsoft Word 12.0 Object Library”。

然后,需要在程序中声明对命名空间“Microsoft.Office.Interop.Word”的引用,具体操作为:

Imports Microsoft.Office.Interop.Word

2) 新建Word文档

首先,使用下面的代码激活Word COM接口:

myWordApp= New Application

myWordApp.Visible = True

然后使用Document.Add()方法添加新文档。Office编程接口中添加新文档的方法中不需要的参数可以使用.NET中自带的静态对象Type.Missing,如下面代码所示:

Dim missing = System.Reflection.Missing.Value

myDoc = myWordApp.Documents.Add(missing,missing,missing,missing)

3) 插入文字

为了便于设置文本格式,以Paragraph为对象设置每个段落文字的字体、字号和缩进等格式。

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)

同样这里可以设置行距(LineSpacingRule),大纲级别(OutlineLevel),对齐方式(Alignment)等的段落格式。

然而,对于一篇文档而言,可能用到的标题样式可能只有几种,测试表明,Word文档自动化生成过程中,使用设置标题样式要比对每个段落分别设置段落格式的速度要快得多。因此,建议使用标题样式方法来设置文本格式,如下述代码所示:

myDoc.Styles.Add("标题1", 1)

With myWordApp.ActiveDocument.Styles("标题1")

.ParagraphFormat.OutlineLevel = WdOutlineLeve

l.wdOutlineLevel1

.Font.Size = 20

.Font.Bold = True

……

End With

mypara(1).Range.Style = myDoc.Styles("标题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行数列数):

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 = "单元格内容"

5) 插入页眉

With myWordApp.ActiveWindow

.ActivePane.View.SeekView=Microsoft.Office.Interop.Word.WdSeekView.wdSeekPrimaryHeader

.ActivePane.Selection.TypeText("页眉名")

End With

6) 插入页码

myDoc .ActiveWindow.View.SeekView=Microsoft.Office.Interop.Word.WdSeekView.wdSeekPrimaryFooter‘光标移到页脚处

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,FirstPage:=True)

7) 在文档第一页生成目录

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()方法的第一个参数,即保存路径)对于不需要的参数,可以使用.NET中自带的静态对象:Type.Missing即可。

Dim missing = System.Reflection.Missing.Value

myDoc .SaveAs()第一个参数为路径+文件名,后面的15个参数均为missing。

9) 退出Word: myWordApp.Quit()。

3 程序测试

3.1 文本内容

自动化输出文档的内容分为各段落文本内容(计算书的叙述性文字,公式等)及与其对应的标题样式名称(如表1所示)。

3.2自动化过程

1)新建标题样式

创建表2中的标题样式。下面以“标题1”为例展示新建标题样式的方法:

myDoc .Styles.Add(Name:="标题1",Type:=WdStyleT

ype.wdStyleTypeParagraph)

With myWordApp.ActiveDocument.Styles(“标题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调用测试数据出报告[4]

各段落序号用 i 表示,其内容保存在Data1(i, 1)中,纯文本段落代码如下:

myDoc .ActiveWindow.View.SeekView = Microsoft.Office.Interop.Word.WdSeekView.wdSeekMainDocument‘确保光标处于主文档

mypara(i) = myDoc .Content.Paragraphs.Add()

mypara(i).Range.Text = Trim(Data1(i, 1))

mypara(i).Range.InsertParagraphAfter()

如果某些段落文字中包含有公式图片,处理方法如下:

用空格替换 “{/图片名/}”中的特殊字符“{/”和“/}”,使用Split函数将一个段落内容分为几段得到一维数组NewData1(),按顺序输出到Word中。实现一个包含公式符号图片的段落内容插入的代码如下:

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

为保证一个段落里的文字和公式图片在同一行保持整齐,使用“居中”的文本对其方式:

mypara(i).Range.ParagraphFormat.BaseLineAlignment = WdBaselineAlignment.wdBaselineAlignCenter

然后使用Select语句将各段对应标题(保存在Data1(i, 0)中)赋给相应段落:

Select Case Data1(i, 0)

Case "标题1"

mypara(i).Range.Style =myDoc .Style("标题1")

Case "正文文本"

mypara(i).Range.Style =myDoc .Style("正文")

……

End Select

然后按照2 实现方法中的方法进行插入页眉页码、插入目录和保存文档等工作。

3.4图片与表格的处理方法

段落内容中可能包含表示公式的图片,使用Mathtype把需要的公式保存为wmf矢量格式图片,来代替在Word中使用Mathtype输入公式的步骤,在测试数据文本中,段落内容中相应位置的图片使用特殊符号{/图片名/}代表该处的公式。这样,读取的内容均为字符串。

如果文档中有表格,增加一个表格内容的文本文件,同时在表 1的段落内容位置备注表格内容的文本文件地址和文件名,设计出表格的布局,读取包含该表格内容的文本文件来填充表格。

3.5 注意事项

1)对于多段落的文档,mypara(i) = myDoc .Content.Paragraphs.Add()应与mypara(i).Range.InsertParagraphAfter()搭配使用,实现段落的连续插入,使用oWordApplic.Selection.

EndKey(Word.WdUnits.wdStory, missing)实现光标进入下一个段落,然后进行该段落的文本插入工作。

2)这种操作Word生成文本的方法,关键是对Word界面光标位置和范围的定位,例如Selection,Range,.ActivePane.View.SeekView等,控制在不同位置插入内容以及不同范围对象的格式设置等。

3.6 程序运行结果

程序自动化生成Word文档的正文、目录和表格分别如图1至图3所示。

4 结束语

本文对Word自动化生成文档进行论述,针对工程中钢筋配筋计算书的特点,基于Office PIA技术使用VB.NET自动生成了冷却塔配筋计算书报告,根据本文研究思路和方法,得到如下结论:

1)本文以VB.NET为平台,通过PIA操作Word自动生成文档,便于作为辅助程序与VB.NET程序中工程计算的主程序整合,为计算过程提供一个正式、美观的展示方式。

2)这种操作Word生成文本的方法,关键是对Word界面光标位置和范围的控制,例如Range,Selection,.ActivePane.View.SeekView等。

3)该方法对批量处理的文档具有较好的适用性。

参考文献:

[1] 何振林,胡绿慧.MS Office与VBA高级应用案例教程[M].北京:中国水利出版社,2010:146-264.

[2] 李政,王月,郑月锋.VBA应用基础与实例教程[M].北京:国防工业出版社,2009.

[3] 王鸣.用VBA实现数据库中数据在Word中置放[J].希望月报,2007(3).

[4] 邵小兵,廖慧芬.利用VBA实现Word自动排版[J].中国教育技术装备,2005(10):45-46.