翼度科技»论坛 编程开发 .net 查看内容

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

6

主题

6

帖子

18

积分

新手上路

Rank: 1

积分
18
@
目录

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


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


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

1.1.1、Office中Word域的创建

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


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


1.1.1.3、列表创建域

有列表区域的;需要进行循环插入。循环生成区域插入:输入开始标识:TableStart:UserList,这里的 UserList 要与 dt.TableName = "UserList"对应,这样DataTable中的数据才会对应填充到表格中。

再输入其他DataTable中的字段。

最后记得同样输入一个结束标识:《《TableEnd:UserList》》《《最后的列名》》,把下方多余的行删除,在WORD模板生成时,会自动向下填充的。
自此,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模板中的域名相同)
  1. /// <summary>
  2. /// 公共字段名字符串数组
  3. /// </summary>
  4. public static String[] fieldNames = new String[] { "Textdwmc", "Textdwdz", "Textfrdb", "Texthyxm", "Textmz", "Radioxb", "Textsfz", "Textdp", "Textlxdh", "Textwhcd", "Textgryx", "Texthyxz", "Textqyrs", "Textjxdz", "droprhxz", "Textrhsq", "Radiostate" };
  5. /// <summary>
  6. /// 文件名
  7. /// </summary>
  8. public static fileName="";
复制代码
3.2、Word模板操作核心方法
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Threading.Tasks;
  6. using System.Web;
  7. using System.IO;
  8. //这里的前提,你需要引用Aspose.Words.dll文件
  9. using Aspose.Words;
  10. using System.Data;
  11. namespace AsposeWord//类名,可根据实际情况而定
  12. {
  13.     /// <summary>
  14.     /// 通过WORD模板导出文档
  15.     /// </summary>
  16.     public class WordModelEvent
  17.     {
  18.         /// <summary>
  19.         /// 根据Word模板进行数据的导出Word操作
  20.         /// </summary>
  21.         /// <param name="modelDoc">模板路径</param>
  22.         /// <param name="exptDoc">导出文件名</param>
  23.         /// <param name="fieldNames">字段名字符串数组</param>
  24.         /// <param name="fieldValues">字段值数组</param>
  25.         /// <param name="dt">需要循环的数据DataTable</param>
  26.         /// <returns>返回的文档路径</returns>
  27.         public static string ExpertWordToModel(string modelDoc, string exptDoc, String[] fieldNames, Object[] fieldValues, DataTable dt)
  28.         {
  29.             try
  30.             {
  31.                 removeWatermark();//加载监听,用于去除水印
  32.                 //string tempPath = HttpContext.Current.Server.MapPath("~/Demos/" + modelDoc + ".docx");//word模板路径
  33.                 string tempPath = "../" + modelDoc + ".docx";
  34.                 //导出的WORD存放的位置
  35.                 const string saveFold = "../word/";
  36.                 //string outputPath = HttpContext.Current.Server.MapPath("~/" + saveFold);
  37.                 string outputPath = "" + saveFold;
  38.                 if (!Directory.Exists(outputPath))
  39.                 {
  40.                     Directory.CreateDirectory(outputPath);
  41.                 }
  42.                 //生成的WORD文件名
  43.                 string fileName = exptDoc + "信息.docx";
  44.                 outputPath += fileName;
  45.                 //载入模板
  46.                 Document doc = new Document(tempPath);
  47.                 doc.MailMerge.Execute(fieldNames, fieldValues);
  48.                 //将我们获得的DataTable类型的数据:EduDataTable放入doc方法中做处理
  49.                 if (dt.Rows.Count > 0 && dt!=null)
  50.                 {
  51.                     doc.MailMerge.ExecuteWithRegions(dt);
  52.                 }
  53.                 //获取下载地址
  54.                 String StrVisitURL = saveFold + fileName;
  55.                 //合并模版,相当于页面的渲染
  56.                 doc.MailMerge.Execute(new[] { "PageCount" }, new object[] { doc.PageCount });
  57.                 //保存合并后的文档
  58.                 doc.Save(outputPath);
  59.                 return StrVisitURL;
  60.             }
  61.             catch (Exception er)
  62.             {
  63.                 return er.Message;
  64.             }
  65.         }
  66.         /// <summary>
  67.         /// 加载监听,用于去除水印
  68.         /// </summary>
  69.         public static void removeWatermark()
  70.         {
  71.             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=")));
  72.         }
  73.     }
  74. }
