以前一直是用Office的组件实现Word文档导出,但是让客户在服务器安装Office,涉及到版权;而且Office安装,包括权限配置也是比较麻烦。

现在流行使用第三方组件来实现对Office的操作,有NPOI,Spire等第三方组件。开始考虑的是NPOI,毕竟它在操作Excel方面还是很强大的;但是不知道是它本身没有,还是我没找到,无法实现利用Word模板的标签插入内容,纯靠代码去生成Word文档,排版是个大问题。最终找到了Spire.Doc组件,轻松实现!

  Spire的官网地址:https://www.e-iceblue.com/

1、项目中引用 Free Spire.Doc 组件,我是直接用NuGet下载包的.

安装完后,会引用其三个组件:

2、Word 模板制作

打开Word,点击 文件->选项->自定义功能区,勾选上“开发工具”:

主要使用文本域控件,插入作为标签:

如果有需要,可以添加“下划线”,或者“字符边框”等效果:

底下三个,前2个我用的是开发工具中的复选框(窗体控件)效果不是勾选的,是×号,效果不是客户想要的,所以使用了第二种解决方案“字符边框”,最后看导出的效果:

3、代码

可重用代码:

  1. using Spire.Doc;
  2. using Spire.Doc.Documents;
  3. using Spire.Doc.Fields;
  4. using System;
  5. using System.Collections.Generic;
  6. using System.ComponentModel;
  7. using System.IO;
  8. using System.Linq;
  9. using System.Text;
  10. using System.Threading.Tasks;
  11.  
  12. namespace We.Framework.Spire
  13. {
  14. /// <summary>
  15. /// Sprie.Doc
  16. /// Designed by XIAO
  17. /// 2017-05-09
  18. /// </summary>
  19. public class WordHandler
  20. {
  21. public static bool ExportWordByFields<T>(T mod, string TempleteFilePath, string ExpFilePath)
  22. {
  23. if (mod == null)
  24. {
  25. throw new Exception("模型为空!");
  26. }
  27.  
  28. System.Reflection.PropertyInfo[] properties = mod.GetType().GetProperties(System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.Public);
  29. if (properties.Length <= )
  30. {
  31. throw new Exception("模型属性为空!");
  32. }
  33.  
  34. if (!File.Exists(TempleteFilePath))
  35. {
  36. throw new Exception("指定路径的模板文件不存在!");
  37. }
  38.  
  39. try
  40. {
  41. Document doc = new Document();
  42. doc.LoadFromFile(TempleteFilePath);
  43.  
  44. #region 替换文字
  45. //doc.Replace("海关", "海关口岸", true, true);
  46. //doc.Replace("报验", "报检", true, true);
  47. #endregion
  48.  
  49. //清除表单域阴影
  50. doc.Properties.FormFieldShading = false;
  51.  
  52. //遍历Word模板中的文本域(field.name为文本域名称)
  53. foreach (FormField field in doc.Sections[].Body.FormFields)
  54. {
  55. foreach (System.Reflection.PropertyInfo prop in properties)
  56. {
  57. string name = prop.Name; //属性名称
  58. object value = prop.GetValue(mod, null); //属性值
  59. string des = ((DescriptionAttribute)Attribute.GetCustomAttribute(prop, typeof(DescriptionAttribute))).Description;// 属性描述值
  60.  
  61. //注意:文本域名称 == 模型中属性的 Description 值 !!!!!!
  62. //也可以: 文本域名称 == 模型中属性的 Name 值 !!!!!!
  63. if (field.Name == des)
  64. {
  65. if (field.DocumentObjectType == DocumentObjectType.TextFormField) //文本域
  66. {
  67. if (prop.PropertyType.Name == "Boolean")
  68. {
  69. field.Text = "√"; //插入勾选符号
  70. break;
  71. }
  72. else
  73. {
  74. field.Text = value.ToString(); //向Word模板中插入值
  75. break;
  76. }
  77. }
  78. else if (field.DocumentObjectType == DocumentObjectType.CheckBox) //复选框
  79. {
  80. (field as CheckBoxFormField).Checked = (value as bool?).HasValue ? (value as bool?).Value : false;
  81. }
  82. }
  83. }
  84. }
  85.  
  86. doc.SaveToFile(ExpFilePath, FileFormat.Docx);
  87. doc.Close();
  88.  
  89. return true;
  90. }
  91. catch (Exception ex)
  92. {
  93. string msg = ex.Message;
  94.  
  95. return false;
  96. }
  97. }
  98. }
  99. }

