欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2023-12-16 22:50:52
本文实例讲述了c#实现通过模板自动创建word文档的方法,是非常实用的技巧。分享给大家供大家参考。具体实现方法如下: 引言:前段时间有项目要用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#程序设计有所帮助。

上一篇:

下一篇: