文章目录

  • 先看一下导出的整体效果(如下图),其中标注的区域都是通过后台动态生成的:
  • 一、先在Word中建立好表格模板
  • 1.1、参数创建方法(Word和WPS)
    • 1.1.1、Office中Word域的创建
      • 1.1.1.1、选中指定的单元格 -> 点击头部工具栏中的”插入“ -> 选择 ”文档部件“ -> 选择 ”域“;
      • 1.1.1.2、在左侧的 “选择域” 中找到 “Mergefield” -> 在域名中填写变量名(==注:填写的域名需要和后台中定义的字段名数组中的字段一样,这样才会填充对应的数据==);
    • 1.1.2、Office中WPS域的创建
      • 1.1.2.1、选中指定的单元格 -> 点击头部工具栏中的”插入“ -> 选择 ”文档部件“ -> 选择 ”域“;
      • 1.1.2.2、在左侧的 “选择域” 中找到 “邮件合并” -> 在域代码填写变量名:例如:(MERGEFIELD Textdwmc)(==注:填写的域名需要和后台中定义的字段名数组中的字段一样,这样才会填充对应的数据==);
  • 二、添加相关的DLL文件
    • 2.1、添加相关的DLL文件
      • 2.1.1、右键项目->管理NuGet程序包
      • 2.1.2、在 管理NuGet程序包 中的浏览搜索:Aspose.Words(==注:一定选择21.8.0版本,这个版本能去水印,其余高版本我暂没试过( ̄▽ ̄)~*==)点击安装即可!
  • 三、编写代码(后台.NET 代码以VS 2019为例)
    • 3.1、定义公共的字段(==注:定义的数组字段要和Word模板中的域名相同==)
    • 3.2、Word模板操作核心方法
    • 3.3、通过Word模板生成新文件
    • 3.4、调用方法
    • 3.5、.NET 文件下载
      • 3.5.1、ASP.NET 文件下载
      • 3.5.2、ASP.NET MVC 的下载方法

先看一下导出的整体效果(如下图),其中标注的区域都是通过后台动态生成的:

一、先在Word中建立好表格模板

1.1、参数创建方法(Word和WPS)

1.1.1、Office中Word域的创建

1.1.1.1、选中指定的单元格 -> 点击头部工具栏中的”插入“ -> 选择 ”文档部件“ -> 选择 ”域“;

1.1.1.2、在左侧的 “选择域” 中找到 “Mergefield” -> 在域名中填写变量名(注:填写的域名需要和后台中定义的字段名数组中的字段一样,这样才会填充对应的数据);


自此,Word表格模板已创建完成!

1.1.2、Office中WPS域的创建

1.1.2.1、选中指定的单元格 -> 点击头部工具栏中的”插入“ -> 选择 ”文档部件“ -> 选择 ”域“;

1.1.2.2、在左侧的 “选择域” 中找到 “邮件合并” -> 在域代码填写变量名:例如:(MERGEFIELD Textdwmc)(注:填写的域名需要和后台中定义的字段名数组中的字段一样,这样才会填充对应的数据);


自此,WPS中Word表格模板已创建完成!

二、添加相关的DLL文件

这里的前提,你需要引用Aspose.Words.dll文件:using Aspose.Words;

2.1、添加相关的DLL文件

2.1.1、右键项目->管理NuGet程序包

2.1.2、在 管理NuGet程序包 中的浏览搜索:Aspose.Words(注:一定选择21.8.0版本,这个版本能去水印,其余高版本我暂没试过( ̄▽ ̄)~*)点击安装即可!


自此,Aspose.Words就安装成功!或者直接从网上下载指定的版本即可

三、编写代码(后台.NET 代码以VS 2019为例)

3.1、定义公共的字段(注:定义的数组字段要和Word模板中的域名相同)