测试代码部分:

  1. using System;
  2. using System.Collections.Generic;
  3. using System.ComponentModel;
  4. using System.Linq;
  5. using System.Text;
  6. using System.Threading.Tasks;
  7.  
  8. namespace WordHelper.TestModel
  9. {
  10. /// <summary>
  11. /// 抽样记录单
  12. /// </summary>
  13. public class SamplingRcd
  14. {
  15. [Description("记录单编号")]
  16. public string No { get; set; }
  17.  
  18. [Description("年")]
  19. public int Year { get; set; }
  20.  
  21. [Description("月")]
  22. public int Month { get; set; }
  23.  
  24. [Description("日")]
  25. public int Day { get; set; }
  26.  
  27. [Description("药品名称")]
  28. public string DrugName { get; set; }
  29.  
  30. [Description("商品名")]
  31. public string GoodsName { get; set; }
  32.  
  33. [Description("注册证号")]
  34. public string RegistNo { get; set; }
  35.  
  36. [Description("检验通知号")]
  37. public string NoticeNo { get; set; }
  38.  
  39. [Description("外包装是否完整")]
  40. public bool IsIntact { get; set; }
  41.  
  42. [Description("是否封固")]
  43. public bool IsFixed { get; set; }
  44.  
  45. [Description("铅封")]
  46. public bool IsPb { get; set; }
  47. }
  48. }

数据模型

  1. private void button1_Click(object sender, EventArgs e)
  2. {
  3. SamplingRcd mod = new SamplingRcd();
  4. mod.No = "No158922144";
  5. mod.Year = ;
  6. mod.Month = ;
  7. mod.Day = ;
  8. mod.DrugName = "门冬胰岛素50注射液";
  9. mod.GoodsName = "康胰素";
  10. mod.RegistNo = "R12324552";
  11. mod.NoticeNo = "N12324552";
  12. mod.IsIntact = true;
  13. mod.IsFixed = true;
  14. mod.IsPb = true;
  15.  
  16. System.IO.Directory.SetCurrentDirectory(AppDomain.CurrentDomain.BaseDirectory);
  17. string templeteFileName = @"..\..\WordTemplete\进口药品抽样记录单.docx";
  18. string newFileName = string.Format("H:\\Exp_进口药品抽样记录单_{0}.docx", DateTime.Now.ToString("yyyyMMddHHmmss"));
  19.  
  20. bool result = WordHandler.ExportWordByFields<SamplingRcd>(mod, templeteFileName, newFileName);
  21. if (result)
  22. {
  23. MessageBox.Show("成功");
  24. }
  25. else
  26. {
  27. MessageBox.Show("失败");
  28. }
  29. }

基本功能已经实现,还有待改进,希望各位提出宝贵意见!

(PS:如果有朋友知道NPOI如何实现类似功能的,望告知下!先谢谢了!^_^)

