以前一直是用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、代码

可重用代码:

 using Spire.Doc;
using Spire.Doc.Documents;
using Spire.Doc.Fields;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks; namespace We.Framework.Spire
{
/// <summary>
/// Sprie.Doc
/// Designed by XIAO
/// 2017-05-09
/// </summary>
public class WordHandler
{
public static bool ExportWordByFields<T>(T mod, string TempleteFilePath, string ExpFilePath)
{
if (mod == null)
{
throw new Exception("模型为空!");
} System.Reflection.PropertyInfo[] properties = mod.GetType().GetProperties(System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.Public);
if (properties.Length <= )
{
throw new Exception("模型属性为空!");
} if (!File.Exists(TempleteFilePath))
{
throw new Exception("指定路径的模板文件不存在!");
} try
{
Document doc = new Document();
doc.LoadFromFile(TempleteFilePath); #region 替换文字
//doc.Replace("海关", "海关口岸", true, true);
//doc.Replace("报验", "报检", true, true);
#endregion //清除表单域阴影
doc.Properties.FormFieldShading = false; //遍历Word模板中的文本域(field.name为文本域名称)
foreach (FormField field in doc.Sections[].Body.FormFields)
{
foreach (System.Reflection.PropertyInfo prop in properties)
{
string name = prop.Name; //属性名称
object value = prop.GetValue(mod, null); //属性值
string des = ((DescriptionAttribute)Attribute.GetCustomAttribute(prop, typeof(DescriptionAttribute))).Description;// 属性描述值 //注意:文本域名称 == 模型中属性的 Description 值 !!!!!!
//也可以: 文本域名称 == 模型中属性的 Name 值 !!!!!!
if (field.Name == des)
{
if (field.DocumentObjectType == DocumentObjectType.TextFormField) //文本域
{
if (prop.PropertyType.Name == "Boolean")
{
field.Text = "√"; //插入勾选符号
break;
}
else
{
field.Text = value.ToString(); //向Word模板中插入值
break;
}
}
else if (field.DocumentObjectType == DocumentObjectType.CheckBox) //复选框
{
(field as CheckBoxFormField).Checked = (value as bool?).HasValue ? (value as bool?).Value : false;
}
}
}
} doc.SaveToFile(ExpFilePath, FileFormat.Docx);
doc.Close(); return true;
}
catch (Exception ex)
{
string msg = ex.Message; return false;
}
}
}
}

测试代码部分:

 using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Text;
using System.Threading.Tasks; namespace WordHelper.TestModel
{
/// <summary>
/// 抽样记录单
/// </summary>
public class SamplingRcd
{
[Description("记录单编号")]
public string No { get; set; } [Description("年")]
public int Year { get; set; } [Description("月")]
public int Month { get; set; } [Description("日")]
public int Day { get; set; } [Description("药品名称")]
public string DrugName { get; set; } [Description("商品名")]
public string GoodsName { get; set; } [Description("注册证号")]
public string RegistNo { get; set; } [Description("检验通知号")]
public string NoticeNo { get; set; } [Description("外包装是否完整")]
public bool IsIntact { get; set; } [Description("是否封固")]
public bool IsFixed { get; set; } [Description("铅封")]
public bool IsPb { get; set; }
}
}

数据模型

         private void button1_Click(object sender, EventArgs e)
{
SamplingRcd mod = new SamplingRcd();
mod.No = "No158922144";
mod.Year = ;
mod.Month = ;
mod.Day = ;
mod.DrugName = "门冬胰岛素50注射液";
mod.GoodsName = "康胰素";
mod.RegistNo = "R12324552";
mod.NoticeNo = "N12324552";
mod.IsIntact = true;
mod.IsFixed = true;
mod.IsPb = true; System.IO.Directory.SetCurrentDirectory(AppDomain.CurrentDomain.BaseDirectory);
string templeteFileName = @"..\..\WordTemplete\进口药品抽样记录单.docx";
string newFileName = string.Format("H:\\Exp_进口药品抽样记录单_{0}.docx", DateTime.Now.ToString("yyyyMMddHHmmss")); bool result = WordHandler.ExportWordByFields<SamplingRcd>(mod, templeteFileName, newFileName);
if (result)
{
MessageBox.Show("成功");
}
else
{
MessageBox.Show("失败");
}
}

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

(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. SQL Server--获取磁盘空间使用情况

    对于DBA来说,监控磁盘使用情况是必要的工作,然后没有比较简单的方法能获取到磁盘空间使用率信息,下面总结下这些年攒下的脚本: 最常用的查看磁盘剩余空间,这个属于DBA入门必记的东西: -- 查看磁盘可 ...

  2. Java虚拟机工作原理

    Java虚拟机工作原理 首先我想从宏观上介绍一下Java虚拟机的工作原理.从最初的我们编写的Java源文件(.java文件)是如何一步步执行的,如下图所示,首先Java源文件经过前端编译器(javac ...

  3. vs打开项目出错:未找到导入的项目“C:\Program Files (x86)\MSBuild\Microsoft.Cpp\v4.0\BuildCustomizations\CUDA 5.0.props”的解决办法

    有时候由于CUDA升级或者下载的源码原创建项目的CUDA版本与自己的不同,在打开项目的时候发现加载不上,提示:未找到导入的项目“C:\Program Files (x86)\MSBuild\Micro ...

  4. webpack独立打包与缓存处理

    关于 微信公众号:前端呼啦圈(Love-FED) 我的博客:劳卜的博客 知乎专栏:前端呼啦圈 前言 先前写了一篇webpack入门的文章<webpack入门必知必会>,简单介绍了webpa ...

  5. 【C++】模拟实现auto_ptr

    看了<Effctive C++>,里面提到用对象去管理资源,可以有效防止内存泄漏. 结合auto_ptr特性,稍微思考了一下,实现了一个简单的auto_ptr (因为代码量小,就不分文件了 ...

  6. 自动化利器-Zabbix

    1.1为何需要监控系统 在一个IT环境中会存在各种各样的设备,例如:硬件设备.软件设备.其系统的构成也是非常复杂的. 多种应用构成负载的IT业务系统,保证这些资源的正常运转,是一个公司IT部门的职责. ...

  7. SSM项目整合基本步骤

    SSM项目整合 1.基本概念 1.1.Spring Spring 是一个开源框架, Spring 是于 2003  年兴起的一个轻量级的 Java  开发框架,由 Rod Johnson  在其著作  ...

  8. 3.Java日志框架slf4j、jcl、jul、log4j1、log4j2、logback大总结

    一.slf4j.jcl.jul.log4j1.log4j2.logback JUL:JDK中的日志记录工具,也常称为JDKLog.jdk-logging. LOG4J1:一个具体的日志实现框架. LO ...

  9. echarts雷达图点击事件

    最近看见别人问的问题,点击雷达图的拐点,获取点击数据的问题,直接上代码. echarts配置问题:https://www.douban.com/note/509404582/ <!doctype ...

  10. 云计算之路-阿里云上:RDS数据库连接数过万引发故障,主备库切换后恢复正常

    非常抱歉!今天 12:03-12:52 ,由于数据库连接数异常突增超过1万,达到了阿里云RDS的最大连接数限制,影响了全站的正常访问.由此给您带来麻烦,请您谅解. 在发现数据库连接数突增的问题后,我们 ...