/// <summary>
/// 公共字段名字符串数组
/// </summary>
public static String[] fieldNames = new String[] { "Textdwmc", "Textdwdz", "Textfrdb", "Texthyxm", "Textmz", "Radioxb", "Textsfz", "Textdp", "Textlxdh", "Textwhcd", "Textgryx", "Texthyxz", "Textqyrs", "Textjxdz", "droprhxz", "Textrhsq", "Radiostate" };/// <summary>
/// 文件名
/// </summary>
public static fileName="";

3.2、Word模板操作核心方法

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Web;
using System.IO;
//这里的前提,你需要引用Aspose.Words.dll文件
using Aspose.Words;
using System.Data;namespace AsposeWord//类名,可根据实际情况而定
{/// <summary>/// 通过WORD模板导出文档/// </summary>public class WordModelEvent{/// <summary>/// 根据Word模板进行数据的导出Word操作/// </summary>/// <param name="modelDoc">模板路径</param>/// <param name="exptDoc">导出文件名</param>/// <param name="fieldNames">字段名字符串数组</param>/// <param name="fieldValues">字段值数组</param>/// <param name="dt">需要循环的数据DataTable</param>/// <returns>返回的文档路径</returns>public static string ExpertWordToModel(string modelDoc, string exptDoc, String[] fieldNames, Object[] fieldValues, DataTable dt){try{removeWatermark();//加载监听,用于去除水印//string tempPath = HttpContext.Current.Server.MapPath("~/Demos/" + modelDoc + ".docx");//word模板路径string tempPath = "../" + modelDoc + ".docx";//导出的WORD存放的位置const string saveFold = "../word/";//string outputPath = HttpContext.Current.Server.MapPath("~/" + saveFold);string outputPath = "" + saveFold;if (!Directory.Exists(outputPath)){Directory.CreateDirectory(outputPath);}//生成的WORD文件名string fileName = exptDoc + "信息.docx";outputPath += fileName;//载入模板Document doc = new Document(tempPath);doc.MailMerge.Execute(fieldNames, fieldValues);//将我们获得的DataTable类型的数据:EduDataTable放入doc方法中做处理if (dt.Rows.Count > 0){doc.MailMerge.ExecuteWithRegions(dt);}//获取下载地址String StrVisitURL = saveFold + fileName;//合并模版,相当于页面的渲染doc.MailMerge.Execute(new[] { "PageCount" }, new object[] { doc.PageCount });//保存合并后的文档doc.Save(outputPath);return StrVisitURL;}catch (Exception er){return er.Message;}}/// <summary>/// 加载监听,用于去除水印/// </summary>public static void removeWatermark(){new Aspose.Words.License().SetLicense(new MemoryStream(Convert.FromBase64String("PExpY2Vuc2U+CiAgPERhdGE+CiAgICA8TGljZW5zZWRUbz5TdXpob3UgQXVuYm94IFNvZnR3YXJlIENvLiwgTHRkLjwvTGljZW5zZWRUbz4KICAgIDxFbWFpbFRvPnNhbGVzQGF1bnRlYy5jb208L0VtYWlsVG8+CiAgICA8TGljZW5zZVR5cGU+RGV2ZWxvcGVyIE9FTTwvTGljZW5zZVR5cGU+CiAgICA8TGljZW5zZU5vdGU+TGltaXRlZCB0byAxIGRldmVsb3BlciwgdW5saW1pdGVkIHBoeXNpY2FsIGxvY2F0aW9uczwvTGljZW5zZU5vdGU+CiAgICA8T3JkZXJJRD4yMDA2MDIwMTI2MzM8L09yZGVySUQ+CiAgICA8VXNlcklEPjEzNDk3NjAwNjwvVXNlcklEPgogICAgPE9FTT5UaGlzIGlzIGEgcmVkaXN0cmlidXRhYmxlIGxpY2Vuc2U8L09FTT4KICAgIDxQcm9kdWN0cz4KICAgICAgPFByb2R1Y3Q+QXNwb3NlLlRvdGFsIGZvciAuTkVUPC9Qcm9kdWN0PgogICAgPC9Qcm9kdWN0cz4KICAgIDxFZGl0aW9uVHlwZT5FbnRlcnByaXNlPC9FZGl0aW9uVHlwZT4KICAgIDxTZXJpYWxOdW1iZXI+OTM2ZTVmZDEtODY2Mi00YWJmLTk1YmQtYzhkYzBmNTNhZmE2PC9TZXJpYWxOdW1iZXI+CiAgICA8U3Vic2NyaXB0aW9uRXhwaXJ5PjIwMjEwODI3PC9TdWJzY3JpcHRpb25FeHBpcnk+CiAgICA8TGljZW5zZVZlcnNpb24+My4wPC9MaWNlbnNlVmVyc2lvbj4KICAgIDxMaWNlbnNlSW5zdHJ1Y3Rpb25zPmh0dHBzOi8vcHVyY2hhc2UuYXNwb3NlLmNvbS9wb2xpY2llcy91c2UtbGljZW5zZTwvTGljZW5zZUluc3RydWN0aW9ucz4KICA8L0RhdGE+CiAgPFNpZ25hdHVyZT5wSkpjQndRdnYxV1NxZ1kyOHFJYUFKSysvTFFVWWRrQ2x5THE2RUNLU0xDQ3dMNkEwMkJFTnh5L3JzQ1V3UExXbjV2bTl0TDRQRXE1aFAzY2s0WnhEejFiK1JIWTBuQkh1SEhBY01TL1BSeEJES0NGbWg1QVFZRTlrT0FxSzM5NVBSWmJRSGowOUNGTElVUzBMdnRmVkp5cUhjblJvU3dPQnVqT1oyeDc4WFE9PC9TaWduYXR1cmU+CjwvTGljZW5zZT4=")));}}
}