复制代码
3.3、通过Word模板生成新文件
  1. /// <summary>
  2.         /// 根据WORD模板基本信息
  3.         /// </summary>
  4.         /// <param name="id">需要循环的子数据的所属上级ID</param>
  5.         /// <returns>返回完成的文件下载路径</returns>
  6.         public static string GetWordEvent(string id)
  7.         {
  8.             try
  9.             {
  10.             //这里是实例化Model,如果项目已有封装的查询数据库信息的方法,直接使用参数“id”进行动态数据查询即可
  11.                 memberUnit member = new memberUnit();
  12.                 member.id = "202204291157458529";
  13.                 member.Textdwmc = "长沙杰术有限公司";
  14.                 member.Textdwdz = "湖南省长";
  15.                 member.Textfrdb =null;
  16.                 member.Texthyxm = "gows";
  17.                 member.Textmz = "汉";
  18.                 member.Radioxb = "男";
  19.                 member.Textsfz = "4302685556951366";
  20.                 member.Textdp = "党员";
  21.                 member.Textlxdh = "175125956569";
  22.                 member.Textwhcd = "高中";
  23.                 member.Textgryx = "1051485780@qq.com";
  24.                 member.Texthyxz = "wu";
  25.                 member.Textqyrs = "1444";
  26.                 member.Textjxdz = "湖南啊";
  27.                 member.droprhxz = "副会长";
  28.                 member.Textrhsq = "呃呃呃呃呃呃呃呃呃呃";
  29.                 member.Radiostate = "已处理";
  30.                 Object[] fieldValues = new object[fieldNames.Length];
  31.                 fieldValues[0] = member.Textdwmc;
  32.                 fieldValues[1] = member.Textdwdz;
  33.                 fieldValues[2] = member.Textfrdb;
  34.                 fieldValues[3] = member.Texthyxm;
  35.                 fieldValues[4] = member.Textmz;
  36.                 fieldValues[5] = member.Radioxb;
  37.                 fieldValues[6] = member.Textsfz;
  38.                 fieldValues[7] = member.Textdp;
  39.                 fieldValues[8] = member.Textlxdh;
  40.                 fieldValues[9] = member.Textwhcd;
  41.                 fieldValues[10] = member.Textgryx;
  42.                 fieldValues[11] = member.Texthyxz;
  43.                 fieldValues[12] = member.Textqyrs;
  44.                 fieldValues[13] = member.Textjxdz;
  45.                 fieldValues[14] = member.droprhxz;
  46.                 fieldValues[15] = member.Textrhsq;
  47.                 fieldValues[16] = member.Radiostate;
  48.                 DataTable dt = new DataTable();
  49.                
  50.                     #region /// 注意:如果在Word中没有类似表格或者列表的数据,此处则不需要,删除即可
  51.                 if (!string.IsNullOrEmpty(id))
  52.                 {
  53.                     string sql = " SELECT * FROM TABLE WHERE id='' ORDER BY id DESC ";
  54.                     dt = getDataTable(sql);
  55.                     //这里的UserList很关键,要与WORD模板的域设置对应,不是随便写的,后面还会用到
  56.                     dt.TableName = "UserList";
  57.                 }
  58.                     #endregion
  59.                    
  60.                 string StrVisitURL = WordModelEvent.ExpertWordToModel("template", member.Textdwmc, fieldNames, fieldValues, dt);
  61.                 dt.Dispose();
  62.                 return StrVisitURL;
  63.             }
  64.             catch (Exception er)
  65.             {
  66.                 return er.Message;
  67.             }
  68.         }
  69.         /// <summary>
  70.         /// 通过SQL获得 DataTable
  71.         /// </summary>
  72.         /// <param name="sql">sql查询语句</param>
  73.         /// <param name="ConnectionString">你的数据链接字符串</param>
  74.         /// <returns></returns>
  75.         private static DataTable getDataTable(string sql, string ConnectionString = "")
  76.         {
  77.             SqlConnection cn = new SqlConnection(ConnectionString);
  78.             SqlDataAdapter da = new SqlDataAdapter(sql, cn);
  79.             DataTable ds = new DataTable();
  80.             da.Fill(ds);
  81.             cn.Dispose();
  82.             return ds;
  83.         }
