当前位置 博文首页 > 随风去远方:C#中word导出功能骚操作
马上过牛年了,先祝大家新年好,身体好,心情好!!!
年前最后写一篇之前项目开发的一个功能,自己根据系统业务,想到的一个解决办法,效率还是不错的,废话不多说,开整!!!
需求:企业填报自己的企业信息到系统中,最后需要将数据以给定word模板形式导出,功能简单,就是要开发快,赶及
分析:主要费时间的工作是设计企业填报表单设计实现,以及根据提供的word模板导出数据这块儿,因为涉及到的表单比较多,一个表单最少也有差不多150多个字段,一个一个对,头发也得一把一把的掉
想到的解决法案:在导出word这个功能模块儿,写一些通用的方法,减少一些工作量。
word数据导出功能,思路就是在word模板中每一个需要填数据的地方命名一个标签,代码中找到对应命名的标签,插入数值
传统做法,第一步:在word模板中填写标签 第二步:程序中每个插入字段数据和word模板标签对应,最后插值,这样做有一个问题就是比较耗时间,而且很容易出错
我的做法,第一步:给数据字段一个自定义特性,在自定定义特性中写上对应的标签地址,应用反射的方法将数据最终插入到word模板中。这样就省去了第一步在word中写标签这样繁杂的操作。这样做的问题就是性能比较差,但是可以忽略不计
大体思路就这样,我就单独写一个demo供大家参考,之后能用就用,重在思路和想法的分享和讨论
开写:
新建一个项目:ExportWordModel
最终项目简易结构:
将没用的东西全部去掉,修改Index.cshtml页面成这样:
1 @{ 2 ViewBag.Title = "Home Page"; 3 } 4 <div class="jumbotron" style="text-align: center"> 5 @*<h1>ASP.NET</h1>*@ 6 <input type="button" value="导出" onclick="location.href = '@Url.Action("GetExport","Home")'" /> 7 </div>
在 HomeController 中创建:GetExport
创建一个类ExportFileOperator(所有的word操作),此类需要继承Controller,因为有返回File操作方法
1、 在GetExport中首先命名一个导出word标题就叫:测试导出Word文件
string title = "测试导出Word文件";
创建doc:
var doc = ExportFileOperator.CreateBuilder("GroupForm.doc");
2、CreateBuilder方法实现为(此处操作需要Aspose.Word组件,是操作word的,这个需要大家自己去找一下,或者网上找个破解的):
1 private static string _tempPath = AppDomain.CurrentDomain.BaseDirectory; 2 public static (Document doc, DocumentBuilder builder) CreateBuilder(string tempFileName) 3 { 4 string tempPath = $"{_tempPath}{tempFileName}"; 5 Document doc = new Document(tempPath); 6 return (doc, new DocumentBuilder(doc)); 7 }
3、插入标题(需要在word中写一个标签,作为标题插入的地址):
最终可以显示结果为这样:
方法:
ExportFileOperator.InsertTitle(ref doc.Item2, title);//插入标题
public static void InsertTitle(ref DocumentBuilder builder, string fileName, string tempBookMarkName = "title") { builder.MoveToBookmark(tempBookMarkName); builder.Write(fileName); }
4、根据业务实体,将实体数据写入到word中,也是核心所在
首先命名一个数据类:
public class EnterpriseEntity { #region 实体成员 /// <summary> /// id /// </summary> public string id { get; set; } /// <summary> /// 团队名 /// </summary> [Description("企业名称")] public string v1 { get; set; } /// <summary> /// 统一社会信用代码 /// </summary> [Description("统一社会信用代码")] public string v3 { get; set; } /// <summary> /// 成立日期 /// </summary> [Description("成立日期")] public string v4 { get; set; } /// <summary> /// 参赛行业领域 /// </summary> [Description("参赛行业领域")] public string v5 { get; set; } /// <summary> /// 行政区域 /// </summary> [Description("行政区域")] public string v6 { get; set; } /// <summary> /// 是否属于国家高新区内的企业 /// </summary> [Description("属于国家高新区内的企业")] public string v7 { get; set; } /// <summary> /// 是否属于国家级经济开发区内的企业 /// </summary> [Description("属于国家级经济开发区内的企业")] public string v9 { get; set; } /// <summary> /// 是否属于国家级科技企业孵化器内的企业 /// </summary> [Description("属于国家级科技企业孵化器内的企业")] public string v11 { get; set; } /// <summary> /// 是否属于国家大学科技园内的企业 /// </summary> [Description("属于国家大学")] public string v13 { get; set; } /// <summary> /// 是否国家备案的众创空间内的企业 /// </summary> [Description("国家备案的众创空间内的企业")] public string v20 { get; set; } /// <summary> /// 企业注册类型 /// </summary> [Description("企业注册类型")] public string v22 { get; set; } /// <summary> /// 注册资本 /// </summary> [Description("注册资本")] public string v24 { get; set; } /// <summary> /// 实收资本(万元人民币) /// </summary> [Description("实收资本")] public string v25 { get; set; } /// <summary> /// 企业注册地址 /// </summary> [Description("企业注册地址")] public string v26 { get; set; } /// <summary> /// 邮政编码 /// </summary> [Description("注册地邮政编码")] public string v27 { get; set; } /// <summary> /// 通信地址 /// </summary> [Description("通信地址")] public string v28 { get; set; } /// <summary> /// 邮政编码 /// </summary> [Description("通讯地邮政编码")] public string v29 { get; set; } /// <summary> /// 企业网址 /// </summary> [Description("企业网址")] public string v30 { get; set; } /// <summary> /// 企业官方微信 /// </summary> [Description("企业官方微信")] public string v31 { get; set; } /// <summary> /// 职工总数 /// </summary> [Description("职工总数")] public string v32 { get; set; } /// <summary> /// 博 士人数 /// </summary> [Description("博 士")] public string v33 { get; set; } /// <summary> /// 硕 士人数 /// </summary> [Description("硕 士")] public string v34 { get; set; } /// <summary> /// 本 科人数 /// </summary> [Description("本 科")] public string v35 { get; set; }