3.3、通过Word模板生成新文件

/// <summary>/// 根据WORD模板基本信息/// </summary>/// <param name="id">需要循环的子数据的所属上级ID</param>/// <returns>返回完成的文件下载路径</returns>public static string GetWordEvent(string id){try{memberUnit member = new memberUnit();member.id = "202204291157458529";member.Textdwmc = "长沙杰术有限公司";member.Textdwdz = "湖南省长";member.Textfrdb =null;member.Texthyxm = "gows";member.Textmz = "汉";member.Radioxb = "男";member.Textsfz = "4302685556951366";member.Textdp = "党员";member.Textlxdh = "175125956569";member.Textwhcd = "高中";member.Textgryx = "1051485780@qq.com";member.Texthyxz = "wu";member.Textqyrs = "1444";member.Textjxdz = "湖南啊";member.droprhxz = "副会长";member.Textrhsq = "呃呃呃呃呃呃呃呃呃呃";member.Radiostate = "已处理";Object[] fieldValues = new object[fieldNames.Length];fieldValues[0] = member.Textdwmc;fieldValues[1] = member.Textdwdz;fieldValues[2] = member.Textfrdb;fieldValues[3] = member.Texthyxm;fieldValues[4] = member.Textmz;fieldValues[5] = member.Radioxb;fieldValues[6] = member.Textsfz;fieldValues[7] = member.Textdp;fieldValues[8] = member.Textlxdh;fieldValues[9] = member.Textwhcd;fieldValues[10] = member.Textgryx;fieldValues[11] = member.Texthyxz;fieldValues[12] = member.Textqyrs;fieldValues[13] = member.Textjxdz;fieldValues[14] = member.droprhxz;fieldValues[15] = member.Textrhsq;fieldValues[16] = member.Radiostate;DataTable dt = new DataTable();if (!string.IsNullOrEmpty(id)){string sql = " SELECT * FROM TABLE WHERE id='' ORDER BY id DESC ";dt = getDataTable(sql);//这里的UserList很关键,要与WORD模板的域设置对应,不是随便写的,后面还会用到dt.TableName = "UserList";}string StrVisitURL = WordModelEvent.ExpertWordToModel("template", member.Textdwmc, fieldNames, fieldValues, dt);dt.Dispose();return StrVisitURL;}catch (Exception er){return er.Message;}}/// <summary>/// 通过SQL获得 DataTable/// </summary>/// <param name="sql">sql查询语句</param>/// <param name="ConnectionString">你的数据链接字符串</param>/// <returns></returns>private static DataTable getDataTable(string sql, string ConnectionString = ""){SqlConnection cn = new SqlConnection(ConnectionString);SqlDataAdapter da = new SqlDataAdapter(sql, cn);DataTable ds = new DataTable();da.Fill(ds);cn.Dispose();return ds;}

