Spire.Doc组件读取与写入Word

  之前写了一篇开源组件DocX读写word的文章,当时时间比较匆忙选了这个组件,使用过程中还是有些不便,不能提前定义好模版,插入Form表单域进行替换。最近无意中发现Spire.Doc组件功能很强大,目前来看基本上符合我的所有使用场景。本篇将挑选几个重要的应用场景进行介绍。

阅读目录

回到顶部

使用模版生成简历

  使用word的FormField预先插入占位符,然后在代码中获取所有FormField,进行替换。这种场景特别适用于,模版固定动态更改内容。看看最终效果

    表单域制作步骤

    1.打开word中的开发工具选项,对于导航栏中没有这一项的,可以通过 文件->选项->自定义功能区->开发工具 进行打开

   2.插入TextField, 属性->设置书签名称

  模版制作完成后,来看看实现代码

class Program
    {
        private static BindingFlags s_flag = BindingFlags.Instance | BindingFlags.Public;

        static void Main(string[] args)
        {
            Console.WriteLine("\nRunning Examples");

            Resume personResume = new Resume
            {

                Name = "Spire.Doc",//姓名
                Marriage = "未婚",//婚姻
                Birth = "2010-09-19",//出生年月
                Political = "团员",//政治面貌
                Sex = "男",//性别
                Nation = "汉族",//民族
                Degree = "大学本科",//学位
                Mobile = "13567890987",//移动电话
                Professional = "软件工程",//专业
                Email = "2345678@qq.com",//邮箱
                Adress = "故宫", //地址
                MajorCourse = "数据结构,C语言,算法,C++",//主修课程
                PersonalAbility = "熟练掌握DocX操作Word,SQL能力强悍",//个人能力
                ComputerAbility = "高级软件工程师",//计算机能力
                LanguageLevel = "CET-4,CET-6",//外语水平
                Awards = "1999年几月  曾获优秀班干部,3等奖学金1999年几月  曾获校优秀干部,学生会先进集体,2等奖学金20**年几月  曾获优秀学习委员,网络技术协会负责人,……………………",//奖励情况
                SelfEvaluation = "本人性格开朗、稳重、有活力,待人热情、真诚;工作认真负责,积极主动,能吃苦耐劳,用于承受压力,勇于创新;有很强的组织能力和团队协作精神,具有较强的适应能力;纪律性强,工作积极配合;意志坚强,具有较强的无私奉献精神"//自我评价
            };
            CreateResume(personResume);

            Console.WriteLine("\nPress any key to exit.");
            Console.ReadKey();
        }

        private static void CreateResume(Resume personResume)
        {
            Document doc = new Document(@"ResumeTemplate.docx");
            //清除表单域阴影
            doc.Properties.FormFieldShading=false;
            try
            {
                Type type = typeof(Resume);
                PropertyInfo[] properties = type.GetProperties(s_flag);
                int length = properties.Length;
                Dictionary<string, PropertyInfo> dict = new Dictionary<string, PropertyInfo>(length, StringComparer.OrdinalIgnoreCase);
                foreach (PropertyInfo prop in properties)
                {
                    dict[prop.Name] = prop;
                }
                object value = null;
                foreach (FormField field in doc.Sections[0].Body.FormFields)
                {            //field.name对应设置模版文本域名称
                    PropertyInfo prop = dict[field.Name];

                    if (prop != null)
                    {
                        value = prop.GetValue(personResume, null);
                        if (value != null && value != DBNull.Value)
                        {
                            switch (field.Type)
                            {
                                case FieldType.FieldFormTextInput:
                                    field.Text = value.ToString();
                                    break;
                                default:
                                    break;
                            }
                        }
                    }
                }
                doc.SaveToFile(@"DocXResume.docx", FileFormat.Docx);
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
            }
        }
    }
  public class Resume
    {
        public string Name { get; set; }

        public string Marriage { get; set; }

        public string Birth { get; set; }

        public string Political { get; set; }

        public string Sex { get; set; }

        public string Nation { get; set; }

        public string Degree { get; set; }

        public string Mobile { get; set; }

        public string Professional { get; set; }

        public string Email { get; set; }

        public string Adress { get; set; }

        public string MajorCourse { get; set; }

        public string PersonalAbility { get; set; }

        public string ComputerAbility { get; set; }

        public string LanguageLevel { get; set; }

        public string Awards { get; set; }

        public string SelfEvaluation { get; set; }
    }

View Code

  重点关注上面标红的代码,可以看到通过简单的代码即可完成一份简历文档 

回到顶部

格式转换

  使用Spire.Doc可以很方便的将word转换成HTML,RTF,PDF,TXT,WPS...等格式

Document doc = new Document(@"SpireDocResume.docx"); //Save doc file.
doc.SaveToFile("SpireDocResume.html", FileFormat.Html);

    效果和直接打开word是一样的,有了这功能就能实现在线word预览,之前的一篇在线文档预览方案也可以参考一下。其它格式的转换也是一样的代码,改一下FileFormat枚举值即可。

回到顶部

