使用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. ThinkPHP5.0---方法异常格式

    public function test(){ try{ // 获取到ThinkPHP的内置异常时,直接向上抛出,交给ThinkPHP处理 }catch (\think\Exception\HttpR ...

  2. 自己写的Android图表库XCL-Charts一些旧的样例

    话说有了灵感就要抓住,来了兴趣就要去研究它. 所以尽管近期非常忙.但我还是没有丢下Android图表实现的研究.最终如今我的图表库基类 基本上已经有点模样了.不在是小打小闹,而是能依传入參数非常灵活的 ...

  3. DB2 概览

    2006:IBM公布DB2.9.将数据库领域带入XML时代.IT建设业已进入SOA(Service-Oriented Architecture)时代.实现SOA.其核心难点是顺畅解决不同应用间的数据交 ...

  4. linux中软件安装方式

    通常Linux应用软件的安装包有三种: tar包,如software-1.2.3-1.tar.gz.它是使用UNIX系统的打包工具tar打包的. rpm包,如software-1.2.3-1.i386 ...

  5. 使用javascript实现图片上下切换效果并且实现顺序循环播放

    <!doctype html><html lang="en"><head> <meta charset="UTF-8" ...

  6. TTS-零基础入门之语音模板化

    上篇介绍了TTS的一个简单样例http://blog.csdn.net/u010176014/article/details/47326413 本篇咱们进一步聊聊 语音怎样读模板. 比方 公交车上的模 ...

  7. stm32单片机时钟中断的配置

    原作者:http://www.eeworld.com.cn/mcu/article_2016082828940.html 配置流程:   1:系统时钟初始化,包括系统时钟和要开放的IO口或者功能的时钟 ...

  8. 动态布局Cell的高度

    1 自定义Cell, 在Cell的构造方法里面添加好所有的子控件 2 3 2 在HeightForRowAtIndexPath方法中返回每一行Cell对应的高度 4 5 3 在Cell的layoutS ...

  9. okhttp的简介(二)之简单封装

    前一篇文章简单的介绍了okhttp的简单使用.okhttp的简介(一):http://blog.csdn.net/wuyinlei/article/details/50579564 相信使用还是非常好 ...

  10. 细说document.ready和window.onload

    原文 简书原文:https://www.jianshu.com/p/bbf28d61aa1f 大纲 1.对页面加载的认识 2.关于document.ready() 3.关于document.onloa ...