C#导出Word,Excel的方法有很多,这次因为公司的业务需求,需要导出内容丰富(文字,表格,图片)的报告,以前的方法不好使,所以寻找新的导出方法,在网上找到了通过模板文件导出Word的方法,记录一下过程.
一:模板的创建
通过模板导出,肯定需要先创建模板,然后顾名思义就是将模板中提前设置好的占位符,通过程序替换为想输出的内容即可;
新建word文件(必须为docx或者dotx文件),放在程序根目录下,在需要位置 插入-文档部件-域,
    
      
        域名
      
      :MacroButton
      
      
        宏名
      
      :DoFieldClick
      
      
        显示文字
      
      :这个自己设置,为了与模板其他文字区分,可以用"[]"括起来.
      
         需要多少替换内容,添加多少域即可.
    
  
    
       
    
  
二:添加项目
    
        在解决方案中添加项目WordMLHelper,在原项目中添加对WordMLHelper的引用后可以直接调用.
    
    
    
         WordMLHelper代码地址:http://url.cn/U8VNul
    
  
三:调用方法
首先确定模板文件位置和导出文件的生成路径.
      
        private
      
      
        string
      
       mubanFile = 
      
        "
      
      
        muban.docx
      
      
        "
      
      
        ;
        
      
      
        private
      
      
        string
      
       outputPath = 
      
        @"
      
      
        C:\Users\zz\Desktop\test1.docx
      
      
        "
      
      ;
    
  
1.打开模板文件,获取所有填充域
 
    
    
        
          1
        
        
          string
        
         templatePath =
        
           Path.Combine(System.AppDomain.CurrentDomain.BaseDirectory
        
        
          2
        
        
                          , mubanFile);
        
        
          3
        
                     List<TagInfo> tagInfos = wordMLHelper.GetAllTagInfo(File.OpenRead(templatePath));
      
    2.遍历所有填充域,替换填充域内容
