使用Spire.Doc组件利用模板导出Word文档

以前一直是用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 <= 0)
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[0].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         private void button1_Click(object sender, EventArgs e)
2 {
3 SamplingRcd mod = new SamplingRcd();
4 mod.No = "No158922144";
5 mod.Year = 2017;
6 mod.Month = 5;
7 mod.Day = 8;
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组件的更多相关文章

  1. Spire.Doc组件读取与写入Word

    之前写了一篇开源组件DocX读写word的文章,当时时间比较匆忙选了这个组件,使用过程中还是有些不便,不能提前定义好模版,插入Form表单域进行替换.最近无意中发现Spire.Doc组件功能很强大,目 ...

  2. 使用Spire.Doc组件利用模板导出Word文档

    以前一直是用Office的组件实现Word文档导出,但是让客户在服务器安装Office,涉及到版权:而且Office安装,包括权限配置也是比较麻烦. 现在流行使用第三方组件来实现对Office的操作, ...

  3. 使用Spire.Doc来转换文本

    使用Spire.Doc来转换文本 前段时间,我为不熟悉这个产品的读者们写了一篇关于我对 Spire.Doc的初识印象.Spire.Doc是一个专业的Word .NET库,它是专门为开发人员设计的用来快 ...

  4. Spire.Doc 生成pdf业务运营报告

    需求:每天向全国各运营大区钉钉运营群定时发送pdf业务运营报告: 通过对各Office操作组件对比,选择Spire.Doc.它专门为开发人员进行创建,读取,写入.转换打印 word 文档文件提供便利, ...

  5. [.NET] 开头不讲"Hello Word",读尽诗书也枉然 : Word 操作组件介绍 - Spire.Doc

    开头不讲"Hello Word",读尽诗书也枉然 : Word 操作组件介绍 - Spire.Doc [博主]反骨仔 [原文地址]http://www.cnblogs.com/li ...

  6. 开头不讲"Hello Word",读尽诗书也枉然 : Word 操作组件介绍 - Spire.Doc (转)

      [原文地址]http://www.cnblogs.com/liqingwen/p/5898368.html 序 本打算过几天简单介绍下组件 Spire.XLS,突然发现园友率先发布了一篇,既然 x ...

  7. 在C#中使用Spire.doc对word的操作总结

    在C#中使用Spire.doc对word的操作总结 在最近的工程中我们要处理一些word文档.通过在网上的大量搜索,我发现大多数软件功能不是不完整就是有重复.极少数可以完全实现的word组件又要收费. ...

  8. 用Spire.doc来合并邮件

      用Spire.doc来合并邮件 让我们想象一下这样的场景:你在一家IT公司上班.某天公司的某一产品大幅度升级了.然后你需要通知所有的客户.这真是很长的名单.一个个的通知他们是有点蠢的,因为这要花费 ...

  9. SPIRE.DOC - .NET开发者的福利

    SPIRE.DOC - .NET开发者的福利 前面我们使用过Spire.XLS for .NET Component创建Excel文件.最近试用了下.DOC 方面的API.这次测试的产品是.通过使用S ...

随机推荐

  1. MSDN上的异步socket 服务端例子

    MSDN上的异步socket 服务端例子 2006-11-22 17:12:01|  分类: 代码学习 |  标签: |字号大中小 订阅     Imports SystemImports Syste ...

  2. [Mobx] Use MobX actions to change and guard state

    This lesson explains how actions can be used to control and modify the state of your application. Th ...

  3. HTML、XHTML、css速记

    一.HTML 下面内容记录经常使用的html元素.可另存为html文件以查看效果: <!doctype html> <html lang="zh-cn"> ...

  4. NDIS

    NDIS NDIS(NetworkDriverInterfaceSpecification)是网络驱动程序接口规范的简称.它横跨传输层.网络层和数据 链路层,定义了网卡或网卡驱动程序与上层协议驱动程序 ...

  5. js课程 5-13 js事件绑定和鼠标事件注意事项有哪些

    js课程 5-13  js事件绑定和鼠标事件注意事项有哪些 一.总结 一句话总结:js代码的灵魂就是改变标签的属性和样式,就这两种. 1.js触发改的东西是哪两样? 属性和样式 2.js如何让页面用标 ...

  6. 前端项目课程7 banner设计注意事项

    前端项目课程7 banner设计注意事项 一.总结 一句话总结: 1.每个部分的里面的部分可以用相同的名字么,如何修改样式呢? 可以, 用模块名 + 比如上中下(top middle bottom) ...

  7. stm32的串口中断

    下面有很多问题没有验证: 在设置USART_CR1中的TE位时,会发送一个空闲帧作为第一次数据发送, 目前我所了解的串口中断发送,有两种方式: 一个是:TC 一个是:TXE 这是判断两个标志位, 第一 ...

  8. ANDROID内存优化(大汇总——全)

    写在最前: 本文的思路主要借鉴了2014年AnDevCon开发者大会的一个演讲PPT,加上把网上搜集的各种内存零散知识点进行汇总.挑选.简化后整理而成. 所以我将本文定义为一个工具类的文章,如果你在A ...

  9. 【HDU】病毒侵袭(AC自己主动机模板题)

    AC自己主动机的模板题.因为输入的字符串中的字符不保证全为小写字母.所以范围应该在130之前,而前31位字符是不可能出如今字符串的(不懂得查下ACSII表即可了).所以仅仅须要开的结点数组大小为130 ...

  10. 关于.c和.h 和定义变量的问题

    最初调试的时候是因为有个错误在wavplay.h文件中 于是我跳到了recorderl.h中:从图中看到引用了main.h 出现这个问题的具体原因还是不太清楚: 不过我任务是因为: wavplay.h ...