比较全的一个C#操作word文档示例
最近两天研究了一下如何使用VS2008(C#语言)输出Word文档。以下是几点总结:
1、非常简单。
2、开发及运行环境要求。操作系统为:WindowsXP(安装.netframework2.0)/Vista/Win7;在操作系统必须安装Word2003完全安装版。这里必须要强调是Word2003完全安装版,因为软件开发及运行都需要一个com组件:Microsoftword11.0ObjectLibrary。如果不是Word2003完全安装版,可以下载这个com组件,并手动的安装这个com组件。下载地址为:http://www.microsoft.com/download/en/details.aspx?displaylang=en&id=20923,文件不大,只有4M左右。
3、C#工程设置。这里的工程设置,就是添加com组件。步骤为:在工程资源管理器中"添加引用"->"com"选项卡->在下拉列表中选Microsoftword11.0ObjectLibrary。ok了,看上去,跟添加一般的dll一样,但实际上vs2008在这个过程中完成一系列复杂的关于.net调用com组件的操作,不过,幸好我们不用管这个。
4、接下就是写代码了。在这里,使用Word的com对像,跟使用一般的非com对像一样,非常流畅,好像根本就不管它什么com不com的。为了使代码比较简洁,可以在源代码文件顶添加这样的一条语句:usingWord=Microsoft.Office.Interop.Word;
5、最好是对word对像模型有一定的了解,这样在写代码的时候就不会那么“迷茫”了。wore对像模型中有几个比较重要的对像,它们是Application、Document、Selection、Range、Bookmark,以及其它的一些对像,如:Paragraph、Section、Table等级。刚开始学的时候,感觉Selection、Range、Bookmark这几个对像有点迷惑人,Selection可能好理解,就是表示当前的选择区域,如果没有选择就表示光标所在位置。Range和Bookmark,其实在很多地方很像,不过也有一些区别,在这里就不多说了,google一下"word.Range"就行了。
6、在写代码的过程中,经常会想要实现的一些操作,但是由于对word对像不熟悉而不知怎么用代码实现。比如设置页眉、添加页码什么的,如果在Word程序里手动的操作当然很简单,但是要用代码来实现,对初学者来说就可能不那么容易了。遇到这种情况,一般有两种方法可以选择:一种是"百度/google法",别一种,也是我所推荐的一种就是,利用Word的“录制宏”功能把想要实现的操作录成宏之后,再看宏里的代码,宏里的代码其实几乎就是你想要的代码了(只不过语法有一点不一样而已)。
7、以下给出一个示例,这个示例里面包括了一些常用的图、文、表、公式的编辑与排版以及页面设置、页眉、页码的操作,里面都有注释,写得很清楚。
usingSystem;
usingSystem.Collections.Generic;
usingSystem.ComponentModel;
usingSystem.Data;
usingSystem.Drawing;
usingSystem.Text;
usingMicrosoft.Office.Interop;
usingWord=Microsoft.Office.Interop.Word;
usingSystem.Runtime.InteropServices;
namespaceWindowsFormsApplication1
{
publicpartialclassForm1:System.Windows.Forms.Form
{
[DllImport("shell32.dll")]
publicstaticexternintShellExecute(IntPtrhwnd,StringlpszOp,StringlpszFile,StringlpszParams,StringlpszDir,intFsShowCmd);
publicForm1()
{
InitializeComponent();
}
privatevoidbutton1_Click(objectsender,EventArgse)
{
//新建文档
//Word.Applicationnewapp=newWord.Application();//用这句也能初始化
Word.Applicationnewapp=newWord.ApplicationClass();
Word.Documentnewdoc;
objectnothing=System.Reflection.Missing.Value;//用于作为函数的默认参数
newdoc=newapp.Documents.Add(refnothing,refnothing,refnothing,refnothing);//生成一个word文档
newapp.Visible=true;//是否显示word程序界面
//页面设置
//newdoc.PageSetup.Orientation=Word.WdOrientation.wdOrientLandscape;
//newdoc.PageSetup.PageWidth=newapp.CentimetersToPoints(21.0f);
//newdoc.PageSetup.PageHeight=newapp.CentimetersToPoints(29.7f);
newdoc.PageSetup.PaperSize=Word.WdPaperSize.wdPaperA4;
newdoc.PageSetup.Orientation=Word.WdOrientation.wdOrientPortrait;
newdoc.PageSetup.TopMargin=57.0f;
newdoc.PageSetup.BottomMargin=57.0f;
newdoc.PageSetup.LeftMargin=57.0f;
newdoc.PageSetup.RightMargin=57.0f;
newdoc.PageSetup.HeaderDistance=30.0f;//页眉位置
//设置页眉
newapp.ActiveWindow.View.Type=Word.WdViewType.wdOutlineView;//视图样式。
newapp.ActiveWindow.View.SeekView=Word.WdSeekView.wdSeekPrimaryHeader;//进入页眉设置,其中页眉边距在页面设置中已完成
newapp.Selection.ParagraphFormat.Alignment=Word.WdParagraphAlignment.wdAlignParagraphRight;
//插入页眉图片
stringheaderfile="d:\\header.jpg";
this.outpicture(headerfile,Properties.Resources.header);
Word.InlineShapeshape1=newapp.ActiveWindow.ActivePane.Selection.InlineShapes.AddPicture(headerfile,refnothing,refnothing,refnothing);
shape1.Height=30;
shape1.Width=80;
newapp.ActiveWindow.ActivePane.Selection.InsertAfter("中建东北院");
//去掉页眉的那条横线
newapp.ActiveWindow.ActivePane.Selection.ParagraphFormat.Borders[Microsoft.Office.Interop.Word.WdBorderType.wdBorderBottom].LineStyle=Word.WdLineStyle.wdLineStyleNone;
newapp.ActiveWindow.ActivePane.Selection.Borders[Microsoft.Office.Interop.Word.WdBorderType.wdBorderBottom].Visible=false;
newapp.ActiveWindow.ActivePane.View.SeekView=Word.WdSeekView.wdSeekMainDocument;//退出页眉设置
//添加页码
Word.PageNumberspns=newapp.Selection.Sections[1].Headers[Microsoft.Office.Interop.Word.WdHeaderFooterIndex.wdHeaderFooterEvenPages].PageNumbers;
pns.NumberStyle=Word.WdPageNumberStyle.wdPageNumberStyleNumberInDash;
pns.HeadingLevelForChapter=0;
pns.IncludeChapterNumber=false;
pns.ChapterPageSeparator=Word.WdSeparatorType.wdSeparatorHyphen;
pns.RestartNumberingAtSection=false;
pns.StartingNumber=0;
objectpagenmbetal=Word.WdPageNumberAlignment.wdAlignPageNumberCenter;
objectfirst=true;
newapp.Selection.Sections[1].Footers[Microsoft.Office.Interop.Word.WdHeaderFooterIndex.wdHeaderFooterEvenPages].PageNumbers.Add(refpagenmbetal,reffirst);
//文字设置(Selection表示当前选择集,如果当前没有选择对像,则指对光标所在处进行设置)
newapp.Selection.Font.Size=14;
newapp.Selection.Font.Bold=0;
newapp.Selection.Font.Color=Word.WdColor.wdColorBlack;
newapp.Selection.Font.Name="宋体";
//段落设置
newapp.Selection.ParagraphFormat.LineSpacingRule=Word.WdLineSpacing.wdLineSpaceExactly;
newapp.Selection.ParagraphFormat.LineSpacing=20;
newapp.Selection.ParagraphFormat.Alignment=Word.WdParagraphAlignment.wdAlignParagraphLeft;
newapp.Selection.ParagraphFormat.FirstLineIndent=30;
newdoc.Content.InsertAfter(WindowsFormsApplication1.Properties.Resources.PreViewWords);
//插入公式
objectoEndOfDoc="\\endofdoc";
Word.Rangerang1=newdoc.Bookmarks.get_Item(refoEndOfDoc).Range;
objectfieldType=Word.WdFieldType.wdFieldEmpty;
objectformula=@"eq\i(a,b,ξxdx)";
objectpresrveFormatting=false;
rang1.Text=formula.ToString();
rang1.Font.Size=14;
rang1.Font.Bold=0;
rang1.Font.Subscript=0;
rang1.Font.Color=Word.WdColor.wdColorBlue;
rang1.Font.Name="宋体";
rang1.ParagraphFormat.LineSpacingRule=Word.WdLineSpacing.wdLineSpaceSingle;
rang1.ParagraphFormat.Alignment=Word.WdParagraphAlignment.wdAlignParagraphRight;
newdoc.Fields.Add(rang1,reffieldType,refformula,refpresrveFormatting);
//将文档的前三个字替换成"asdfasdf",并将其颜色设为蓝色
objectstart=0;
objectend=3;
Word.Rangerang2=newdoc.Range(refstart,refend);
rang2.Font.Color=Word.WdColor.wdColorBlue;
rang2.Text="as签";
//将文档开头的"as"替换成"袁波"
rang1.Start=0;
rang1.End=2;
rang1.Text="这是一个";
rang1.InsertAfter("书");
//rang1.Select();
objectcodirection=Word.WdCollapseDirection.wdCollapseStart;
rang1.Collapse(refcodirection);//将rang1的起点和终点都定于起点或终点
//对前三个字符进行加粗
newdoc.Range(refstart,refend).Bold=1;
objectrang=rang2;
newdoc.Bookmarks.Add("yb",refrang);
objectunite=Word.WdUnits.wdStory;
newapp.Selection.EndKey(refunite,refnothing);//将光标移至文末
newapp.Selection.Font.Size=10;
newapp.Selection.TypeText("...............................(式1)\n");
//插入图片
newapp.Selection.EndKey(refunite,refnothing);//将光标移至文末
//newapp.Selection.HomeKey(refunite,refnothing);//将光标移至文开头
newapp.Selection.ParagraphFormat.LineSpacingRule=Word.WdLineSpacing.wdLineSpaceSingle;
newapp.Selection.ParagraphFormat.Alignment=Word.WdParagraphAlignment.wdAlignParagraphCenter;
objectLinkToFile=false;
objectSaveWithDocument=true;
objectAnchor=newapp.Selection.Range;
stringpicname="d:\\kk.jpg";
this.outpicture(picname,Properties.Resources.IMG_2169);
newdoc.InlineShapes.AddPicture(picname,refLinkToFile,refSaveWithDocument,refAnchor);
newdoc.InlineShapes[1].Height=200;
newdoc.InlineShapes[1].Width=200;
newdoc.Content.InsertAfter("\n");
newapp.Selection.EndKey(refunite,refnothing);//将光标移至文末
newapp.Selection.ParagraphFormat.Alignment=Word.WdParagraphAlignment.wdAlignParagraphCenter;
newapp.Selection.Font.Size=10;
newapp.Selection.TypeText("图1袁冶\n");
newapp.Selection.ParagraphFormat.Alignment=Word.WdParagraphAlignment.wdAlignParagraphRight;
newdoc.Content.InsertAfter("\n");
newdoc.Content.InsertAfter("\n");
//用这种方式也可以插入公式,并且这种方法更简单
newapp.Selection.Font.Size=14;
newapp.Selection.InsertFormula(refformula,refnothing);
newapp.Selection.Font.Size=10;
newapp.Selection.TypeText("..............................(式2)\n");
newapp.Selection.ParagraphFormat.Alignment=Word.WdParagraphAlignment.wdAlignParagraphCenter;
newapp.Selection.TypeText("表1电子产品\n");
//插入表格
Word.Tabletable1=newdoc.Tables.Add(newapp.Selection.Range,4,3,refnothing,refnothing);
newdoc.Tables[1].Cell(1,1).Range.Text="产品\n项目";
newdoc.Tables[1].Cell(1,2).Range.Text="电脑";
newdoc.Tables[1].Cell(1,3).Range.Text="手机";
newdoc.Tables[1].Cell(2,1).Range.Text="重量(kg)";
newdoc.Tables[1].Cell(3,1).Range.Text="价格(元)";
newdoc.Tables[1].Cell(4,1).Range.Text="共同信息";
newdoc.Tables[1].Cell(4,2).Range.Text="信息A";
newdoc.Tables[1].Cell(4,3).Range.Text="信息B";
table1.Select();
table1.Rows.Alignment=Word.WdRowAlignment.wdAlignRowCenter;//整个表格居中
newapp.Selection.Cells.VerticalAlignment=Word.WdCellVerticalAlignment.wdCellAlignVerticalCenter;
newapp.Selection.ParagraphFormat.Alignment=Word.WdParagraphAlignment.wdAlignParagraphCenter;
newapp.Selection.Cells.HeightRule=Word.WdRowHeightRule.wdRowHeightExactly;
newapp.Selection.Cells.Height=40;
table1.Rows[2].Height=20;
table1.Rows[3].Height=20;
table1.Rows[4].Height=20;
table1.Range.ParagraphFormat.Alignment=Word.WdParagraphAlignment.wdAlignParagraphCenter;
newapp.Selection.Cells.Width=150;
table1.Columns[1].Width=75;
table1.Cell(1,1).Range.ParagraphFormat.Alignment=Word.WdParagraphAlignment.wdAlignParagraphRight;
table1.Cell(1,1).Range.Paragraphs[2].Format.Alignment=Word.WdParagraphAlignment.wdAlignParagraphLeft;
//表头斜线
table1.Cell(1,1).Borders[Microsoft.Office.Interop.Word.WdBorderType.wdBorderDiagonalDown].Visible=true;
table1.Cell(1,1).Borders[Microsoft.Office.Interop.Word.WdBorderType.wdBorderDiagonalDown].Color=Word.WdColor.wdColorGreen;
table1.Cell(1,1).Borders[Microsoft.Office.Interop.Word.WdBorderType.wdBorderDiagonalDown].LineWidth=Word.WdLineWidth.wdLineWidth050pt;
//表格边框
table1.Borders[Microsoft.Office.Interop.Word.WdBorderType.wdBorderHorizontal].Visible=true;
table1.Borders[Microsoft.Office.Interop.Word.WdBorderType.wdBorderHorizontal].Color=Word.WdColor.wdColorGreen;
table1.Borders[Microsoft.Office.Interop.Word.WdBorderType.wdBorderHorizontal].LineWidth=Word.WdLineWidth.wdLineWidth050pt;
table1.Borders[Microsoft.Office.Interop.Word.WdBorderType.wdBorderVertical].Visible=true;
table1.Borders[Microsoft.Office.Interop.Word.WdBorderType.wdBorderVertical].Color=Word.WdColor.wdColorGreen;
table1.Borders[Microsoft.Office.Interop.Word.WdBorderType.wdBorderVertical].LineWidth=Word.WdLineWidth.wdLineWidth050pt;
table1.Borders[Microsoft.Office.Interop.Word.WdBorderType.wdBorderLeft].Visible=true;
table1.Borders[Microsoft.Office.Interop.Word.WdBorderType.wdBorderLeft].Color=Word.WdColor.wdColorGreen;
table1.Borders[Microsoft.Office.Interop.Word.WdBorderType.wdBorderLeft].LineWidth=Word.WdLineWidth.wdLineWidth050pt;
table1.Borders[Microsoft.Office.Interop.Word.WdBorderType.wdBorderLeft].LineStyle=Word.WdLineStyle.wdLineStyleDoubleWavy;
table1.Borders[Microsoft.Office.Interop.Word.WdBorderType.wdBorderRight].Visible=true;
table1.Borders[Microsoft.Office.Interop.Word.WdBorderType.wdBorderRight].Color=Word.WdColor.wdColorGreen;
table1.Borders[Microsoft.Office.Interop.Word.WdBorderType.wdBorderRight].LineWidth=Word.WdLineWidth.wdLineWidth050pt;
table1.Borders[Microsoft.Office.Interop.Word.WdBorderType.wdBorderRight].LineStyle=Word.WdLineStyle.wdLineStyleDoubleWavy;
table1.Borders[Microsoft.Office.Interop.Word.WdBorderType.wdBorderBottom].Visible=true;
table1.Borders[Microsoft.Office.Interop.Word.WdBorderType.wdBorderBottom].Color=Word.WdColor.wdColorGreen;
table1.Borders[Microsoft.Office.Interop.Word.WdBorderType.wdBorderBottom].LineWidth=Word.WdLineWidth.wdLineWidth050pt;
table1.Borders[Microsoft.Office.Interop.Word.WdBorderType.wdBorderBottom].LineStyle=Word.WdLineStyle.wdLineStyleDouble;
table1.Borders[Microsoft.Office.Interop.Word.WdBorderType.wdBorderTop].Visible=true;
table1.Borders[Microsoft.Office.Interop.Word.WdBorderType.wdBorderTop].Color=Word.WdColor.wdColorGreen;
table1.Borders[Microsoft.Office.Interop.Word.WdBorderType.wdBorderTop].LineWidth=Word.WdLineWidth.wdLineWidth050pt;
table1.Borders[Microsoft.Office.Interop.Word.WdBorderType.wdBorderTop].LineStyle=Word.WdLineStyle.wdLineStyleDouble;
//合并单元格
newdoc.Tables[1].Cell(4,2).Merge(table1.Cell(4,3));
//删除图片
this.delpictfile(headerfile);
this.delpictfile(picname);
//保存文档
objectname="c:\\yb3.doc";
newdoc.SaveAs(refname,refnothing,refnothing,refnothing,refnothing,refnothing,refnothing,
refnothing,refnothing,refnothing,refnothing,refnothing,refnothing,refnothing,
refnothing,refnothing);
//关闭文档
objectsaveOption=Word.WdSaveOptions.wdDoNotSaveChanges;
newdoc.Close(refnothing,refnothing,refnothing);
newapp.Application.Quit(refsaveOption,refnothing,refnothing);
newdoc=null;
newapp=null;
ShellExecute(IntPtr.Zero,"open","c:\\yb3.doc","","",3);
}
privatevoidoutpicture(stringfilename,System.Drawing.Bitmapbmap)
{
bmap.Save(filename);
}
privatevoiddelpictfile(stringfilename)
{
System.IO.File.Delete(filename);
}
}
}