转载地址:https://www.cnblogs.com/wuhuacong/archive/2013/02/05/2893191.htmlhtml
C#导出Word,Excel的方法有不少,此次由于公司的业务需求,须要导出内容丰富(文字,表格,图片)的报告,之前的方法很差使,因此寻找新的导出方法,在网上找到了经过模板文件导出Word的方法,记录一下过程.ide
一:模板的建立 字体
经过模板导出,确定须要先建立模板,而后顾名思义就是将模板中提早设置好的占位符,经过程序替换为想输出的内容便可;spa
新建word文件(必须为docx或者dotx文件),放在程序根目录下,在须要位置 插入-文档部件-域,3d
域名:MacroButton
宏名:DoFieldClick
显示文字:这个本身设置,为了与模板其余文字区分,能够用"[]"括起来.
须要多少替换内容,添加多少域便可.code
二:添加项目 htm
在解决方案中添加项目WordMLHelper,在原项目中添加对WordMLHelper的引用后能够直接调用.
WordMLHelper代码下载
对象
三:调用方法 blog
首先肯定模板文件位置和导出文件的生成路径.索引
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.保存文件
四:完成
调用方法很简单,随着模板的修改,能够快速生成须要格式多样内容丰富的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: 添加填充内容并换行