通过c#创建基于模板的Word文档

  • 格式:doc
  • 大小:441.50 KB
  • 文档页数:12

C#程序通过模板自动创建Word文档引言:前段时间有项目要用c#生成Word格式的计算报告,通过网络查找到很多内容,但是都很凌乱,于是自己决定将具体的步骤总结整理出来,以便于更好的交流和以后相似问题可以迅速的解决!现通过具体的示例演示具体的步骤:第一步,制作模板1,新建一个文档,文档内容如下:图12,在相应位置插入书签;将鼠标定位到要插入书签的位置,点击“插入”>“书签”,弹出对话框,输入书签名,点击“添加”按钮,书签位置如图3所示图2图33,保存模板,命名为“模板1.dot”或者“模板1.doc”图4第二步,设置项目中的引用1,右击“解决方案资源管理器”中的项目目录下的“引用”,选择“添加引用”,打开“添加引用”对话框图52,在“添加引用”对话框中,选择“COM”>“Microsoft Word 11.0 Object Library”,点击“确定”按钮图63,相同操作打开“添加引用”对话框中,选择“浏览”项,查找到”Microsoft.Office.Interop.Word.dll”文件,选中它,点击“确定”按钮图7注意:此处要查找的“Microsoft.Office.Interop.Word.dll”版本必须为“11.*.*.*”,“*”代表数字第三步,编码这一步分成两个部分第一部分,Report类的编码这部分我已经封装好,为文件“Report.cs”,可以直接使用代码如下:(有比较详细的注释)using System;using System.Collections.Generic;using System.Text;using Microsoft.Office.Interop.Word;namespace MYNAMESPACE //这边需要换成自己的命名空间名{class Report{private_Application wordApp = null;private_Document wordDoc = null;public_Application Application{get{return wordApp;}setwordApp = value;}}public_Document Document{get{return wordDoc;}set{wordDoc = value;}}//通过模板创建新文档public void CreateNewDocument(string filePath){killWinWordProcess();wordApp = new ApplicationClass();wordApp.DisplayAlerts = WdAlertLevel.wdAlertsNone;wordApp.Visible = false;object missing = System.Reflection.Missing.Value;object templateName = filePath;wordDoc = wordApp.Documents.Open(ref templateName, ref missing,ref missing, ref missing, ref missing, ref missing, ref missing,ref missing, ref missing, ref missing, ref missing, ref missing,ref missing, ref missing, ref missing, ref missing);}//保存新文件public void SaveDocument(string filePath){object fileName = filePath;object format = WdSaveFormat.wdFormatDocument;//保存格式object miss = System.Reflection.Missing.Value;wordDoc.SaveAs(ref fileName, ref format, ref miss,ref miss, ref miss, ref miss, ref miss,ref miss, ref miss, ref miss, ref miss,ref miss, ref miss, ref miss, ref miss,ref miss);//关闭wordDoc,wordApp对象object SaveChanges = WdSaveOptions.wdSaveChanges;object OriginalFormat = WdOriginalFormat.wdOriginalDocumentFormat;object RouteDocument = false;wordDoc.Close(ref SaveChanges, ref OriginalFormat, ref RouteDocument); wordApp.Quit(ref SaveChanges, ref OriginalFormat, ref RouteDocument); }//在书签处插入值public bool InsertValue(string bookmark, string value){object bkObj = bookmark;if (wordApp.ActiveDocument.Bookmarks.Exists(bookmark))wordApp.ActiveDocument.Bookmarks.get_Item(ref bkObj).Select();wordApp.Selection.TypeText(value);return true;}return false;}//插入表格,bookmark书签public Table InsertTable(string bookmark, int rows, int columns, float width){object miss = System.Reflection.Missing.Value;object oStart = bookmark;Range range = wordDoc.Bookmarks.get_Item(ref oStart).Range;//表格插入位置Table newTable = wordDoc.Tables.Add(range, rows, columns, ref miss, ref miss);//设置表的格式newTable.Borders.Enable = 1; //允许有边框,默认没有边框(为0时报错,1为实线边框,2、3为虚线边框,以后的数字没试过)newTable.Borders.OutsideLineWidth = WdLineWidth.wdLineWidth050pt;//边框宽度if (width != 0){newTable.PreferredWidth = width;//表格宽度}newTable.AllowPageBreaks = false;return newTable;}//合并单元格表名,开始行号,开始列号,结束行号,结束列号public void MergeCell(Microsoft.Office.Interop.Word.Table table, int row1, int column1, int row2, int column2){table.Cell(row1, column1).Merge(table.Cell(row2, column2));}//设置表格内容对齐方式 Align水平方向,Vertical垂直方向(左对齐,居中对齐,右对齐分别对应Align和Vertical的值为-1,0,1)public void SetParagraph_Table(Microsoft.Office.Interop.Word.Table table, int Align, int Vertical){switch (Align){case -1: table.Range.ParagraphFormat.Alignment =WdParagraphAlignment.wdAlignParagraphLeft; break;//左对齐case 0: table.Range.ParagraphFormat.Alignment =WdParagraphAlignment.wdAlignParagraphCenter; break;//水平居中case 1: table.Range.ParagraphFormat.Alignment =WdParagraphAlignment.wdAlignParagraphRight; break;//右对齐}switch (Vertical){case -1: table.Range.Cells.VerticalAlignment =WdCellVerticalAlignment.wdCellAlignVerticalTop; break;//顶端对齐case 0: table.Range.Cells.VerticalAlignment =WdCellVerticalAlignment.wdCellAlignVerticalCenter; break;//垂直居中case 1: table.Range.Cells.VerticalAlignment =WdCellVerticalAlignment.wdCellAlignVerticalBottom; break;//底端对齐}}//设置表格字体public void SetFont_Table(Microsoft.Office.Interop.Word.Table table, string fontName, double size){if (size != 0){table.Range.Font.Size = Convert.ToSingle(size);}if (fontName != ""){ = fontName;}}//是否使用边框,n表格的序号,use是或否public void UseBorder(int n,bool use){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开始记public void AddRow(int n){object miss = System.Reflection.Missing.Value;wordDoc.Content.Tables[n].Rows.Add(ref miss);}//给表格添加一行public void AddRow(Microsoft.Office.Interop.Word.Table table){object miss = System.Reflection.Missing.Value;table.Rows.Add(ref miss);}//给表格插入rows行,n为表格的序号public void AddRow(int n, int rows){object miss = System.Reflection.Missing.Value;Microsoft.Office.Interop.Word.Table table = wordDoc.Content.Tables[n];for (int i = 0; i < rows; i++){table.Rows.Add(ref miss);}}//给表格中单元格插入元素,table所在表格,row行号,column列号,value插入的元素public void InsertCell(Microsoft.Office.Interop.Word.Table table, int row, int column, string value){table.Cell(row, column).Range.Text = value;}//给表格中单元格插入元素,n表格的序号从1开始记,row行号,column列号,value插入的元素public void InsertCell(int n, int row, int column, string value){wordDoc.Content.Tables[n].Cell(row, column).Range.Text = value;}//给表格插入一行数据,n为表格的序号,row行号,columns列数,values插入的值public void InsertCell(int n, int row, int columns, string[] values){Microsoft.Office.Interop.Word.Table table = wordDoc.Content.Tables[n];for (int i = 0; i < columns; i++){table.Cell(row, i + 1).Range.Text = values[i];}}//插入图片public void InsertPicture(string bookmark, string picturePath, float width, float hight) {object miss = System.Reflection.Missing.Value;object oStart = bookmark;Object linkToFile = false; //图片是否为外部链接Object saveWithDocument = true; //图片是否随文档一起保存object range = wordDoc.Bookmarks.get_Item(ref oStart).Range;//图片插入位置wordDoc.InlineShapes.AddPicture(picturePath, ref linkToFile, ref saveWithDocument, ref range);wordDoc.Application.ActiveDocument.InlineShapes[1].Width = width; //设置图片宽度wordDoc.Application.ActiveDocument.InlineShapes[1].Height = hight; //设置图片高度}//插入一段文字,text为文字内容public void InsertText(string bookmark, string text){object oStart = bookmark;object range = wordDoc.Bookmarks.get_Item(ref oStart).Range;Paragraph wp = wordDoc.Content.Paragraphs.Add(ref range);wp.Format.SpaceBefore = 6;wp.Range.Text = text;wp.Format.SpaceAfter = 24;wp.Range.InsertParagraphAfter();st.Range.Text = "\n";}// 杀掉winword.exe进程public void killWinWordProcess(){System.Diagnostics.Process[] processes =System.Diagnostics.Process.GetProcessesByName("WINWORD");foreach (System.Diagnostics.Process process in processes){bool b = process.MainWindowTitle == "";if (process.MainWindowTitle == ""){process.Kill();}}}}}第二部分,具体生成文档的编码代码见下文:1,首先需要载入模板Report report = new Report();report.CreateNewDocument(TemPath); //模板路径2,插入一个值report.InsertValue("Bookmark_value", "世界杯");//在书签“Bookmark_value”处插入值3,创建一个表格Table table = 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,确定现有的表格是否使用边框eBorder(1, true); //模板中第一个表格使用实线边框11,给现有的表格添加多行report.AddRow(1, 2); //给模板中第一个表格插入2行12,给现有的表格插入一行数据string[] values={ "英超", "意甲", "德甲", "西甲", "法甲" };report.InsertCell(1, 2, 5, values); //给模板中第一个表格的第二行的5列分别插入数据12,插入图片string picturePath = @"C:\Documents and Settings\Administrator\桌面\1.jpg";report.InsertPicture("Bookmark_picture", picturePath, 150, 150); //书签位置,图片路径,图片宽度,图片高度13,插入一段文字string text = "长期从事电脑操作者,应多吃一些新鲜的蔬菜和水果,同时增加维生素A、B1、C、E的摄入。