C#实现通过模板自动创建Word文档的方法

本文实例讲述了C#实现通过模板自动创建Word文档的方法,是非常实用的技巧。分享给大家供大家参考。具体实现方法如下:

引言:前段时间有项目要用c#生成Word格式的计算报告,通过网络查找到很多内容,但是都很凌乱,于是自己决定将具体的步骤总结整理出来,以便于更好的交流和以后相似问题可以迅速的解决!

现通过具体的示例演示具体的步骤:
 
第一步,制作模板
 
1.新建一个文档,设置文档内容。
2.在相应位置插入书签;将鼠标定位到要插入书签的位置,点击“插入”>“书签”,弹出对话框,输入书签名,点击“添加”按钮。
3.保存模板,命名为“模板1.dot”或者“模板1.doc”

第二步,设置项目中的引用

1.右击“解决方案资源管理器”中的项目目录下的“引用”,选择“添加引用”,打开“添加引用”对话框
2.在“添加引用”对话框中,选择“COM”>“Microsoft Word 11.0 Object Library”,点击“确定”按钮
3.相同操作打开“添加引用”对话框中,选择“浏览”项,查找到”Microsoft.Office.Interop.Word.dll”文件,选中它,点击“确定”按钮
 
注意:此处要查找的“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 //这边需要换成自己的命名空间名
{
  classReport
  {
    private_ApplicationwordApp= null;
    private_DocumentwordDoc= null;
    public_ApplicationApplication
    {
      get
      {
        return wordApp;
      }
      set
      {
        wordApp = value;
      }
    }
    public_DocumentDocument
    {
      get
      {
        return wordDoc;
      }
      set
      {
        wordDoc = value;
      }
    }

    //通过模板创建新文档
    publicvoidCreateNewDocument(stringfilePath)
    {
      killWinWordProcess();
      wordApp= new ApplicationClass();
      wordApp.DisplayAlerts =WdAlertLevel.wdAlertsNone;
      wordApp.Visible =false;
      objectmissing =System.Reflection.Missing.Value;
      objecttemplateName =filePath;
      wordDoc= wordApp.Documents.Open(reftemplateName, refmissing,
        ref missing, ref missing,ref missing, ref missing, refmissing,
        ref missing, ref missing,ref missing, ref missing, refmissing,
        ref missing, ref missing,ref missing, ref missing);
    }

    //保存新文件
    publicvoidSaveDocument(stringfilePath)
    {
      objectfileName =filePath;
      objectformat =WdSaveFormat.wdFormatDocument;//保存格式
      objectmiss =System.Reflection.Missing.Value;
      wordDoc.SaveAs(reffileName, 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对象
      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);
        return true;
      }
      returnfalse;
    }

    //插入表格,bookmark书签
    publicTableInsertTable(stringbookmark, int rows, int columns,float width)
    {
      objectmiss =System.Reflection.Missing.Value;
      objectoStart =bookmark;
      Rangerange =wordDoc.Bookmarks.get_Item(refoStart).Range;//表格插入位置
      TablenewTable =wordDoc.Tables.Add(range,rows, columns, ref miss, 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, int row1, int column1,int row2, int column2)
    {
      table.Cell(row1,column1).Merge(table.Cell(row2,column2));
    }

    //设置表格内容对齐方式Align水平方向,Vertical垂直方向(左对齐,居中对齐,右对齐分别对应Align和Vertical的值为-1,0,1)
    publicvoidSetParagraph_Table(Microsoft.Office.Interop.Word.Tabletable, 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;//底端对齐
      }
    }

    //设置表格字体
    publicvoidSetFont_Table(Microsoft.Office.Interop.Word.Tabletable, string fontName, double size)
    {
      if(size != 0)
      {
        table.Range.Font.Size =Convert.ToSingle(size);
      }
      if(fontName !="")
      {
        table.Range.Font.Name =fontName;
      }
    }

    //是否使用边框,n表格的序号,use是或否
    publicvoidUseBorder(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开始记
    publicvoidAddRow(int n)
    {
      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(int n, int rows)
    {
      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, int row, int column,string value)
    {
      table.Cell(row,column).Range.Text =value;
    }

    //给表格中单元格插入元素,n表格的序号从1开始记,row行号,column列号,value插入的元素
    publicvoidInsertCell(int n, int row,int column, string value)
    {
      wordDoc.Content.Tables[n].Cell(row,column).Range.Text =value;
    }

    //给表格插入一行数据,n为表格的序号,row行号,columns列数,values插入的值
    publicvoidInsertCell(int n, int row,int columns, 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, float hight)
    {
      object miss = System.Reflection.Missing.Value;
      objectoStart =bookmark;
      ObjectlinkToFile =false;    //图片是否为外部链接
      ObjectsaveWithDocument =true; //图片是否随文档一起保存
      objectrange =wordDoc.Bookmarks.get_Item(refoStart).Range;//图片插入位置
      wordDoc.InlineShapes.AddPicture(picturePath,ref linkToFile, ref saveWithDocument, 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.Processprocess 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.确定现有的表格是否使用边框
report.UseBorder(1,true); //模板中第一个表格使用实线边框
 
11.给现有的表格添加多行
report.AddRow(1, 2);//给模板中第一个表格插入2行
 
12.给现有的表格插入一行数据
string[] values={"英超", "意甲", "德甲","西甲", "法甲" };
report.InsertCell(1, 2, 5,values); //给模板中第一个表格的第二行的5列分别插入数据
 
13.插入图片
string picturePath = @"C:\Documents and Settings\Administrator\桌面\1.jpg";
report.InsertPicture("Bookmark_picture",picturePath, 150, 150); //书签位置,图片路径,图片宽度,图片高度
 
14.插入一段文字
string text = "长期从事电脑操作者,应多吃一些新鲜的蔬菜和水果,同时增加维生素A、B1、C、E的摄入。为预防角膜干燥、眼干涩、视力下降、甚至出现夜盲等,电 脑操作者应多吃富含维生素A的食物,如豆制品、鱼、牛奶、核桃、青菜、大白菜、空心菜、西红柿及新鲜水果等。";
report.InsertText("Bookmark_text",text);
 
15.最后保存文档
report.SaveDocument(RepPath); //文档路径
 
第四步,运行程序生成文档,并查看生成的文档

希望本文所述对大家的C#程序设计有所帮助。

(0)

相关推荐

  • C# Word 类库的深入理解

    代码如下所示: 复制代码 代码如下: using System;using System.Collections.Generic;using System.Text;using Microsoft.Office.Interop.Word;using System.IO;using System.Web;using System.Data;using System.Reflection;using Microsoft.Win32;using System.Text.RegularExpressio

  • 比较全的一个C#操作word文档示例

    最近两天研究了一下如何使用VS2008(C#语言)输出Word文档.以下是几点总结: 1.非常简单. 2.开发及运行环境要求.操作系统为:WindowsXP(安装.net framework2.0)/Vista/Win7:在操作系统必须安装Word2003完全安装版.这里必须要强调是Word2003完全安装版,因为软件开发及运行都需要一个com组件:Microsoft word 11.0 Object Library.如果不是Word2003完全安装版,可以下载这个com组件,并手动的安装这个c

  • JavaScript打开word文档的实现代码(c#)

    在C#中打开word文档其实不算太难,方法也比较多. 一.C#中打开word文档方法 复制代码 代码如下: //在项目引用里添加上对Microsoft Word 11.0 object library的引用 private void button1_Click(object sender, System.EventArgs e) { //调用打开文件对话框获取要打开的文件WORD文件,RTF文件,文本文件路径名称 OpenFileDialog opd = new OpenFileDialog()

  • C#根据Word模版生成Word文件

    本文实例为大家分享了C#根据Word模版生成Word文的具体代码,供大家参考,具体内容如下 1.指定的word模版 2.生成word类 添加com Microsoft word 11.0 Object Library 引用 using System; using System.Collections.Generic; using System.Data; using System.Windows.Forms; using Word = Microsoft.Office.Interop.Word;

  • word ppt excel文档转换成pdf的C#实现代码

    复制代码 代码如下: using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Drawing;using System.Linq;using System.Text;using System.Windows.Forms; using Word = Microsoft.Office.Interop.Word;using Excel = Micro

  • C# 利用Aspose.Words.dll将 Word 转成PDF

    只要把aspose.words.dll 在bin中添加引用即可. 复制代码 代码如下: using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Drawing;using System.Text;using System.Windows.Forms;using Aspose.Words;using Aspose.Words.Saving;usi

  • 使用c#在word文档中创建表格的方法详解

    复制代码 代码如下: public string CreateWordFile()        {            string message = "";            try            {                Object Nothing = System.Reflection.Missing.Value;                string name = "xiehuan.doc";               

  • C# WORD操作实现代码

    1.先通过程序生成报表样式的HTML页面,然后修改HTML页面的后缀名为DOC. 2.定制WORD文档的模板文件,在C#中操作WORD模板,生成新的WORD文档. 第一方案简单,只需要改动文件的扩展名就行了,但是也存在了一些问题,譬如生成的WORD文档样式的丢失.这样对于客户来说可能是一个无法通过的方案.第二方案比较复杂,需要调用OFFICE的WORD组件通过C#来操作WORD,进而生成WORD.此方法类似于我们在c#中的后台拼接数据.虽然麻烦,但是能够灵活定制,只不过是操作WORD对象而已.

  • c#开发word批量转pdf源码分享

    微软Office Word本身已经提供了另存为PDF文档功能,对于少量文档,手工使用该方式进行Word转换为PDF尚可,一旦需要处理大量的文档,可能就显得有些捉襟见肘了.不过对于已经安装有Office环境,借助一些简单的代码即可实现批量Word转PDF了. 源码: 复制代码 代码如下: using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.D

  • asp.net(c#)下读取word文档的方法小结

    第一种方法: 复制代码 代码如下: Response.ClearContent(); Response.ClearHeaders(); Response.ContentType = "Application/msword"; string s=Server.MapPath("C#语言参考.doc"); Response.WriteFile("C#语言参考.doc"); Response.Write(s); Response.Flush(); Re

随机推荐