zoukankan      html  css  js  c++  java
  • C#通过模板导出Word(文字,表格,图片)

      C#导出Word,Excel的方法有很多,这次因为公司的业务需求,需要导出内容丰富(文字,表格,图片)的报告,以前的方法不好使,所以寻找新的导出方法,在网上找到了通过模板文件导出Word的方法,记录一下过程.

    一:模板的创建                               

      通过模板导出,肯定需要先创建模板,然后顾名思义就是将模板中提前设置好的占位符,通过程序替换为想输出的内容即可;

      新建word文件(必须为docx或者dotx文件),放在程序根目录下,在需要位置 插入-文档部件-域,

      域名:MacroButton
      宏名:DoFieldClick
      显示文字:这个自己设置,为了与模板其他文字区分,可以用"[]"括起来.
      需要多少替换内容,添加多少域即可.

    二:添加项目                                 

      在解决方案中添加项目WordMLHelper,在原项目中添加对WordMLHelper的引用后可以直接调用.
      WordMLHelper代码下载

    三:调用方法                      

      首先确定模板文件位置和导出文件的生成路径.

            private string mubanFile = "muban.docx";
            private string outputPath = @"C:UserszzDesktop	est1.docx";

      1.打开模板文件,获取所有填充域

    1 string templatePath = Path.Combine(System.AppDomain.CurrentDomain.BaseDirectory
    2                 , mubanFile);
    3             List<TagInfo> tagInfos = wordMLHelper.GetAllTagInfo(File.OpenRead(templatePath));
    View Code

      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             }
    View Code

      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             }
    View Code

    四:完成                                        

      调用方法很简单,随着模板的修改,可以快速生成需要格式多样内容丰富的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: 添加填充内容并换行 

  • 相关阅读:
    【转】VC 线程间通信的三种方式
    【转】MFC对话框和控件
    美国政府、部门构成及其运作
    贝叶斯推理(Bayes Reasoning)、独立与因式分解
    贝叶斯推理(Bayes Reasoning)、独立与因式分解
    机器学习:利用卷积神经网络实现图像风格迁移 (三)
    TBB、OpenCV混合编程
    VS编译环境中TBB配置和C++中lambda表达式
    概率图模型(PGM) —— 贝叶斯网络(Bayesian Network)
    概率图模型(PGM) —— 贝叶斯网络(Bayesian Network)
  • 原文地址:https://www.cnblogs.com/ilefei/p/3508463.html
Copyright © 2011-2022 走看看