3.4、调用方法

string url=  GetWordEvent("");

3.5、.NET 文件下载

3.5.1、ASP.NET 文件下载

/// <summary>///字符流下载方法/// </summary>/// <param name="fileName">下载文件生成的名称</param>/// <param name="fPath">下载文件路径</param>/// <returns></returns>public void DownloadFile(string fileName, string fPath){string filePath = Server.MapPath(fPath);//路径//以字符流的形式下载文件FileStream fs = new FileStream(filePath, FileMode.Open);byte[] bytes = new byte[(int)fs.Length];fs.Read(bytes, 0, bytes.Length);fs.Close();Response.ContentType = "application/octet-stream";//通知浏览器下载文件而不是打开Response.AddHeader("Content-Disposition", "attachment;   filename=" + HttpUtility.UrlEncode(fileName, System.Text.Encoding.UTF8));Response.BinaryWrite(bytes);Response.Flush();if (!string.IsNullOrEmpty(filePath)&& filePath!="."){System.IO.File.Delete(filePath+"/"+fileName);//在文件下载之后删除其生成的文件}Response.End();}

3.5.2、ASP.NET MVC 的下载方法

/// <summary>/// 下载文件的方法/// </summary>/// <param name="path">文件绝对路径</param>/// <param name="fileName">客户端接收的文件名</param>/// <returns></returns>public static HttpResponseMessage Download(string path, string fileName){var stream = File.OpenRead(path);HttpResponseMessage httpResponseMessage = new HttpResponseMessage(HttpStatusCode.OK);try{httpResponseMessage.Content = new StreamContent(stream);httpResponseMessage.Content.Headers.ContentType = new MediaTypeHeaderValue("application/octet-stream");if (!string.IsNullOrEmpty(fileName)){httpResponseMessage.Content.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment"){FileName = HttpUtility.UrlEncode(fileName, Encoding.UTF8),};}if (!string.IsNullOrEmpty(filePath)&& filePath!="."){System.IO.File.Delete(filePath+"/"+fileName);//在文件下载之后删除其生成的文件}return httpResponseMessage;}catch{stream.Dispose();httpResponseMessage.Dispose();throw;}}

