Spire.Doc组件

使用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如何实现类似功能的,望告知下!先谢谢了!^_^)

时间: 2024-12-28 06:07:06

Spire.Doc组件的相关文章

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

以前一直是用Office的组件实现Word文档导出,但是让客户在服务器安装Office,涉及到版权:而且Office安装,包括权限配置也是比较麻烦. 现在流行使用第三方组件来实现对Office的操作,有NPOI,Spire等第三方组件.开始考虑的是NPOI,毕竟它在操作Excel方面还是很强大的:但是不知道是它本身没有,还是我没找到,无法实现利用Word模板的标签插入内容,纯靠代码去生成Word文档,排版是个大问题.最终找到了Spire.Doc组件,轻松实现! Spire的官网地址:https:

使用Spire.Doc来转换文本

使用Spire.Doc来转换文本 前段时间,我为不熟悉这个产品的读者们写了一篇关于我对 Spire.Doc的初识印象.Spire.Doc是一个专业的Word .NET库,它是专门为开发人员设计的用来快捷高效地在任何.NET(C#,VB.NET,ASP.NET)创建,载入,编辑,转化,打印 Word文档的.作为一个独立的Word .NET组件,Spire.Doc for .NET不需要您在机器上安装 MicrosoftWord.但是它可以将Microsoft Word 文件创造力与在任何开发者的应

[.NET] 操作 Word 组件 - Spire.Doc 介绍

操作 Word 组件 - Spire.Doc 介绍 [博主]反骨仔 [原文地址]http://www.cnblogs.com/liqingwen/p/5898368.html 序 本打算过几天简单介绍下组件 Spire.XLS,突然发现园友率先发布了一篇,既然 xls 已经出现,为避免打上抄袭嫌疑,博主只能抢先一步使用 Spire.Doc 简单介绍 Doc 操作,下面是通过 WinForm 程序执行代码完成介绍的. 本机环境:Win10 x64.VS 2015.MS Office 2016. 目

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

在C#中使用Spire.doc对word的操作总结 在最近的工程中我们要处理一些word文档.通过在网上的大量搜索,我发现大多数软件功能不是不完整就是有重复.极少数可以完全实现的word组件又要收费.功夫不负有心人,终于找到了可以满足我们需要的免费的C# word程序库.为了和其他的作比较,我在这里先做以下汇总.希望对大家有帮助. 如何得到? 这个免费版的word 组件可以在Codeplex下载到,你也可以从本文里直接下载msi文件.它还提供了一些源代码. Word操作汇总 1.        

【好文翻译】一步一步教你使用Spire.Doc转换Word文档格式

背景: 本文试图证明和审查Spire.Doc的格式转换能力.很长的一段时间里,为了操作文档,开发人员不得不在服务器上安装Office软件.首先,这是一个很糟糕的设计和实践.第二,微软从没打算把Office作为一个服务器组件,它也用来在服务器端解释和操作文档的.于是乎,产生了类似Spire.Doc这样的类库.当我们讨论这个问题时,值得一提的是 Office Open Xml. Office Open XML (也有非正式地称呼为 OOXML 或OpenXML) 是一种压缩的, 基于XML的文件格式

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

SPIRE.DOC - .NET开发者的福利 前面我们使用过Spire.XLS for .NET Component创建Excel文件.最近试用了下.DOC 方面的API.这次测试的产品是Spire.Doc for .NET,这是一个专业的Word .NET库,尤其是为那些需要快速高效地在任何.NET平台( C#, VB.NET, ASP.NET)上创建,读取,编辑,转换和打印word文档的开发人员设计的.它根本就不需要你的系统中安装word,因为它是一个完完全全独立的组件(一个Word.Net

用Spire.doc来合并邮件

  用Spire.doc来合并邮件 让我们想象一下这样的场景:你在一家IT公司上班.某天公司的某一产品大幅度升级了.然后你需要通知所有的客户.这真是很长的名单.一个个的通知他们是有点蠢的,因为这要花费太多的时间和人力了.为什么不找个更好的方法来快速高效地完成这项工作呢?我这里给大家一个用组件来解决的方法.组件的链接在这里.这是Spire.doc的另一个小功能,就是用它来合并邮件. 这是一个通知邮件并且所发的内容都是相同的.首先我们先创建一个模板,这个模板是用来创建通知邮件.请看下面的模板. 接下

Spire.DOC生成表格测试

首先,很感谢Jack对我的信任,让我来写一个评测,在此对Jack说一声抱歉,由于本人愚钝,并且最近项目比较紧张,把评测这个事情脱了一个月之久,由于往后的日子可能更忙,所以今晚抽空只能只写了一个小程序来测试. Spire系列的Word,PDF,Excel,Presentation是一套专为.NET开发人员设计的控件.使用该套工具,程序员可以在任意.NET平台上对Office文件.PDF文档进行生成,读取,编辑,修改,转换格式等处理,且不需要安装MS Office. 红字部分的内容,是有Jack给我

支持Word文档和其他文件格式间的转换的控件Spire.Doc for .NET

Spire.Doc for .NET是e-iceblue公司推出的一款专门对Microsoft Word 文档进行操作的.NET类控件.这款控件的主要功能在于帮助开发人员轻松快捷地生成.编辑和查看Word文档.同时,开发人员还可以通过使用Spire.Doc for .NET 设置Word文档的格式,插入图片,表格,超链接等.Spire.Doc for .NET 最大的便利之处在于它不依赖于Microsoft Word以及任何其他第三方软件.只需将此款控件安装在您的电脑上,您就可以对word文档进