锁定填充域的话,有两种方法,一是根据填充域的提示文字,如"[文字]",二是根据填充域的索引,如if(tagInfos[i].Seq==2),则是找到索引为2的填充域
 
    
    
        
           1
        
        
          for
        
         (
        
          int
        
         i = 
        
          0
        
        ; i < tagInfos.Count; i++
        
          )
        
        
           2
        
        
                      {
        
        
           3
        
        
          //
        
        
          填充域有两种类型,1:段落或图片,2:表格
        
        
           4
        
        
          //
        
        
          对填充域填充时需先判断填充域类型
        
        
           5
        
        
          if
        
         (tagInfos[i].Tbl == 
        
          null
        
        
          )
        
        
           6
        
        
                          {
        
        
           7
        
        
          if
        
         (
        
          string
        
        .Equals(tagInfos[i].TagTips.Trim(), 
        
          "
        
        
          [文字]
        
        
          "
        
        
          ))
        
        
           8
        
        
                              {
        
        
           9
        
                                 TxtInfo txtInfo = 
        
          new
        
        
           TxtInfo();
        
        
          10
        
                                 txtInfo.Content = 
        
          "
        
        
          已经成功替换
        
        
          "
        
        
          ;
        
        
          11
        
                                 txtInfo.ForeColor = 
        
          "
        
        
          00ff00
        
        
          "
        
        
          ;
        
        
          12
        
        
          //
        
        
          txtInfo.HightLight = HighlightColor.Blue;
        
        
          13
        
        
                                  tagInfos[i].AddContent(txtInfo);
        
        
          14
        
        
                              }
        
        
          15
        
        
          if
        
         (
        
          string
        
        .Equals(tagInfos[i].TagTips.Trim(), 
        
          "
        
        
          [图片]
        
        
          "
        
        
          ))
        
        
          16
        
        
                              {
        
        
          17
        
                                 ImgInfo imgInfo = 
        
          new
        
        
           ImgInfo();
        
        
          18
        
                                 imgInfo.ImgPath =
        
           Path.Combine(System.AppDomain.CurrentDomain.BaseDirectory
        
        
          19
        
                                     , 
        
          "
        
        
          ./image/a1.jpg
        
        
          "
        
        
          );
        
        
          20
        
                                 imgInfo.Width = 
        
          200
        
        
          ;
        
        
          21
        
                                 imgInfo.Height = 
        
          200
        
        
          ;
        
        
          22
        
        
                                  tagInfos[i].AddContent(imgInfo);
        
        
          23
        
        
                              }
        
        
          24
        
        
                          }
        
        
          25
        
        
          else
        
        
          26
        
        
                          {
        
        
          27
        
                             TableStructureInfo tblInfo =
        
           tagInfos[i].Tbl;
        
        
          28
        
        
          if
        
         (tagInfos[i].Seq==
        
          2
        
        
          )
        
        
          29
        
        
                              {
        
        
          30
        
        
          for
        
         (
        
          int
        
         j = 
        
          0
        
        ; j < 
        
          3
        
        ; j++
        
          )
        
        
          31
        
        
                                  {
        
        
          32
        
                                     RowStructureInfo row = 
        
          new
        
        
           RowStructureInfo();
        
        
          33
        
        
          34
        
        
          for
        
         (
        
          int
        
         k = 
        
          0
        
        ; k < 
        
          3
        
        ; k++
        
          )
        
        
          35
        
        
                                      {
        
        
          36
        
                                         CellStructureInfo cell = 
        
          new
        
        
           CellStructureInfo();
        
        
          37
        
                                         TxtInfo txtInfo = 
        
          new
        
        
           TxtInfo();
        
        
          38
        
                                         txtInfo.Content = 
        
          "
        
        
          第
        
        
          "
        
         + (j + 
        
          1
        
        ) + 
        
          "
        
        
          行,第
        
        
          "
        
         + (k + 
        
          1
        
        ) + 
        
          "
        
        
          列
        
        
          "
        
        
          ;
        
        
          39
        
                                         txtInfo.Size = 
        
          25
        
        
          ;
        
        
          40
        
                                         txtInfo.ForeColor = 
        
          "
        
        
          0000ff
        
        
          "
        
        
          ;
        
        
          41
        
        
                                          cell.AddContentLine(txtInfo);
        
        
          42
        
        
                                          row.AddCell(cell);
        
        
          43
        
        
                                      }
        
        
          44
        
        
                                      tblInfo.AddRow(row);
        
        
          45
        
        
                                  }
        
        
          46
        
        
                              }
        
        
          47
        
        
          48
        
        
                          }
        
        
          49
        
                     }
      
    3.保存文件
 
    
    
        
           1
        
        
          if
        
         (!
        
          string
        
        
          .IsNullOrEmpty(outputPath))
        
        
           2
        
        
                      {
        
        
           3
        
                         templatePath =
        
           Path.Combine(System.AppDomain.CurrentDomain.BaseDirectory
        
        
           4
        
        
                             , mubanFile);
        
        
           5
        
        
                          wordMLHelper.GenerateWordDocument(File.OpenRead(templatePath)
        
        
           6
        
        
                              , outputPath
        
        
           7
        
        
                              , tagInfos);
        
        
           8
        
        
           9
        
                         Assistance.RemoveAllTmpFile();
        
          //
        
        
           删除所有临时文件
        
        
          10
        
        
          //
        
        
          Response.Redirect(Request.Url.AbsoluteUri);
        
        
          11
        
                     }
      
    四:完成