.NET 通过Word模板,使用AsposeWord进行数据动态导出Word相关推荐

  1. java word模板替换多行_Java动态替换word模板的最佳实践

    poi-tl 基于word的模板渲染(替换)组件 对docx格式的文档增加模板语法,增加渲染模板的方便性,目前支持对段落.页眉.页脚.表格的文本.图片.表单渲染. 对于word模板替换,我们不仅要考虑 ...

  2. POI使用word模板文件循环输出行并导出word

    说明 最近工作被临时安排了一个给同事们报销的差事,要知道报销这个事情对于一个开发人员是真的麻烦透顶,数目金额等等都要核对....想我一个根正苗红的正宗java开发工程师,是万万忍受不了让我一个个的填写 ...

  3. java向Word模板中替换书签数据,插入图片,插入复选框,插入Word中表格的行数据,删除表格行数据

    java向Word模板中替换书签数据,插入图片,插入复选框,插入Word中表格的行数据,删除表格行数据 使用插件:spire.doc 创建工具类,上代码: import com.spire.doc.D ...

  4. python套用word模板_如何使用Python批量创建Word模板

    如何使用 Python 批量创建 Word 模板 在日常工作中我们经常需要重复性地将同一份内容的 Word 文档资料发送 给多个不同客户, 此时 Word 文档内容可能只有客户署名不同. 或者只有部分 ...

  5. 【PHPWord】基于Word模板替换生成输出表格动态生成内容、合并单元格、设置单元格背景颜色

    文章目录 一.前言 二.业务需求 三.功能实现 1.处理数据 2.Word模板 3.输出动态数据 四.完整代码和模板 1.Word模板 2.完整代码 五.总结 一.前言 在之前的文章中,我们做了直接生 ...

  6. nodejs 根据excel表格和word模板,生成对应的多份word模板

    一.效果 二. 需求 根据表格中的开票名称的金额,生成对应的单位对账函,然后发给各单位的负责人进行审核.由于word模板样式一致,故可用模板填充数据,进行企业对账函的一次性生成 三.前端vue技术 前 ...

  7. Aspose.Words使用word模板中的书签插入图片(导出含有图片的word)

    核心代码为: protected void Button2_Click(object sender, EventArgs e){string templatePath = HttpContext.Cu ...

  8. Java动态导出word文档内容及图片

    前言 最近公司在做一个工业柔性产线管控,项目中有一个需求要将工序中流程图及流程图中的子流程及工步相关信息导入到表格中(因为流程图下的子流程图有无及数量未知,所以最好的办法就是使用动态导入):因为以前更 ...

  9. java poi 动态导出word表格带合并效果

    1.引入word导出所需依赖包 工作常用的excel,word导出,需要引入下面的6个主要包,和主要包依赖的其他包 ,可以看下面的表格进行依赖下载引入 这下面的两张图是主要包对应涉及到功能,可以按需要 ...

  10. java 动态导出word文档 文档合并分页,浏览器下载,生成,动态表格,加图片

    1.官方文档 Poi-tl Documentation word 模板 准备 .docx 文件 再准备一张图片 一起放到项目的resources目录下 impl层 第一个word文档,第二第三个与第一 ...

最新文章

  1. 全球16家超级独角兽公司,为什么中国能占7家,印度只有1家?未来哪些行业最可能诞生独角兽?
  2. 使用脑电图慢皮层电位重建3D空间中的手,肘和肩的实际和想象的轨迹
  3. ckeditor_3.6.6.2+CKFinder2.0.2配置
  4. cisco router修改mac
  5. Ubuntu 14.04 安装flash插件;安装Cairo-Dock; 美化为Mac
  6. AGC023F - 01 on Tree
  7. 性能测试中脚本怎么写_脚本在流程中的性能影响
  8. 收获,不止SQL优化——抓住SQL的本质--第三章
  9. python情感词典计算得分_基于情感词典的情感打分
  10. socket.io实现客户端和服务端的双向通信
  11. FFmpeg合并多个ts视频文件
  12. 国科大-模式识别与机器学习(计算机科学与技术学院)-习题解答参考
  13. 薄板样条插值(Thin Plate Spline)
  14. oracle容灾是什么意思,谈谈容灾
  15. WIN7电脑语言栏不见了---解决方案
  16. java 快速导出源代码工具 申请软件著作权
  17. 情人节程序员用HTML网页表白【嫦娥奔月(满屏泡泡)】 HTML5七夕情人节表白网页源码 HTML+CSS+JavaScript
  18. javascript html 去除,javascript去除html标签
  19. 中海达ihand30手簿详细教程_中海达iHand30 手簿使用说明书
  20. 使用PMM图形化监控MySQL MGR动态

热门文章

  1. 笔记本WIFI无法上网(无Internet访问权限)
  2. 一部手机最长能用几年?
  3. 重要不紧急紧急不重要
  4. arcgis利用切片服务导出离线地图包(tpk文件)
  5. 雅思备考-口语词组积累-第一章
  6. 教你如何做好移动支付行业
  7. 运行npm install 出现thon Python is not set from command line or npm configuration解决方案
  8. 无线 WIFI 的13个信道频率范围
  9. python和javaweb开发哪个更火_python和Java哪个更适合web开发?
  10. Gflops是什么?