复制代码
3.4、调用方法
  1. string url=  GetWordEvent("");
复制代码
3.5、.NET 文件下载

3.5.1、ASP.NET 文件下载
  1. /// <summary>
  2.        ///字符流下载方法
  3.        /// </summary>
  4.        /// <param name="fileName">下载文件生成的名称</param>
  5.        /// <param name="fPath">下载文件路径</param>
  6.        /// <returns></returns>
  7.         public void DownloadFile(string fileName, string fPath)
  8.         {
  9.             string filePath = Server.MapPath(fPath);//路径
  10.             //以字符流的形式下载文件
  11.             FileStream fs = new FileStream(filePath, FileMode.Open);
  12.             byte[] bytes = new byte[(int)fs.Length];
  13.             fs.Read(bytes, 0, bytes.Length);
  14.             fs.Close();
  15.             Response.ContentType = "application/octet-stream";
  16.             //通知浏览器下载文件而不是打开
  17.             Response.AddHeader("Content-Disposition", "attachment;   filename=" + HttpUtility.UrlEncode(fileName, System.Text.Encoding.UTF8));
  18.             Response.BinaryWrite(bytes);
  19.             Response.Flush();
  20.             if (!string.IsNullOrEmpty(filePath)&& filePath!=".")
  21.             {
  22.                System.IO.File.Delete(filePath+"/"+fileName);//在文件下载之后删除其生成的文件
  23.             }
  24.             Response.End();
  25.         }
复制代码
3.5.2、ASP.NET MVC 的下载方法
  1. /// <summary>
  2.         /// 下载文件的方法
  3.         /// </summary>
  4.         /// <param name="path">文件绝对路径</param>
  5.         /// <param name="fileName">客户端接收的文件名</param>
  6.         /// <returns></returns>
  7.         public static HttpResponseMessage Download(string path, string fileName)
  8.         {
  9.             var stream = File.OpenRead(path);
  10.             HttpResponseMessage httpResponseMessage = new HttpResponseMessage(HttpStatusCode.OK);
  11.             try
  12.             {
  13.                 httpResponseMessage.Content = new StreamContent(stream);
  14.                 httpResponseMessage.Content.Headers.ContentType = new MediaTypeHeaderValue("application/octet-stream");
  15.                 if (!string.IsNullOrEmpty(fileName))
  16.                 {
  17.                     httpResponseMessage.Content.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment")
  18.                     {
  19.                         FileName = HttpUtility.UrlEncode(fileName, Encoding.UTF8),
  20.                     };
  21.                 }
  22.                 if (!string.IsNullOrEmpty(filePath)&& filePath!=".")
  23.                 {
  24.                    System.IO.File.Delete(filePath+"/"+fileName);//在文件下载之后删除其生成的文件
  25.                 }
  26.                 return httpResponseMessage;
  27.             }
  28.             catch
  29.             {
  30.                 stream.Dispose();
  31.                 httpResponseMessage.Dispose();
  32.                 throw;
  33.             }
  34.         }
复制代码
来源:https://www.cnblogs.com/lucasDC/archive/2023/03/25/17255910.html
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x

举报 回复 使用道具