调用方法很简单,随着模板的修改,可以快速生成需要格式多样内容丰富的Word文档,感谢您的阅读与评论.
五:补充
    
      
        引用WordMLHelper.dll。 
      
      
        
      
      
        1.调用WordMLHelper的GetAllTagInfo方法(只接受后缀为.docx和.dotx的模板文件路径)获取word标准模板的填充域集合List<TagInfo>; 
      
      
      
        2.填充域对象(TagInfo)的Tbl属性(类型为TblStructureInfo)表示表格单元格类型的填充域对象(默认值为null代表该填充域非表格单元格类型),可通过Tbl[rowIndex,cellIndex]的方式获取表格的单元格,并调用单元格(CellStructureInfo)的AddContent和AddContentLine(填充内容后换行)方法填充文本和图片; 
      
      
      
        3.Tbl属性的TblType变量表示该表格是仅含水平表头(HORIZONTAL_HEADER)还是含水平和垂直表头(HORIZONTAL_VERTICAL_HEADER)。 
      
      
      
        4.根据需要将文本(TxtInfo对象)、图片(ImgInfo对象)和表格(TblInfo对象)通过调用填充域(TagInfo对象)的AddContent和AddContentLine(填充内容后换行)方法填充到填充域中。 
      
      
      
        5.TxtInfo、ImgInfo和TblInfo类中含高度、宽度等样式属性。 
      
      
      
        6.若填充内容为不含样式的纯文本内容,则可通过WordMLHelper中的FillContentWithoutStyle方法将文本信息填充至填充域。 
      
      
      
        7.若要将不含样式的纯文本内容填充到表格单元格类型(仅含水平表头)的填充域,则可调用WordMLHelper中的FillContentToTable(TagInfo tagInfo, DataTable dt)。 
      
      
      
        8.若要生成不含样式的纯文本内容的表格,则可调用WordMLHelper中的FillContentToTable(TagInfo tagInfo, DataTable dt)。 
      
      
      
        9.调用WordMLHelper的GenerateWordDocument方法即可生成word文档。
      
    
  
接口
    
      
        WordMLHelper:操作模板类 
        
        方法如下: 
        
        GetAllTagInfo:获取模板填充域及附加信息 
        
        FillContentToTable:快速填充、生成纯文本表格 
        
        FillContentWithoutStyle:快速填充纯文本内容到填充域 
        
        GenerateWordDocument:根据模板生成word文档 
        
        
        TagInfo:填充域类 
        
        属性如下: 
        
        Seq:填充域的序号 
        
        TagTips:填充域的提示信息 
        
        Tbl:表格单元格填充域类型对象(默认为null,表示非表格单元格填充域类型) 
        
        
        TxtInfo:文本类型填充内容类 
        
        属性如下: 
        
        Size:字体大小 
        
        ForeColor: 字体颜色 
        
        HightLight: 背景色(高亮) 
        
        FontFamily: 字体 
        
        Content: 文本内容 
        
        
        ImgInfo:图片类型填充内容类 
        
        属性如下: 
        
        Width: 图片宽度 
        
        Height: 图片高度 
        
        ImgPath: 图片路径 
        
        
        TblInfo:表格类型填充内容类 
        
        属性如下: 
        
        Width: 表格宽度 
        
        Rows: 行集合 
        
        方法如下: 
        
        AddRow: 填充行 
        
        
        RowInfo: 表格类型填充内容的表格行类 
        
        属性如下: 
        
        Cells: 单元格 
        
        方法如下: 
        
        AddCell: 填充单元格 
        
        
        CellInfo: 表格类型填充内容的单元格类 
        
        属性如下: 
        
        Width: 单元格宽度 
        
        ColSpan: 列合并数(默认为1) 
        
        RowSpan: 行合并数(默认为1) 
        
        方法如下: 
        
        AddContent: 添加填充内容 
        
        AddContentLine: 添加填充内容并换行 
        
        
        TableStructureInfo: 表格单元格类型的填充域类 
        
        属性如下: 
        
        TblType: TblType枚举类型,表示表格是仅含水平表头还是含水平和垂直表头 
        
        Rows: 行集合 
        
        方法如下: 
        
        AddRow: 填充行 
        
        
        RowStructureInfo: 表格单元格类型的填充域的表格行类 
        
        属性如下: 
        
        Index: 该行在模板表格中的行索引(只读) 
        
        Cells: 单元格集合 
        
        方法如下: 
        
        AddCell: 添加单元格 
        
        
        CellStructureInfo: 表格单元格类型的填充域的单元格类 
        
        属性如下: 
        
        Index: wordML中的列索引(大于或等于该单元格实体在行实体中的索引值)(只读) 
        
        ColSpan: 合并列数目(默认为1,即是不合并)(只读) 
        
        RowSpan: 合并行数目(默认为1,即是不合并)(只读) 
        
        Tips: 单元格中的提示内容(只读) 
        
        IsTemplate: 该单元格是否可填写(只读) 
        
        方法如下: 
        
        AddContent: 添加填充内容 
        
        AddContentLine: 添加填充内容并换行 
      
    
  


 
     
					 
					