当前位置 博文首页 > 随风去远方:C#中word导出功能骚操作

    随风去远方:C#中word导出功能骚操作

    作者:随风去远方 时间:2021-04-28 12:09

    马上过牛年了,先祝大家新年好,身体好,心情好!!!

    年前最后写一篇之前项目开发的一个功能,自己根据系统业务,想到的一个解决办法,效率还是不错的,废话不多说,开整!!!

    需求:企业填报自己的企业信息到系统中,最后需要将数据以给定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; }
            
    
    下一篇:没有了