做了一个多月的C#生成Word文档的工作,我从一开始的对这个一窍不通,到现在的顺利完成了这个功能模块,其中还是有点心得的。想想自己说不定以后还会用到,于是想吧这些心得写下来,以供自己以后的学习。同时也希望对那些正在或正要编程实现自动生成Word的朋友有些小小的帮助。
下面是我自学C#生成Word文档的过程(首先必须安装好Word2003和.NET2003
![](https://i-blog.csdnimg.cn/blog_migrate/ef76661dfbdf045b675cd0e7e572623f.gif)
一、下载Word的VBA编程参考手册和网上的在线资料
微软大概觉得VB用的人太少了,想大力发展之,搞得Office编程的参考手册都是VBA编程,害的我不懂VB的人也不得不学。不过没办法,要做这个工作,微软的参考手册是不能少的,可以从
http://msdn.microsoft.com/office/downloads/vba/default.aspx这个页面中下到相应的的Office(本人使用的是Word2003,但好像只用WordXP的参考手册)的VBA Language References(当然这个文档是全英文的,看她简直是我的噩梦)。没有必要看完这个参考手册,只要搜索需要的函数,然后看看就可以了。
有了这个参考手册是远远不够的,我们需要去网上搜集大量的现成代码来看看才能快速的上手。下面是一个微软老大提供的关于C#生成Word的中文How To文档,感觉很好,分享一下
![](http://spaces.msn.com/rte/emoticons/smile_regular.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/3d89a4a665ce0666ebc00639a10293e2.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/956c95b5cdfbf5639f79e8bbdfd048c4.gif)
二、编程实现:通过查看Word宏代码完善自定义类库
有了这样一个大致的框架以后,我们就可以开始用C#开始实现各种Word操作的功能。总的来说,这项工作不难,但很繁琐(要看你对Word操作的熟悉程度
)。
![](https://i-blog.csdnimg.cn/blog_migrate/3f4c216fbad4ad78a152536c02058d9e.gif)
一般情况下,自动生成的Word文档会有一个模板Word文件(以.dot结尾,当然模板本身也可以是.doc的Word文档)。在这个模板中,我们先设计好要导出文档的总体框架,在那些需要插入文字的地方先做好书签。在这个工作中,我们最常用到的就是书签,使用书签的好处是方便快捷,Word文档中的差不多所有的定位都是通过书签来完成的。为了了解一个Word操作的具体编程实现,我们可以通过Word自带的宏编程:在进行想要了解的操作之前,先录制宏,操作完后再查看刚才录制的宏代码,这样我们就得到了进行这个操作的VB编码。如:我们需要查看Word生成一个Table表的动作是怎样的,我们可以先在进行插入Table前录制宏,然后在Word中进行一个插入Table的操作,再停止宏,这样我们就可以看到一个插入Table的宏代码了。下面就是一个插入最简单的Table的宏代码:
Sub Macro8()
Sub Macro8()
'
' Macro8 Macro
' by 林辉(sharemeteor)
' 宏在 2005-8-19 由 MC SYSTEM 录制
'
ActiveDocument.Tables.Add Range:=Selection.Range, NumRows:=2, NumColumns:= _
4, DefaultTableBehavior:=wdWord9TableBehavior, AutoFitBehavior:= _
wdAutoFitFixed
With Selection.Tables(1)
If .Style <> "网格型" Then
.Style = "网格型"
End If
.ApplyStyleHeadingRows = True
.ApplyStyleLastRow = True
.ApplyStyleFirstColumn = True
.ApplyStyleLastColumn = True
End With
End Sub
![](https://i-blog.csdnimg.cn/blog_migrate/34031c708bfe702fe82d01ff5c6593aa.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/0be121fa5b8988fbabbbc526af3b0fc0.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/587e34b10dcf5efbc0859b53470a2db3.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/587e34b10dcf5efbc0859b53470a2db3.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/587e34b10dcf5efbc0859b53470a2db3.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/587e34b10dcf5efbc0859b53470a2db3.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/587e34b10dcf5efbc0859b53470a2db3.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/587e34b10dcf5efbc0859b53470a2db3.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/587e34b10dcf5efbc0859b53470a2db3.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/587e34b10dcf5efbc0859b53470a2db3.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/587e34b10dcf5efbc0859b53470a2db3.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/587e34b10dcf5efbc0859b53470a2db3.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/587e34b10dcf5efbc0859b53470a2db3.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/587e34b10dcf5efbc0859b53470a2db3.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/587e34b10dcf5efbc0859b53470a2db3.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/587e34b10dcf5efbc0859b53470a2db3.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/587e34b10dcf5efbc0859b53470a2db3.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/587e34b10dcf5efbc0859b53470a2db3.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/587e34b10dcf5efbc0859b53470a2db3.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/4fd96b3cf02f4c7b5c8964ac8167f7af.gif)
了解这些后,我们就需要学会从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)
![](https://i-blog.csdnimg.cn/blog_migrate/34031c708bfe702fe82d01ff5c6593aa.gif)
{
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();
}
![](https://i-blog.csdnimg.cn/blog_migrate/34031c708bfe702fe82d01ff5c6593aa.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/0be121fa5b8988fbabbbc526af3b0fc0.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/587e34b10dcf5efbc0859b53470a2db3.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/587e34b10dcf5efbc0859b53470a2db3.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/587e34b10dcf5efbc0859b53470a2db3.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/587e34b10dcf5efbc0859b53470a2db3.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/587e34b10dcf5efbc0859b53470a2db3.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/587e34b10dcf5efbc0859b53470a2db3.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/587e34b10dcf5efbc0859b53470a2db3.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/587e34b10dcf5efbc0859b53470a2db3.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/4fd96b3cf02f4c7b5c8964ac8167f7af.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/f0cd6c7f9e7ae96feae062cb48f670f0.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/f0cd6c7f9e7ae96feae062cb48f670f0.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/34031c708bfe702fe82d01ff5c6593aa.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/0be121fa5b8988fbabbbc526af3b0fc0.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/b854634c0904529d4018c4c3336be836.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/587e34b10dcf5efbc0859b53470a2db3.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/587e34b10dcf5efbc0859b53470a2db3.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/587e34b10dcf5efbc0859b53470a2db3.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/587e34b10dcf5efbc0859b53470a2db3.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/587e34b10dcf5efbc0859b53470a2db3.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/587e34b10dcf5efbc0859b53470a2db3.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/587e34b10dcf5efbc0859b53470a2db3.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/587e34b10dcf5efbc0859b53470a2db3.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/587e34b10dcf5efbc0859b53470a2db3.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/587e34b10dcf5efbc0859b53470a2db3.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/4fd96b3cf02f4c7b5c8964ac8167f7af.gif)
缺省参数一般可以通过赋System.Reflection.Missing.Value值就可以了。而那些VB代码中出现了的参数,我们必须先通过查找VBA Language References参考手册了解其具体的值(实际上这些参数都是枚举变量,其值大多数都是Object型的整数),然后再在C#中赋予相同的Object型的整数值。需要注意的是,C#中的参数一般都是引用型的,要加ref。
这里有些方便的小技巧,在参考手册的Reference/Enumerations下可以找到那些参数的名称和其值,我们可以通过直接赋整数值实现,但在C#的Word类库中,Word.Wd***这个枚举量下都会有一个值和VB中的这个参数对应,所以建议用这些枚举值进行赋值。如VB有个参数叫wdAlignParagraphCenter,我们通过查参考手册知道它是WdParagraphAlignment下的枚举值,那么它在C#中的值为Word.WdParagraphAlignment.wdAlignParagraphCenter。
三、编程中遇到的问题及解决
在这个工作中,碰到点问题是难免的,只要你用心,相信只是
的问题,肯定可以解决的。下面是我碰到的一些问题和我的解决办法,希望对大家有用
。
1. Style等对象不能赋值的问题
感觉微软对Office的类库的设计可能存在问题,很多在VB中可以赋值的对象如Style,但在C#就是不能赋值。这引来了很多问题,如前面的产生Table的宏中就有“.Style = " 网格型"”的语句,这在C#中是不可能用一条等价的语句来实现的。
这里有两种解决办法,一种是干脆不用Style,另一种是间接实现Style的赋值。
有些地方的Style是可以被替换的,如产生table的宏中的Style,它的Style只不过是是定义边框的样式,我们可以手工定义样式来替代Style,用下列函数实现产生一个Table:
public
void
RunMacroForTable(
int
rows,
int
columns)
![](https://i-blog.csdnimg.cn/blog_migrate/34031c708bfe702fe82d01ff5c6593aa.gif)
{
object _DefaultTableBehavior = Word.WdDefaultTableBehavior.wdWord9TableBehavior;
object _AutoFitBehavior = Word.WdAutoFitBehavior.wdAutoFitFixed;
oWordApplic.ActiveDocument.Tables.Add(oWordApplic.Selection.Range,rows,columns,
ref _DefaultTableBehavior,ref _AutoFitBehavior);
Word.Table table = oWordApplic.Selection.Tables[1];
// oWordApplic.Selection.Rows.HeightRule = Word.WdRowHeightRule.wdRowHeightAtLeast;
oWordApplic.Selection.Rows.Height = oWordApplic.CentimetersToPoints((float)0.75);
// if(table.Style != "网格型")
// table.Style = "网格型";
![](https://i-blog.csdnimg.cn/blog_migrate/3112b7b6526db5bc83e275260ae60525.gif)
对边框进行定义#region 对边框进行定义
table.ApplyStyleHeadingRows = true;
table.ApplyStyleLastRow = true;
table.ApplyStyleFirstColumn = true;
table.ApplyStyleLastColumn = true;
Word.Border border = table.Borders[Word.WdBorderType.wdBorderLeft];
border.LineStyle = Word.WdLineStyle.wdLineStyleSingle;
border.LineWidth = Word.WdLineWidth.wdLineWidth150pt;
border.Color = Word.WdColor.wdColorAutomatic;
border = table.Borders[Word.WdBorderType.wdBorderRight];
border.LineStyle = Word.WdLineStyle.wdLineStyleSingle;
border.LineWidth = Word.WdLineWidth.wdLineWidth150pt;
border.Color = Word.WdColor.wdColorAutomatic;
border = table.Borders[Word.WdBorderType.wdBorderTop];
border.LineStyle = Word.WdLineStyle.wdLineStyleSingle;
border.LineWidth = Word.WdLineWidth.wdLineWidth150pt;
border.Color = Word.WdColor.wdColorAutomatic;
border = table.Borders[Word.WdBorderType.wdBorderBottom];
border.LineStyle = Word.WdLineStyle.wdLineStyleSingle;
border.LineWidth = Word.WdLineWidth.wdLineWidth150pt;
border.Color = Word.WdColor.wdColorAutomatic;
border = table.Borders[Word.WdBorderType.wdBorderHorizontal];
border.LineStyle = Word.WdLineStyle.wdLineStyleSingle;
border.LineWidth = Word.WdLineWidth.wdLineWidth075pt;
border.Color = Word.WdColor.wdColorAutomatic;
border = table.Borders[Word.WdBorderType.wdBorderVertical];
border.LineStyle = Word.WdLineStyle.wdLineStyleSingle;
border.LineWidth = Word.WdLineWidth.wdLineWidth075pt;
border.Color = Word.WdColor.wdColorAutomatic;
border = table.Borders[Word.WdBorderType.wdBorderDiagonalDown];
border.LineStyle = Word.WdLineStyle.wdLineStyleNone;
border = table.Borders[Word.WdBorderType.wdBorderDiagonalUp];
border.LineStyle = Word.WdLineStyle.wdLineStyleNone;
table.Borders.Shadow = false;
#endregion
oWordApplic.Options.DefaultBorderLineStyle = Word.WdLineStyle.wdLineStyleSingle;
oWordApplic.Options.DefaultBorderLineWidth = Word.WdLineWidth.wdLineWidth150pt;
oWordApplic.Options.DefaultBorderColor = Word.WdColor.wdColorAutomatic;
oWordApplic.Selection.Rows.HeadingFormat = (int)Word.WdConstants.wdToggle;
table.Rows.Alignment = Word.WdRowAlignment.wdAlignRowCenter;
}
这里有些方便的小技巧,在参考手册的Reference/Enumerations下可以找到那些参数的名称和其值,我们可以通过直接赋整数值实现,但在C#的Word类库中,Word.Wd***这个枚举量下都会有一个值和VB中的这个参数对应,所以建议用这些枚举值进行赋值。如VB有个参数叫wdAlignParagraphCenter,我们通过查参考手册知道它是WdParagraphAlignment下的枚举值,那么它在C#中的值为Word.WdParagraphAlignment.wdAlignParagraphCenter。
三、编程中遇到的问题及解决
在这个工作中,碰到点问题是难免的,只要你用心,相信只是
![](https://i-blog.csdnimg.cn/blog_migrate/fa098558696a0f9ea60dec74f05b0f8a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/3d89a4a665ce0666ebc00639a10293e2.gif)
1. Style等对象不能赋值的问题
感觉微软对Office的类库的设计可能存在问题,很多在VB中可以赋值的对象如Style,但在C#就是不能赋值。这引来了很多问题,如前面的产生Table的宏中就有“.Style = " 网格型"”的语句,这在C#中是不可能用一条等价的语句来实现的。
这里有两种解决办法,一种是干脆不用Style,另一种是间接实现Style的赋值。
有些地方的Style是可以被替换的,如产生table的宏中的Style,它的Style只不过是是定义边框的样式,我们可以手工定义样式来替代Style,用下列函数实现产生一个Table:
![](https://i-blog.csdnimg.cn/blog_migrate/f0cd6c7f9e7ae96feae062cb48f670f0.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/34031c708bfe702fe82d01ff5c6593aa.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/0be121fa5b8988fbabbbc526af3b0fc0.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/b854634c0904529d4018c4c3336be836.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/587e34b10dcf5efbc0859b53470a2db3.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/587e34b10dcf5efbc0859b53470a2db3.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/587e34b10dcf5efbc0859b53470a2db3.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/587e34b10dcf5efbc0859b53470a2db3.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/587e34b10dcf5efbc0859b53470a2db3.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/587e34b10dcf5efbc0859b53470a2db3.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/587e34b10dcf5efbc0859b53470a2db3.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/587e34b10dcf5efbc0859b53470a2db3.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/587e34b10dcf5efbc0859b53470a2db3.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/587e34b10dcf5efbc0859b53470a2db3.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/3112b7b6526db5bc83e275260ae60525.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/f2671b7f42ce505d9bf55a7a0ca257fb.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/587e34b10dcf5efbc0859b53470a2db3.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/587e34b10dcf5efbc0859b53470a2db3.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/587e34b10dcf5efbc0859b53470a2db3.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/587e34b10dcf5efbc0859b53470a2db3.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/587e34b10dcf5efbc0859b53470a2db3.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/587e34b10dcf5efbc0859b53470a2db3.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/587e34b10dcf5efbc0859b53470a2db3.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/587e34b10dcf5efbc0859b53470a2db3.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/587e34b10dcf5efbc0859b53470a2db3.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/587e34b10dcf5efbc0859b53470a2db3.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/587e34b10dcf5efbc0859b53470a2db3.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/587e34b10dcf5efbc0859b53470a2db3.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/587e34b10dcf5efbc0859b53470a2db3.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/587e34b10dcf5efbc0859b53470a2db3.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/587e34b10dcf5efbc0859b53470a2db3.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/587e34b10dcf5efbc0859b53470a2db3.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/587e34b10dcf5efbc0859b53470a2db3.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/587e34b10dcf5efbc0859b53470a2db3.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/587e34b10dcf5efbc0859b53470a2db3.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/587e34b10dcf5efbc0859b53470a2db3.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/587e34b10dcf5efbc0859b53470a2db3.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/587e34b10dcf5efbc0859b53470a2db3.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/587e34b10dcf5efbc0859b53470a2db3.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/587e34b10dcf5efbc0859b53470a2db3.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/587e34b10dcf5efbc0859b53470a2db3.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/587e34b10dcf5efbc0859b53470a2db3.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/587e34b10dcf5efbc0859b53470a2db3.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/587e34b10dcf5efbc0859b53470a2db3.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/587e34b10dcf5efbc0859b53470a2db3.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/587e34b10dcf5efbc0859b53470a2db3.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/587e34b10dcf5efbc0859b53470a2db3.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/587e34b10dcf5efbc0859b53470a2db3.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/587e34b10dcf5efbc0859b53470a2db3.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/587e34b10dcf5efbc0859b53470a2db3.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/587e34b10dcf5efbc0859b53470a2db3.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/587e34b10dcf5efbc0859b53470a2db3.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/587e34b10dcf5efbc0859b53470a2db3.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/587e34b10dcf5efbc0859b53470a2db3.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/587e34b10dcf5efbc0859b53470a2db3.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/587e34b10dcf5efbc0859b53470a2db3.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/eec4c0236afc26744c9c4e910bc34958.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/587e34b10dcf5efbc0859b53470a2db3.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/587e34b10dcf5efbc0859b53470a2db3.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/587e34b10dcf5efbc0859b53470a2db3.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/587e34b10dcf5efbc0859b53470a2db3.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/587e34b10dcf5efbc0859b53470a2db3.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/587e34b10dcf5efbc0859b53470a2db3.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/587e34b10dcf5efbc0859b53470a2db3.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/587e34b10dcf5efbc0859b53470a2db3.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/4fd96b3cf02f4c7b5c8964ac8167f7af.gif)
但有些地方的Sytle就替换不了了,有一种方法可以间接实现对Style等不能在C#中赋值对象的赋值,那就是通过
调用VB.NET的dll。不得不佩服微软的.NET框架,各个语言间可以随意的调用,用起来相当之方便。
我们可以在VB.NET下面建个函数来调用那个语句,然后生成dll,C#项目只要引用这个dll,然后调用这个dll中的函数就可以了。下面是VB.NET下对Style赋值的函数(简单吧!C#里就是死活也不行
)
我们可以在VB.NET下面建个函数来调用那个语句,然后生成dll,C#项目只要引用这个dll,然后调用这个dll中的函数就可以了。下面是VB.NET下对Style赋值的函数(简单吧!C#里就是死活也不行
![](https://i-blog.csdnimg.cn/blog_migrate/77e8663b79e5384d2fd4caee737df508.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/34031c708bfe702fe82d01ff5c6593aa.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/0be121fa5b8988fbabbbc526af3b0fc0.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/587e34b10dcf5efbc0859b53470a2db3.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/4fd96b3cf02f4c7b5c8964ac8167f7af.gif)
其他那些不能在C#里赋值的对象都可以通过这种方法实现赋值。
2.书签过多,一个一个定位麻烦的问题
如果你的Word模板够庞大,可能会出现有50多个书签,而这些书签的位置只是填充一些简单数据的情况。如果我们编程时一个个的定位,然后一个个的填充数据肯定时非常麻烦的。这种情况下,我的解决办法是设置XML配置文档。
我们可以设置一个XML文件,其中存放需要填充数据的书签(这些书签处只是做简单的插入文本)的名称。如下面是我的XML文件的详细内容:
<?
xml version="1.0" encoding="utf-8"
?>
<
Forms
>
<
Form
>
<
Name
>
data
</
Name
>
<
Bookmarks
>
<
Bookmark
>
date1
</
Bookmark
>
<
Bookmark
>
date2
</
Bookmark
>
<
Bookmark
>
project
</
Bookmark
>
<
Bookmark
>
company
</
Bookmark
>
</
Bookmarks
>
</
Form
>
<
Form
>
<
Name
>
company
</
Name
>
<
Bookmarks
>
<
Bookmark
>
recordnumber
</
Bookmark
>
<
Bookmark
>
customer
</
Bookmark
>
<
Bookmark
>
address
</
Bookmark
>
<
Bookmark
>
postcode
</
Bookmark
>
<
Bookmark
>
linkman
</
Bookmark
>
<
Bookmark
>
telephone
</
Bookmark
>
<
Bookmark
>
email
</
Bookmark
>
<
Bookmark
>
faxnumber
</
Bookmark
>
</
Bookmarks
>
</
Form
>
</
Forms
>
我们可以把需要填充的数据都存放到一个Hashtable中,key为它们所对应的书签名,这样在C#中读取这个XML文件后,把同一Name下的所有Bookmark存放在一个ArrayList中,我们就可以统一地进行填充了,使用的函数的形式如:
foreach
(
string
bookmark
in
bookmarks)
![](https://i-blog.csdnimg.cn/blog_migrate/34031c708bfe702fe82d01ff5c6593aa.gif)
{
switch(bookmark)
![](https://i-blog.csdnimg.cn/blog_migrate/3112b7b6526db5bc83e275260ae60525.gif)
{
case "company":
test.GotoBookMark(bookmark);
test.SetFontColor(Word.WdColor.wdColorDarkBlue);
test.SetFontName("Times New Roman");
test.InsertText(hash[bookmark].ToString());
break;
case "catalog":
break;
case "modules":
break;
default:
test.GotoBookMark(bookmark);
test.InsertText(hash[bookmark].ToString());
break;
}
}
这样,对于那些不需要做特殊化处理的书签,我们就统一的在default中进行了填充数据。
3.页眉页脚中添文字的问题
对于页眉页脚,需要注意的就是不要用书签去定位,因为页眉页脚和主文档的页面视图不一样,所以不能在普通的视图下直接定位到页眉页脚所在书签处。但只要你切换一下视图,一切就OK了。
/**/
/// <summary>
/// 设置页眉
/// </summary>
/// <param name="strBookmarkName">要设置页面中的一个书签</param>
/// <param name="text">页眉的文字</param>
public
void
SetHeader(
string
strBookmarkName,
string
text)
![](https://i-blog.csdnimg.cn/blog_migrate/34031c708bfe702fe82d01ff5c6593aa.gif)
{
this.GotoBookMark(strBookmarkName);
// If ActiveWindow.View.SplitSpecial <> wdPaneNone Then
// ActiveWindow.Panes(2).Close
// End If
if(oWordApplic.ActiveWindow.View.SplitSpecial != Word.WdSpecialPane.wdPaneNone)
oWordApplic.ActiveWindow.Panes[2].Close();
![](https://i-blog.csdnimg.cn/blog_migrate/587e34b10dcf5efbc0859b53470a2db3.gif)
// If ActiveWindow.ActivePane.View.Type = wdNormalView Or ActiveWindow. _
// ActivePane.View.Type = wdOutlineView Then
// ActiveWindow.ActivePane.View.Type = wdPrintView
// End If
if(oWordApplic.ActiveWindow.View.Type == Word.WdViewType.wdNormalView
|| oWordApplic.ActiveWindow.View.Type == Word.WdViewType.wdOutlineView)
oWordApplic.ActiveWindow.ActivePane.View.Type = Word.WdViewType.wdPrintView;
![](https://i-blog.csdnimg.cn/blog_migrate/587e34b10dcf5efbc0859b53470a2db3.gif)
// ActiveWindow.ActivePane.View.SeekView = wdSeekCurrentPageHeader
oWordApplic.ActiveWindow.ActivePane.View.SeekView = Word.WdSeekView.wdSeekCurrentPageHeader;
![](https://i-blog.csdnimg.cn/blog_migrate/587e34b10dcf5efbc0859b53470a2db3.gif)
this.GoToTheEnd();
![](https://i-blog.csdnimg.cn/blog_migrate/587e34b10dcf5efbc0859b53470a2db3.gif)
// this.GotoBookMark(strBookmarkName);
this.SetFontColor(Word.WdColor.wdColorDarkBlue);
this.InsertText(text);
![](https://i-blog.csdnimg.cn/blog_migrate/587e34b10dcf5efbc0859b53470a2db3.gif)
// ActiveWindow.ActivePane.View.SeekView = wdSeekMainDocument
oWordApplic.ActiveWindow.ActivePane.View.SeekView = Word.WdSeekView.wdSeekMainDocument;
}
这里,我先是通过书签定位到页眉所在页,这样比较方便,不用在页眉视图中再翻页定位。
4.项目符号及多级项目符号的Style问题
这个问题我的解决中有点问题,要和模板一起设置才能用,感觉不好,就不拿出来给大家看了,以免误导大家了
5.添加特殊字符的问题
当你要在文档中添加特殊文字的时候(如你想添加一个 þ),不能直接通过简单的复制粘贴来实现(你根本没办法在.NET的IDE下看到 þ)。这时,我们可以通过查找这个特殊字符的字体名称和代表的16进制编码来插入。我们可以查到 þ所在的字符集是Wingdings,它的16进制编码是/u00fe,这时,我们就能对这个 þ进行插入,具体代码如:
test.SetFontName(
"
Wingdings
"
);
test.SetFontColor(Word.WdColor.wdColorDarkBlue);
test.InsertText(
"
/u00fe
"
);
其中,test是一个被封装的Word操作类的实例。
如果大家反映强烈,我可以贴出我的代码,Web的和WinForm的都有。
听说那个Michela的demo文件下载不下来,现贴上我以前下载的他的文件/Files/sharemeteor/WordApplication.rar
2.书签过多,一个一个定位麻烦的问题
如果你的Word模板够庞大,可能会出现有50多个书签,而这些书签的位置只是填充一些简单数据的情况。如果我们编程时一个个的定位,然后一个个的填充数据肯定时非常麻烦的。这种情况下,我的解决办法是设置XML配置文档。
我们可以设置一个XML文件,其中存放需要填充数据的书签(这些书签处只是做简单的插入文本)的名称。如下面是我的XML文件的详细内容:
![](https://i-blog.csdnimg.cn/blog_migrate/f0cd6c7f9e7ae96feae062cb48f670f0.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/f0cd6c7f9e7ae96feae062cb48f670f0.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/f0cd6c7f9e7ae96feae062cb48f670f0.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/f0cd6c7f9e7ae96feae062cb48f670f0.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/f0cd6c7f9e7ae96feae062cb48f670f0.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/f0cd6c7f9e7ae96feae062cb48f670f0.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/f0cd6c7f9e7ae96feae062cb48f670f0.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/f0cd6c7f9e7ae96feae062cb48f670f0.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/f0cd6c7f9e7ae96feae062cb48f670f0.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/f0cd6c7f9e7ae96feae062cb48f670f0.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/f0cd6c7f9e7ae96feae062cb48f670f0.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/f0cd6c7f9e7ae96feae062cb48f670f0.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/f0cd6c7f9e7ae96feae062cb48f670f0.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/f0cd6c7f9e7ae96feae062cb48f670f0.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/f0cd6c7f9e7ae96feae062cb48f670f0.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/f0cd6c7f9e7ae96feae062cb48f670f0.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/f0cd6c7f9e7ae96feae062cb48f670f0.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/f0cd6c7f9e7ae96feae062cb48f670f0.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/f0cd6c7f9e7ae96feae062cb48f670f0.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/f0cd6c7f9e7ae96feae062cb48f670f0.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/f0cd6c7f9e7ae96feae062cb48f670f0.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/f0cd6c7f9e7ae96feae062cb48f670f0.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/f0cd6c7f9e7ae96feae062cb48f670f0.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/f0cd6c7f9e7ae96feae062cb48f670f0.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/f0cd6c7f9e7ae96feae062cb48f670f0.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/f0cd6c7f9e7ae96feae062cb48f670f0.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/34031c708bfe702fe82d01ff5c6593aa.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/0be121fa5b8988fbabbbc526af3b0fc0.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/b854634c0904529d4018c4c3336be836.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/587e34b10dcf5efbc0859b53470a2db3.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/3112b7b6526db5bc83e275260ae60525.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/f2671b7f42ce505d9bf55a7a0ca257fb.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/b854634c0904529d4018c4c3336be836.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/587e34b10dcf5efbc0859b53470a2db3.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/587e34b10dcf5efbc0859b53470a2db3.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/587e34b10dcf5efbc0859b53470a2db3.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/587e34b10dcf5efbc0859b53470a2db3.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/587e34b10dcf5efbc0859b53470a2db3.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/587e34b10dcf5efbc0859b53470a2db3.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/587e34b10dcf5efbc0859b53470a2db3.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/587e34b10dcf5efbc0859b53470a2db3.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/587e34b10dcf5efbc0859b53470a2db3.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/587e34b10dcf5efbc0859b53470a2db3.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/587e34b10dcf5efbc0859b53470a2db3.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/587e34b10dcf5efbc0859b53470a2db3.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/587e34b10dcf5efbc0859b53470a2db3.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/587e34b10dcf5efbc0859b53470a2db3.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/eec4c0236afc26744c9c4e910bc34958.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/4fd96b3cf02f4c7b5c8964ac8167f7af.gif)
3.页眉页脚中添文字的问题
对于页眉页脚,需要注意的就是不要用书签去定位,因为页眉页脚和主文档的页面视图不一样,所以不能在普通的视图下直接定位到页眉页脚所在书签处。但只要你切换一下视图,一切就OK了。
![](https://i-blog.csdnimg.cn/blog_migrate/34031c708bfe702fe82d01ff5c6593aa.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/0be121fa5b8988fbabbbc526af3b0fc0.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/587e34b10dcf5efbc0859b53470a2db3.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/587e34b10dcf5efbc0859b53470a2db3.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/587e34b10dcf5efbc0859b53470a2db3.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/4fd96b3cf02f4c7b5c8964ac8167f7af.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/f0cd6c7f9e7ae96feae062cb48f670f0.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/34031c708bfe702fe82d01ff5c6593aa.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/0be121fa5b8988fbabbbc526af3b0fc0.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/b854634c0904529d4018c4c3336be836.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/587e34b10dcf5efbc0859b53470a2db3.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/587e34b10dcf5efbc0859b53470a2db3.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/587e34b10dcf5efbc0859b53470a2db3.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/587e34b10dcf5efbc0859b53470a2db3.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/587e34b10dcf5efbc0859b53470a2db3.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/587e34b10dcf5efbc0859b53470a2db3.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/587e34b10dcf5efbc0859b53470a2db3.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/587e34b10dcf5efbc0859b53470a2db3.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/587e34b10dcf5efbc0859b53470a2db3.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/587e34b10dcf5efbc0859b53470a2db3.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/587e34b10dcf5efbc0859b53470a2db3.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/587e34b10dcf5efbc0859b53470a2db3.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/587e34b10dcf5efbc0859b53470a2db3.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/587e34b10dcf5efbc0859b53470a2db3.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/587e34b10dcf5efbc0859b53470a2db3.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/587e34b10dcf5efbc0859b53470a2db3.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/587e34b10dcf5efbc0859b53470a2db3.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/587e34b10dcf5efbc0859b53470a2db3.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/587e34b10dcf5efbc0859b53470a2db3.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/587e34b10dcf5efbc0859b53470a2db3.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/587e34b10dcf5efbc0859b53470a2db3.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/587e34b10dcf5efbc0859b53470a2db3.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/587e34b10dcf5efbc0859b53470a2db3.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/587e34b10dcf5efbc0859b53470a2db3.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/587e34b10dcf5efbc0859b53470a2db3.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/587e34b10dcf5efbc0859b53470a2db3.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/4fd96b3cf02f4c7b5c8964ac8167f7af.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/f0cd6c7f9e7ae96feae062cb48f670f0.gif)
4.项目符号及多级项目符号的Style问题
这个问题我的解决中有点问题,要和模板一起设置才能用,感觉不好,就不拿出来给大家看了,以免误导大家了
![](https://i-blog.csdnimg.cn/blog_migrate/77e8663b79e5384d2fd4caee737df508.gif)
5.添加特殊字符的问题
当你要在文档中添加特殊文字的时候(如你想添加一个 þ),不能直接通过简单的复制粘贴来实现(你根本没办法在.NET的IDE下看到 þ)。这时,我们可以通过查找这个特殊字符的字体名称和代表的16进制编码来插入。我们可以查到 þ所在的字符集是Wingdings,它的16进制编码是/u00fe,这时,我们就能对这个 þ进行插入,具体代码如:
![](https://i-blog.csdnimg.cn/blog_migrate/f0cd6c7f9e7ae96feae062cb48f670f0.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/f0cd6c7f9e7ae96feae062cb48f670f0.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/f0cd6c7f9e7ae96feae062cb48f670f0.gif)
如果大家反映强烈,我可以贴出我的代码,Web的和WinForm的都有。
![](https://i-blog.csdnimg.cn/blog_migrate/c122510283bb2cb8102abf624ea3e7f4.gif)
听说那个Michela的demo文件下载不下来,现贴上我以前下载的他的文件/Files/sharemeteor/WordApplication.rar