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

