做了一个多月的C#生成Word文档的工作,我从一开始的对这个一窍不通,到现在的顺利完成了这个功能模块,其中还是有点心得的。想想自己说不定以后还会用到,于是想吧这些心得写下来,以供自己以后的学习。同时也希望对那些正在或正要编程实现自动生成Word的朋友有些小小的帮助。
对于用C#来自动生成Word文档来说,最大的问题是微软提供的所有文档的源代码一般都是VBA编程的,没有C#的现成文档,最多也只是一些How To文档。显然,VBA编程和C#是有一定区别的,VBA编程的风格和C#是完全不同的,它有着VB编程快捷的特性,可以省略参数,可以对Style对象赋值等的功能是C#所没有的。其次,在这个任务通过Word录制宏查看到的宏代码也是由VB代码显示的,我们必须要把这些宏代码转换到C#代码。所以,做这个任务的人必须先有一点VB的经验(最起码知道那些代码是在干什么)。
下面是我自学C#生成Word文档的过程(首先必须安装好Word2003和.NET2003
):
一、下载Word的VBA编程参考手册和网上的在线资料
二、编程实现:通过查看Word宏代码完善自定义类库
有了这样一个大致的框架以后,我们就可以开始用C#开始实现各种Word操作的功能。总的来说,这项工作不难,但很繁琐(要看你对Word操作的熟悉程度
)。
了解这些后,我们就需要学会从VBA编程到C#实现之间的转变(这是我碰到的最大难题)。总结下来,两者间的函数名一般是相同的,但由于VB可以缺省参数而C#不行,所以我们必须同时了解那些缺省参数,并进行合理的填充。那些在VB代码中出现的参数也要进行适当的改变才能应用于C#中。比如打开一个Word文档的操作吧,Word的宏代码如下:
Sub Macro9()
Sub Macro9()
' Macro9 Macro
' by 林辉(sharemeteor)
' 宏在 2005-8-19 由 MC SYSTEM 录制
'
Documents.Open FileName:="test.doc", ConfirmConversions:=False, ReadOnly:= _
False, AddToRecentFiles:=False, PasswordDocument:="", PasswordTemplate:= _
"", Revert:=False, WritePasswordDocument:="", WritePasswordTemplate:="", _
Format:=wdOpenFormatAuto, XMLTransform:=""
End Sub
它只有11个参数,但在C#里需要16个参数值(Word2003中是16个参数,WordXP为15个)。在C#中,Word.ApplicationClass下的Documents属性和VB宏代码中的Documents对等,不过你需要获得Word.ApplicationClass的实例后才能用。
//
Open a file (the file must exists) and activate it
public
void
Open(
string
strFileName)
{
object fileName = strFileName;
object readOnly = false;
object isVisible = true;
object missing = System.Reflection.Missing.Value;
oDoc = oWordApplic.Documents.Open(ref fileName, ref missing,ref readOnly,
ref missing, ref missing, ref missing, ref missing, ref missing, ref missing,
ref missing, ref missing, ref isVisible,ref missing,ref missing,ref missing,ref missing);
oDoc.Activate();
}
但有些地方的Sytle就替换不了了,有一种方法可以间接实现对Style等不能在C#中赋值对象的赋值,那就是通过
调用VB.NET的dll。不得不佩服微软的.NET框架,各个语言间可以随意的调用,用起来相当之方便。
我们可以在VB.NET下面建个函数来调用那个语句,然后生成dll,C#项目只要引用这个dll,然后调用这个dll中的函数就可以了。下面是VB.NET下对Style赋值的函数(简单吧!C#里就是死活也不行
)
Public
Sub SetStyle()
Sub SetStyle(ByVal header As String, ByVal oWordApplic As Word.ApplicationClass)
oWordApplic.Selection.Style = oWordApplic.ActiveDocument.Styles(header)
End Sub