C#通过模板导出Word(文字,表格,图片) 转载 - Poison_heng

shuaiheng 2021-09-29 原文


C#通过模板导出Word(文字,表格,图片) 转载

转载地址:https://www.cnblogs.com/wuhuacong/archive/2013/02/05/2893191.html

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

一:模板的创建                               

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

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

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

二:添加项目                                 

 

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

三:调用方法                      

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

 

        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.保存文件

 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: 添加填充内容并换行 

发表于
2020-06-08 11:12 
Poison_heng 
阅读(754
评论(0
编辑 
收藏 
举报

 

版权声明:本文为shuaiheng原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/shuaiheng/p/13064515.html

C#通过模板导出Word(文字,表格,图片) 转载 - Poison_heng的更多相关文章

  1. LinuxShell之字符截取和替换命令 – rwwh

    LinuxShell之字符截取和替换命令 一 cut提取命令   cut命令的默认分割符是制表符,也就是 […]...

  2. java 多线程之取消与关闭 – monkeydai

    java 多线程之取消与关闭   要使线程安全,快速,可靠的停下来并不是一件容易的事情。java并没有提供任何 […]...

  3. Q值, 电感Q因素, 电感品质因素, Inductor Q, Quality Factor – Milton

    Q值, 电感Q因素, 电感品质因素, Inductor Q, Quality Factor Q值基本概念 Q值 […]...

  4. Excel两行交换及两列交换,快速互换相邻表格数据的方法 – gisoracle

    View Post Excel两行交换及两列交换,快速互换相邻表格数据的方法 经常使用办公软件的人可能有遇到过 […]...

  5. Docker 安装、镜像、dockerfile、容器、仓库 – 受匕图灵

    Docker 安装、镜像、dockerfile、容器、仓库 2018-05-30 21:10  受匕图灵  阅 […]...

  6. windows server 2016安装 – 拥剑公子

    windows server 2016安装 slmgr /skms kms.03k.org slmgr /at […]...

  7. java 实现JSON数据格式化 – 拿着菜刀

    java 实现JSON数据格式化 关键在于好的算法这个代码来源于网络,算法已在注释中添加。   工具地址: 链 […]...

  8. CloudGeek读源码系列-cache2go源码解析(二)

    0、写在最前面 What:《cache2go的源码解析》会分为(一)(二)两讲,内容包括整个项目的所有功能代码 […]...

随机推荐

  1. 移动登录界面参考

    1.交管12123 2.云课堂   3.  ...

  2. Red Hat Enterprise Linux ISO 全镜像下载

    1、iso网盘下载地址:https://wanghualang.pipipan.com/dir/1313365 […]...

  3. Mac如何下载软件

    1、App Store 2、软件官网 3、Mac软件网站 4、搜狗微信 个人首选App Store,里面的软件 […]...

  4. mongodb安装失败与解决方法(附安装教程)

    安装mongodb遇到的一些坑 浪费了大量的时间 在此记录一下   主要是电脑系统win10企业版自带的防火墙 […]...

  5. Nodejs实现爬虫的几种方式

    获取代理 IP// 需要安装 axios 模块 - npm install axios --saveconst axios = require('axios')// id secret 等参数是在猿人云官网提取API内获取的const...

  6. jQuery的原生替代

    jQuery的原生替代,参考自你不需要jQuery,对其进行了更清晰的总结与分类,现代游览器基本都支持(ie1 […]...

  7. 容器生态系统

    PS:欢迎大家关注我的公众号:aCloudDeveloper,专注技术分享,努力打造干货分享平台,二维码在文末 […]...

  8. iOS章结 – 知道 \12

    1 - 面向对象是 90 年代软件开发方法的主流,是一种设计思路,它已经扩展到很宽的范围,如数据库系统、交互式界面、应用结构、应用平台、分布式系统、网络管理结构、人工智能、CAD技术等领域2 - 初始化方法命名一般是以 init 开头,...

展开目录

目录导航