博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
使用Spire.Doc组件利用模板导出Word文档
阅读量:6190 次
发布时间:2019-06-21

本文共 6536 字,大约阅读时间需要 21 分钟。

     以前一直是用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.Spire13 {14     /// 15     /// Sprie.Doc16     /// Designed by XIAO17     /// 2017-05-0918     /// 19     public class WordHandler20     {21         public static bool ExportWordByFields
(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 try40 {41 Document doc = new Document();42 doc.LoadFromFile(TempleteFilePath);43 44 #region 替换文字45 //doc.Replace("海关", "海关口岸", true, true);46 //doc.Replace("报验", "报检", true, true);47 #endregion48 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 else73 {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     /// 11     /// 抽样记录单12     /// 13     public class SamplingRcd14     {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 = 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
(mod, templeteFileName, newFileName);21 if (result)22 {23 MessageBox.Show("成功");24 }25 else26 {27 MessageBox.Show("失败");28 }29 }

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

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

 

转载于:https://www.cnblogs.com/XWCloud/p/6831064.html

你可能感兴趣的文章
《OpenGL ES 3.x游戏开发(下卷)》一导读
查看>>
阿里云前端周刊 - 第 9 期
查看>>
Inside C++ object Model--构造函数
查看>>
识辨 | 什么是分类?什么是聚类?
查看>>
《jQuery、jQuery UI及jQuery Mobile技巧与示例》——3.5 技巧:更改元素的HTML内容...
查看>>
新手如何学习Java——Java学习路线图
查看>>
六款优秀的 Linux 基准测试工具
查看>>
首席架构师白鳝:运维的进阶与哲学之道
查看>>
ELK日志分析系统迁移记录
查看>>
PgSQL · 特性分析 · 金融级同步多副本分级配置方法
查看>>
阿里B2B研发管理难题如何应对?打造强有力的技术中台
查看>>
涨姿势,原来程序员喝酒都是这样的呀
查看>>
Oracle开发技能提升之层次查询全面解析
查看>>
聚焦数据安全管理——安踏信息安全管理体系实践
查看>>
Matchmaking System Design – Answering Frequently Asked Questions
查看>>
定制Eclipse IDE之功能篇(二)
查看>>
MySQL · 答疑解惑 · MySQL Sort 分页
查看>>
字符串常量池、堆、栈
查看>>
实战系列之天气预报实时采集
查看>>
反转单链表的几种方法
查看>>