使用Spire.Doc组件利用模板导出Word文档的更多相关文章

  1. poi根据模板导出word文档

    POI结构与常用类 Apache POI是Apache软件基金会的开源项目,POI提供API给Java程序对Microsoft Office格式档案读和写的功能. .NET的开发人员则可以利用NPOI ...

  2. Struts2利用iText导出word文档(包含表格)以提供下载

    J2EE ExcelStrutsXML  在公司实习期间,带我的老师让我实现一功能——在显示课表的页面上上点击“导出文件“时能以word文档形式下载课表.将课表导出到excel里的功能他们已经实现了, ...

  3. 利用标签导出Word文档

    1 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; us ...

  4. 利用NPOI导出Word文档帮助类

    /// <summary> /// NPOI操作Word /// </summary> public class NpoiWordHelper { /// <summar ...

  5. 前台导出Word文档思路步骤总结(freemarker)

    1. 需求是导出word带表格,表格列数不变,行数由数据库的值决定: 2. 导出最开始想的是直接前端导出,使用了jquery-wordexport插件,导出后,表格边框全没了,无法使用: 3. 采用了 ...

  6. .NET通过调用Office组件导出Word文档

    .NET通过调用Office组件导出Word文档 最近做项目需要实现一个客户端下载word表格的功能,该功能是用户点击"下载表格",服务端将该用户的数据查询出来并生成数据到Word ...

  7. C#导出Word文档开源组件DocX

    1.帮助文档,这东西找了很久,而且它版本很旧,还是英文,W8.1系统上打不开 http://download.csdn.net/detail/zuofangyouyuan/7673573 2.开源网址 ...

  8. JSP利用freemarker生成基于word模板的word文档

    利用freemarker生成基于word模板的word文档 freemarker简介 FreeMarker是一个用Java语言编写的模板引擎,它基于模板来生成文本输出.FreeMarker与Web容器 ...

  9. Java 用Freemarker完美导出word文档(带图片)

    Java  用Freemarker完美导出word文档(带图片) 前言 最近在项目中,因客户要求,将页面内容(如合同协议)导出成word,在网上翻了好多,感觉太乱了,不过最后还是较好解决了这个问题. ...

随机推荐

  1. python的tkinter版本不匹配问题:RuntimeError: test:tk.h version (8.4) doesn't match libtk.a version (8.5)

    Traceback (most recent call last): File "/root/CodeWorkPace/test/TCPClient.py", line 20, i ...

  2. 海量数据集利用Minhash寻找相似的集合【推荐优化】

    MinHash 首先它是一种基于 Jaccard Index 相似度的算法,也是一种 LSH 的降维的方法,应用于大数据集的相似度检索.推荐系统.下边按我的理解介绍下MinHash 问题背景 给出N个 ...

  3. yii2发送邮件(配置QQ版本)

    1:首先在配置文件main-local.php components=>[]里面配置 'mailer' => [              'class' => 'yii\swift ...

  4. CDN内容分发网络

    CDN的全称是Content Delivery Network,即内容分发网络,其设计思想是尽可能避开互联网上有可能影响数据传输速度和稳定性的瓶颈和环节,使内容传输的更快.更稳定. CDN系统是在网络 ...

  5. 一键部署Kubernetes高可用集群

    三台master,四台node,系统版本为CentOS7 IP ROLE 172.60.0.226 master01 172.60.0.86 master02 172.60.0.106 master0 ...

  6. RDCの自我介绍

    ........................................... 大家好,这里是RUSH_D_CAT.一只ACMer,19岁的少年,From SDU,大二. Q: 1950499 ...

  7. JavaWeb总结(三)—JSP

    一.JSP简介 1.基本认识 (1)JSP页面是由HTML语句和嵌套在其中的Java代码组成的一个普通文本文件,JSP 页面的文件扩展名必须为.jsp. (2)在JSP页面中编写的Java代码需要嵌套 ...

  8. 告别S! S! H!秒杀终端工具——FastLogin快捷登录

    题记:自从接触到"跳板机"的概念后,一直就被烦不胜烦的机器名,ip地址,用户名,密码折腾的死去活来,心说能有个小精灵随时帮我输入那些重复的登录信息就好了.我见过最挫的方式就是用记事 ...

  9. 《Algorithms Unlocked》读书笔记1——循环和递归

    <Algorithms Unlocked>是 <算法导论>的合著者之一 Thomas H. Cormen 写的一本算法基础. 书中没有涉及编程语言,直接用文字描述算法,我用 J ...

  10. opencv构建高斯卷积核

    关于高斯核函数可以参见阮一峰老师的日志:高斯模糊的算法 如何使用高斯核进行高斯模糊可以参见我的另一篇日志:opencv构建自定义卷积 Mat Gaussian_kernal(int kernel_si ...