Table操作

 private static void addTable(Section section)
        {
            String[] header = { "Name", "Capital", "Continent", "Area", "Population" };
            String[][] data =
                {
                    new String[]{"Argentina", "Buenos Aires", "South America", "2777815", "32300003"},
                    new String[]{"Bolivia", "La Paz", "South America", "1098575", "7300000"},
                    new String[]{"Brazil", "Brasilia", "South America", "8511196", "150400000"},
                    new String[]{"Canada", "Ottawa", "North America", "9976147", "26500000"},
                    new String[]{"Chile", "Santiago", "South America", "756943", "13200000"},
                    new String[]{"Colombia", "Bagota", "South America", "1138907", "33000000"},
                    new String[]{"Cuba", "Havana", "North America", "114524", "10600000"},
                    new String[]{"Ecuador", "Quito", "South America", "455502", "10600000"},
                    new String[]{"El Salvador", "San Salvador", "North America", "20865", "5300000"},
                    new String[]{"Guyana", "Georgetown", "South America", "214969", "800000"},
                    new String[]{"Jamaica", "Kingston", "North America", "11424", "2500000"},
                    new String[]{"Mexico", "Mexico City", "North America", "1967180", "88600000"},
                    new String[]{"Nicaragua", "Managua", "North America", "139000", "3900000"},
                    new String[]{"Paraguay", "Asuncion", "South America", "406576", "4660000"},
                    new String[]{"Peru", "Lima", "South America", "1285215", "21600000"},
                    new String[]{"United States of America", "Washington", "North America", "9363130", "249200000"},
                    new String[]{"Uruguay", "Montevideo", "South America", "176140", "3002000"},
                    new String[]{"Venezuela", "Caracas", "South America", "912047", "19700000"}
                };
            Spire.Doc.Table table = section.AddTable();
            table.ResetCells(data.Length + 1, header.Length);

            // ***************** First Row *************************
            TableRow row = table.Rows[0];
            row.IsHeader = true;
            row.Height = 20;    //unit: point, 1point = 0.3528 mm
            row.HeightType = TableRowHeightType.Exactly;
            row.RowFormat.BackColor = Color.Gray;
            for (int i = 0; i < header.Length; i++)
            {
                row.Cells[i].CellFormat.VerticalAlignment = VerticalAlignment.Middle;
                Paragraph p = row.Cells[i].AddParagraph();
                p.Format.HorizontalAlignment = Spire.Doc.Documents.HorizontalAlignment.Center;
                TextRange txtRange = p.AppendText(header[i]);
                txtRange.CharacterFormat.Bold = true;
            }

            for (int r = 0; r < data.Length; r++)
            {
                TableRow dataRow = table.Rows[r + 1];
                dataRow.Height = 20;
                dataRow.HeightType = TableRowHeightType.Exactly;
                dataRow.RowFormat.BackColor = Color.Empty;
                for (int c = 0; c < data[r].Length; c++)
                {
                    dataRow.Cells[c].CellFormat.VerticalAlignment = VerticalAlignment.Middle;
                    dataRow.Cells[c].AddParagraph().AppendText(data[r][c]);
                }
            }
        }

回到顶部

总结

   通过上面三个简单的例子,粗略的了解了Spire.Doc。下面就我个人对DocX和Spire.Doc使用,列出两种优缺点。

Spire.Doc

DocX

API

介绍简单

无API介绍

Demo

提供了很多Demo方便学习

demo少

收费

收费

开源免费

功能对比

1.支持FormField模版替换 2.Table读写功能强大

1.对自定义属性读写存在BUG

兼容性

兼容word各版本

支持2007即以上版本

依赖性

不依赖于office,即使服务器未装office也能正常操作

    实际开发中可以根据自己需要来选择使用Sprie.Doc或者DocX。

    本文例子Demo下载地址:SpireDoc_Demo

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏写写代码吃吃瓜

Android使用SurfaceView作为相机预览识图时,视图被拉伸的问题

3948
来自专栏星流全栈

Bulma — 基于Flexbox的CSS框架

1666
来自专栏企鹅号快讯

优化Profiler中Others的耗时……

我们将从日常技术交流中精选若干个开发相关的问题,建议阅读时间15分钟,认真读完必有收获。如果您有任何独到的见解或者发现也欢迎联系我们,一起探讨。 内存 Q:我的...

1989
来自专栏子勰随笔

Android学习之路

2897
来自专栏数据小魔方

Xcelsius(水晶易表)系列2——单值部件

今天专门跟大家分享水晶易表中的一大类部件——单值部件。 单值部件使用频率很高,从它的名称就能猜个大概,它是用来表达单个指标的图表部件。 水晶易表中的单值部件大体...

2525
来自专栏BaronTalk

RxJava系列七(最佳实践)

前言 有点标题党了,其实谈不上什么最佳实践。前段时间公司实行996,所以也没什么时间和精力来更新博客(好吧~我承认是我懒~)。因此这篇文章只是简单的通过两个例...

35313
来自专栏腾讯Bugly的专栏

浅谈Android自定义锁屏页的发车姿势

一、为什么需要自定义锁屏页 锁屏作为一种黑白屏时代就存在的手机功能,至今仍发挥着巨大作用,特别是触屏时代的到来,锁屏的功用被发挥到了极致。多少人曾经在无聊的时候...

4378
来自专栏ASP.NET MVC5 后台权限管理系统

ASP.NET MVC5+EF6+EasyUI 后台管理系统(53)-工作流设计-我的批阅

前言:由于工作原因工作流一直没时间更新,虽然没有更新,但是批阅和申请差不多,改变一下数据的状态字段就行,有几个园友已经率先完成了 说句实话,一个工作流用文章表达...

30310
来自专栏小樱的经验随笔

CTF---密码学入门第七题 杯酒人生

杯酒人生分值:10 来源: Veneno 难度:易 参与人数:2633人 Get Flag:790人 答题人数:963人 解题通过率:82% 使用古典密码 ...

2778
来自专栏IT派

Python家族全家福,看你到底有多少熟人?

包管理 管理包和依赖的工具。 pip – Python 包和依赖关系管理工具。 pip-tools – 保证 Python 包依赖关系更新的一组工具。 cond...

4485

扫码关注云+社区