C#实现通过模板自动创建Word文档的方法
本文实例讲述了C#实现通过模板自动创建Word文档的方法,是非常实用的技巧。分享给大家供大家参考。具体实现方法如下:
引言:前段时间有项目要用c#生成Word格式的计算报告,通过网络查找到很多内容,但是都很凌乱,于是自己决定将具体的步骤总结整理出来,以便于更好的交流和以后相似问题可以迅速的解决!
现通过具体的示例演示具体的步骤:
第一步,制作模板
1.新建一个文档,设置文档内容。
2.在相应位置插入书签;将鼠标定位到要插入书签的位置,点击“插入”>“书签”,弹出对话框,输入书签名,点击“添加”按钮。
3.保存模板,命名为“模板1.dot”或者“模板1.doc”
第二步,设置项目中的引用
1.右击“解决方案资源管理器”中的项目目录下的“引用”,选择“添加引用”,打开“添加引用”对话框
2.在“添加引用”对话框中,选择“COM”>“MicrosoftWord11.0ObjectLibrary”,点击“确定”按钮
3.相同操作打开“添加引用”对话框中,选择“浏览”项,查找到”Microsoft.Office.Interop.Word.dll”文件,选中它,点击“确定”按钮
注意:此处要查找的“Microsoft.Office.Interop.Word.dll”版本必须为“11.*.*.*”,“*”代表数字
第三步,编码
这一步分成两个部分
第一部分,Report类的编码
这部分我已经封装好,为文件“Report.cs”,可以直接使用
具体实现代码如下:(代码中有比较详细的注释)
usingSystem; usingSystem.Collections.Generic; usingSystem.Text; usingMicrosoft.Office.Interop.Word; namespaceMYNAMESPACE//这边需要换成自己的命名空间名 { classReport { private_ApplicationwordApp=null; private_DocumentwordDoc=null; public_ApplicationApplication { get { returnwordApp; } set { wordApp=value; } } public_DocumentDocument { get { returnwordDoc; } set { wordDoc=value; } } //通过模板创建新文档 publicvoidCreateNewDocument(stringfilePath) { killWinWordProcess(); wordApp=newApplicationClass(); wordApp.DisplayAlerts=WdAlertLevel.wdAlertsNone; wordApp.Visible=false; objectmissing=System.Reflection.Missing.Value; objecttemplateName=filePath; wordDoc=wordApp.Documents.Open(reftemplateName,refmissing, refmissing,refmissing,refmissing,refmissing,refmissing, refmissing,refmissing,refmissing,refmissing,refmissing, refmissing,refmissing,refmissing,refmissing); } //保存新文件 publicvoidSaveDocument(stringfilePath) { objectfileName=filePath; objectformat=WdSaveFormat.wdFormatDocument;//保存格式 objectmiss=System.Reflection.Missing.Value; wordDoc.SaveAs(reffileName,refformat,refmiss, refmiss,refmiss,refmiss,refmiss, refmiss,refmiss,refmiss,refmiss, refmiss,refmiss,refmiss,refmiss, refmiss); //关闭wordDoc,wordApp对象 objectSaveChanges=WdSaveOptions.wdSaveChanges; objectOriginalFormat=WdOriginalFormat.wdOriginalDocumentFormat; objectRouteDocument=false; wordDoc.Close(refSaveChanges,refOriginalFormat,refRouteDocument); wordApp.Quit(refSaveChanges,refOriginalFormat,refRouteDocument); } //在书签处插入值 publicboolInsertValue(stringbookmark,stringvalue) { objectbkObj=bookmark; if(wordApp.ActiveDocument.Bookmarks.Exists(bookmark)) { wordApp.ActiveDocument.Bookmarks.get_Item(refbkObj).Select(); wordApp.Selection.TypeText(value); returntrue; } returnfalse; } //插入表格,bookmark书签 publicTableInsertTable(stringbookmark,introws,intcolumns,floatwidth) { objectmiss=System.Reflection.Missing.Value; objectoStart=bookmark; Rangerange=wordDoc.Bookmarks.get_Item(refoStart).Range;//表格插入位置 TablenewTable=wordDoc.Tables.Add(range,rows,columns,refmiss,refmiss); //设置表的格式 newTable.Borders.Enable=1;//允许有边框,默认没有边框(为0时报错,1为实线边框,2、3为虚线边框,以后的数字没试过) newTable.Borders.OutsideLineWidth=WdLineWidth.wdLineWidth050pt;//边框宽度 if(width!=0) { newTable.PreferredWidth=width;//表格宽度 } newTable.AllowPageBreaks=false; returnnewTable; } //合并单元格表名,开始行号,开始列号,结束行号,结束列号 publicvoidMergeCell(Microsoft.Office.Interop.Word.Tabletable,introw1,intcolumn1,introw2,intcolumn2) { table.Cell(row1,column1).Merge(table.Cell(row2,column2)); } //设置表格内容对齐方式Align水平方向,Vertical垂直方向(左对齐,居中对齐,右对齐分别对应Align和Vertical的值为-1,0,1) publicvoidSetParagraph_Table(Microsoft.Office.Interop.Word.Tabletable,intAlign,intVertical) { switch(Align) { case-1:table.Range.ParagraphFormat.Alignment=WdParagraphAlignment.wdAlignParagraphLeft;break;//左对齐 case0:table.Range.ParagraphFormat.Alignment=WdParagraphAlignment.wdAlignParagraphCenter;break;//水平居中 case1:table.Range.ParagraphFormat.Alignment=WdParagraphAlignment.wdAlignParagraphRight;break;//右对齐 } switch(Vertical) { case-1:table.Range.Cells.VerticalAlignment=WdCellVerticalAlignment.wdCellAlignVerticalTop;break;//顶端对齐 case0:table.Range.Cells.VerticalAlignment=WdCellVerticalAlignment.wdCellAlignVerticalCenter;break;//垂直居中 case1:table.Range.Cells.VerticalAlignment=WdCellVerticalAlignment.wdCellAlignVerticalBottom;break;//底端对齐 } } //设置表格字体 publicvoidSetFont_Table(Microsoft.Office.Interop.Word.Tabletable,stringfontName,doublesize) { if(size!=0) { table.Range.Font.Size=Convert.ToSingle(size); } if(fontName!="") { table.Range.Font.Name=fontName; } } //是否使用边框,n表格的序号,use是或否 publicvoidUseBorder(intn,booluse) { if(use) { wordDoc.Content.Tables[n].Borders.Enable=1;//允许有边框,默认没有边框(为0时无边框,1为实线边框,2、3为虚线边框,以后的数字没试过) } else { wordDoc.Content.Tables[n].Borders.Enable=2;//允许有边框,默认没有边框(为0时无边框,1为实线边框,2、3为虚线边框,以后的数字没试过) } } //给表格插入一行,n表格的序号从1开始记 publicvoidAddRow(intn) { objectmiss=System.Reflection.Missing.Value; wordDoc.Content.Tables[n].Rows.Add(refmiss); } //给表格添加一行 publicvoidAddRow(Microsoft.Office.Interop.Word.Tabletable) { objectmiss=System.Reflection.Missing.Value; table.Rows.Add(refmiss); } //给表格插入rows行,n为表格的序号 publicvoidAddRow(intn,introws) { objectmiss=System.Reflection.Missing.Value; Microsoft.Office.Interop.Word.Tabletable=wordDoc.Content.Tables[n]; for(inti=0;i<rows;i++) { table.Rows.Add(refmiss); } } //给表格中单元格插入元素,table所在表格,row行号,column列号,value插入的元素 publicvoidInsertCell(Microsoft.Office.Interop.Word.Tabletable,introw,intcolumn,stringvalue) { table.Cell(row,column).Range.Text=value; } //给表格中单元格插入元素,n表格的序号从1开始记,row行号,column列号,value插入的元素 publicvoidInsertCell(intn,introw,intcolumn,stringvalue) { wordDoc.Content.Tables[n].Cell(row,column).Range.Text=value; } //给表格插入一行数据,n为表格的序号,row行号,columns列数,values插入的值 publicvoidInsertCell(intn,introw,intcolumns,string[]values) { Microsoft.Office.Interop.Word.Tabletable=wordDoc.Content.Tables[n]; for(inti=0;i<columns;i++) { table.Cell(row,i+1).Range.Text=values[i]; } } //插入图片 publicvoidInsertPicture(stringbookmark,stringpicturePath,floatwidth,floathight) { objectmiss=System.Reflection.Missing.Value; objectoStart=bookmark; ObjectlinkToFile=false;//图片是否为外部链接 ObjectsaveWithDocument=true;//图片是否随文档一起保存 objectrange=wordDoc.Bookmarks.get_Item(refoStart).Range;//图片插入位置 wordDoc.InlineShapes.AddPicture(picturePath,reflinkToFile,refsaveWithDocument,refrange); wordDoc.Application.ActiveDocument.InlineShapes[1].Width=width;//设置图片宽度 wordDoc.Application.ActiveDocument.InlineShapes[1].Height=hight;//设置图片高度 } //插入一段文字,text为文字内容 publicvoidInsertText(stringbookmark,stringtext) { objectoStart=bookmark; objectrange=wordDoc.Bookmarks.get_Item(refoStart).Range; Paragraphwp=wordDoc.Content.Paragraphs.Add(refrange); wp.Format.SpaceBefore=6; wp.Range.Text=text; wp.Format.SpaceAfter=24; wp.Range.InsertParagraphAfter(); wordDoc.Paragraphs.Last.Range.Text="\n"; } //杀掉winword.exe进程 publicvoidkillWinWordProcess() { System.Diagnostics.Process[]processes=System.Diagnostics.Process.GetProcessesByName("WINWORD"); foreach(System.Diagnostics.Processprocessinprocesses) { boolb=process.MainWindowTitle==""; if(process.MainWindowTitle=="") { process.Kill(); } } } } }
第二部分,具体生成文档的编码
代码见下文:
1.首先需要载入模板
Reportreport=newReport();
report.CreateNewDocument(TemPath);//模板路径
2.插入一个值
report.InsertValue("Bookmark_value","世界杯");//在书签“Bookmark_value”处插入值
3.创建一个表格
Tabletable=report.InsertTable("Bookmark_table",2,3,0);//在书签“Bookmark_table”处插入2行3列行宽最大的表
4.合并单元格
report.MergeCell(table,1,1,1,3);//表名,开始行号,开始列号,结束行号,结束列号
5.表格添加一行
report.AddRow(table);//表名
6.在单元格中插入值
report.InsertCell(table,2,1,"R2C1");//表名,行号,列号,值
7.设置表格中文字的对齐方式
report.SetParagraph_Table(table,-1,0);//水平方向左对齐,垂直方向居中对齐
8.设置表格字体
report.SetFont_Table(table,"宋体",9);//宋体9磅
9.给现有的表格添加一行
report.AddRow(1);//给模板中第一个表格添加一行
10.确定现有的表格是否使用边框
report.UseBorder(1,true);//模板中第一个表格使用实线边框
11.给现有的表格添加多行
report.AddRow(1,2);//给模板中第一个表格插入2行
12.给现有的表格插入一行数据
string[]values={"英超","意甲","德甲","西甲","法甲"};
report.InsertCell(1,2,5,values);//给模板中第一个表格的第二行的5列分别插入数据
13.插入图片
stringpicturePath=@"C:\DocumentsandSettings\Administrator\桌面\1.jpg";
report.InsertPicture("Bookmark_picture",picturePath,150,150);//书签位置,图片路径,图片宽度,图片高度
14.插入一段文字
stringtext="长期从事电脑操作者,应多吃一些新鲜的蔬菜和水果,同时增加维生素A、B1、C、E的摄入。为预防角膜干燥、眼干涩、视力下降、甚至出现夜盲等,电脑操作者应多吃富含维生素A的食物,如豆制品、鱼、牛奶、核桃、青菜、大白菜、空心菜、西红柿及新鲜水果等。";
report.InsertText("Bookmark_text",text);
15.最后保存文档
report.SaveDocument(RepPath);//文档路径
第四步,运行程序生成文档,并查看生成的文档
希望本文所述对大家的C#程序设计有所帮助。