数据字典生成工具之旅(5):DocX组件读取与写入Word

      由于上周工作比较繁忙,所以这篇文章等了这么久才写(预告一下,下一个章节正式进入NVelocity篇,到时会讲解怎么使用NVelocity做一款简易的代码生成器,敬请期待!),好了正式进入本篇内容。

  这篇会介绍DocX读写WORD,DocX组件功能强大,可以很容易的读写WORD,相对于NPOI强大很多,性能也好很多,做这个工具之所以会选择这个组件,主要是看重该组件的表格合并功能。

阅读目录

回到顶部

使用模版生成简历

       下面将以一个简历实例来讲解DocX对表格的操作,先看看生成的效果

 private static void CreateResume()
        {
            DocX doc;
            try
            {
                doc = DocX.Load(@"ResumeTemplate.docx");
                //给域赋值
                if (doc.Tables != null && doc.Tables.Count > 0)
                {
                    Table table=doc.Tables[0];
                    //姓名
                    table.Rows[1].Cells[1].Paragraphs[0].Append("DocX");
                    //姓名
                    table.Rows[1].Cells[3].Paragraphs[0].Append("未婚");

                    //出生
                    table.Rows[2].Cells[1].Paragraphs[0].Append("2010-09-19");
                    //政治面貌
                    table.Rows[2].Cells[3].Paragraphs[0].Append("团员");

                    //性别
                    table.Rows[3].Cells[1].Paragraphs[0].Append("男");
                    //民族
                    table.Rows[3].Cells[3].Paragraphs[0].Append("汉族");

                    //学位
                    table.Rows[4].Cells[1].Paragraphs[0].Append("大学本科");
                    //移动电话
                    table.Rows[4].Cells[3].Paragraphs[0].Append("13567890987");

                    //专业
                    table.Rows[5].Cells[1].Paragraphs[0].Append("软件工程");
                    //邮箱
                    table.Rows[5].Cells[3].Paragraphs[0].Append("2345678@qq.com");

                    //地址
                    table.Rows[6].Cells[1].Paragraphs[0].Append("故宫");

                    //照片
                    Novacode.Image image = doc.AddImage(@"logo.jpg");
                    Picture picture = image.CreatePicture();
                    table.Rows[1].Cells[4].InsertParagraph().AppendPicture(picture);

                    //教育背景
                    table.Rows[8].Cells[0].Paragraphs[0].Append("2011-2013");
                    table.Rows[8].Cells[1].Paragraphs[0].Append("小学");

                    //主修课程
                    table.Rows[10].Cells[0].Paragraphs[0].Append("数据结构,C语言,算法,C++");

                    //个人能力
                    table.Rows[12].Cells[0].Paragraphs[0].Append("熟练掌握DocX操作Word,SQL能力强悍");

                    //计算机能力
                    table.Rows[14].Cells[0].Paragraphs[0].Append("高级软件工程师");

                    //外语水平
                    table.Rows[16].Cells[0].Paragraphs[0].Append("CET-4,CET-6");

                    //奖励情况
                    table.Rows[18].Cells[0].Paragraphs[0].Append("1999年几月  曾获优秀班干部,3等奖学金1999年几月  曾获校优秀干部,学生会先进集体,2等奖学金20**年几月  曾获优秀学习委员,网络技术协会负责人,……………………");

                    //自我评价
                    table.Rows[20].Cells[0].Paragraphs[0].Append("本人性格开朗、稳重、有活力,待人热情、真诚;工作认真负责,积极主动,能吃苦耐劳,用于承受压力,勇于创新;有很强的组织能力和团队协作精神,具有较强的适应能力;纪律性强,工作积极配合;意志坚强,具有较强的无私奉献精神。");

                }
                doc.SaveAs(@"DocXResume.docx");
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
            }
        }

上面的代码从模版表格中写入指定数据,生成的最终简历,操作很简单。Demo下载地址

回到顶部

读写表格数据

  上面的例子是想表格中写入数据,那么读取数据的操作可以类比出来,也是很简单的这里就不多介绍了,工具里面创建表格写入数据的代码贴出来,供大家参考。

  /// <summary>
        /// 根据读取的表信息导出WORD文档
        /// </summary>
        /// <param name="list">表信息集合</param>
        /// <param name="strExportPath">导出路径</param>
        public static void CreateWord(List<TableInfo> list, string strExportPath, BackgroundWorker bw)
        {
            int fontSize = 9;
            using (DocX doc = DocX.Create(strExportPath, DocumentTypes.Document))
            {
                int proc = 1;
                foreach (TableInfo t in list)
                {
                    Paragraph p1 = doc.InsertParagraph();
                    p1.AppendLine(string.IsNullOrEmpty(t.Name) ? t.Code : t.Name + "\n").Bold();



                    Table table = doc.AddTable(t.ListColumnInfo.Count + 4, 11);
                    table.Design = TableDesign.TableGrid;
                    table.Alignment = Alignment.center;

                    List<Row> rows = table.Rows;
                    Row row0 = rows[0];
                    row0.MergeCells(0, 1);
                    row0.Cells[0].Paragraphs[0].Append("数据表中文名称").FontSize(fontSize);
                    row0.MergeCells(1, 2);
                    row0.Cells[1].Paragraphs[0].Append(t.Name).FontSize(fontSize);
                    row0.MergeCells(2, 4);
                    row0.Cells[2].Paragraphs[0].Append("修改说明").FontSize(fontSize);
                    row0.MergeCells(3, 6);
                    row0.Cells[3].Paragraphs[0].Append(t.IsUpdate ? "调整" : "新增").FontSize(fontSize).Color(t.IsUpdate ? Color.Red : Color.Blue);

                    row0.Cells[0].Width = 143;
                    row0.Cells[1].Width = 211;
                    row0.Cells[2].Width = 127;
                    row0.Cells[3].Width = 149;
                    row0.Height = 25;

                    Row row1 = rows[1];
                    row1.MergeCells(0, 1);
                    row1.Cells[0].Paragraphs[0].Append("数据表英文名称").FontSize(fontSize);
                    row1.MergeCells(1, 9);
                    row1.Cells[1].Paragraphs[0].Append(t.Code).FontSize(fontSize);
                    row1.Cells[0].Width = 143;
                    row1.Cells[1].Width = 487;
                    row1.Height = 25;

                    Row row2 = rows[2];
                    row2.MergeCells(0, 1);
                    row2.Cells[0].Paragraphs[0].Append("功能简述").FontSize(fontSize);
                    row2.MergeCells(1, 9);
                    row2.Cells[1].Paragraphs[0].Append("").FontSize(fontSize);
                    row2.Cells[0].Width = 143;
                    row2.Cells[1].Width = 487;
                    row2.Height = 25;

                    Row row3 = rows[3];
                    row3.Cells[0].FillColor = Color.FromArgb(226, 226, 226);
                    row3.Cells[1].FillColor = Color.FromArgb(226, 226, 226);
                    row3.Cells[2].FillColor = Color.FromArgb(226, 226, 226);
                    row3.Cells[3].FillColor = Color.FromArgb(226, 226, 226);
                    row3.Cells[4].FillColor = Color.FromArgb(226, 226, 226);
                    row3.Cells[5].FillColor = Color.FromArgb(226, 226, 226);
                    row3.Cells[6].FillColor = Color.FromArgb(226, 226, 226);
                    row3.Cells[7].FillColor = Color.FromArgb(226, 226, 226);
                    row3.Cells[8].FillColor = Color.FromArgb(226, 226, 226);
                    row3.Cells[9].FillColor = Color.FromArgb(226, 226, 226);
                    row3.Cells[10].FillColor = Color.FromArgb(226, 226, 226);
                    row3.Cells[0].Width = 35;
                    row3.Cells[1].Width = 108;
                    row3.Cells[2].Width = 116;
                    row3.Cells[3].Width = 95;
                    row3.Cells[4].Width = 51;
                    row3.Cells[5].Width = 36;
                    row3.Cells[6].Width = 40;
                    row3.Cells[7].Width = 35;
                    row3.Cells[8].Width = 40;
                    row3.Cells[9].Width = 39;
                    row3.Cells[10].Width = 35;

                    row3.Cells[0].Paragraphs[0].Append("序号").Bold().FontSize(fontSize);
                    row3.Cells[1].Paragraphs[0].Append("字段中文名").Bold().FontSize(fontSize);
                    row3.Cells[2].Paragraphs[0].Append("字段英文名").Bold().FontSize(fontSize);
                    row3.Cells[3].Paragraphs[0].Append("数据类型").Bold().FontSize(fontSize);
                    row3.Cells[4].Paragraphs[0].Append("宽度").Bold().FontSize(fontSize);
                    row3.Cells[5].Paragraphs[0].Append("约束").Bold().FontSize(fontSize);
                    row3.Cells[6].Paragraphs[0].Append("默认值").Bold().FontSize(fontSize);
                    row3.Cells[7].Paragraphs[0].Append("空值").Bold().FontSize(fontSize);
                    row3.Cells[8].Paragraphs[0].Append("枚举&说明").Bold().FontSize(fontSize);
                    row3.Cells[9].Paragraphs[0].Append("自增").Bold().FontSize(fontSize);
                    row3.Cells[10].Paragraphs[0].Append("修改说明").Bold().FontSize(fontSize);

                    Row row = null;
                    ColumnInfo info = null;
                    for (int i = 0; i < t.ListColumnInfo.Count; i++)
                    {
                        row = rows[i + 4];
                        info = t.ListColumnInfo[i];
                        row.Cells[0].Paragraphs[0].Append(info.Sequence.ToString()).FontSize(fontSize);
                        row.Cells[1].Paragraphs[0].Append(info.Name).FontSize(fontSize);
                        row.Cells[2].Paragraphs[0].Append(info.Code).FontSize(fontSize);
                        row.Cells[3].Paragraphs[0].Append(info.DataType).FontSize(fontSize);
                        row.Cells[4].Paragraphs[0].Append(info.Width).FontSize(fontSize);
                        row.Cells[5].Paragraphs[0].Append(info.PK ? "PK" : "").FontSize(fontSize);
                        row.Cells[6].Paragraphs[0].Append(info.DefaultValue).FontSize(fontSize);
                        row.Cells[7].Paragraphs[0].Append(info.Nullable ? "" : "N").FontSize(fontSize);
                        row.Cells[8].Paragraphs[0].Append("").FontSize(fontSize);
                        row.Cells[9].Paragraphs[0].Append(info.Identity ? "Y" : "").FontSize(fontSize);
                        row.Cells[10].Paragraphs[0].Append("").FontSize(fontSize);


                        row.Cells[0].Width = 35;
                        row.Cells[1].Width = 108;
                        row.Cells[2].Width = 116;
                        row.Cells[3].Width = 95;
                        row.Cells[4].Width = 51;
                        row.Cells[5].Width = 36;
                        row.Cells[6].Width = 40;
                        row.Cells[7].Width = 35;
                        row.Cells[8].Width = 40;
                        row.Cells[9].Width = 39;
                        row.Cells[10].Width = 35;

                        row.Height = 35;
                    }
                    p1.InsertTableAfterSelf(table);
                    bw.ReportProgress(proc * 100 / list.Count, "Process");
                    proc++;
                }
                doc.Save();
            }
        }

回到顶部

合并单元格   

      DocX使用MergeCells方法就可以合并单元格了

 List<Row> rows = table.Rows;
                    Row row0 = rows[0];
                    row0.MergeCells(0, 1);
                    row0.Cells[0].Paragraphs[0].Append("数据表中文名称").FontSize(fontSize);
                    row0.MergeCells(1, 2);
                    row0.Cells[1].Paragraphs[0].Append(t.Name).FontSize(fontSize);
                    row0.MergeCells(2, 4);
                    row0.Cells[2].Paragraphs[0].Append("修改说明").FontSize(fontSize);
                    row0.MergeCells(3, 6);
                    row0.Cells[3].Paragraphs[0].Append(t.IsUpdate ? "调整" : "新增").FontSize(fontSize).Color(t.IsUpdate ? Color.Red : Color.Blue);

回到顶部

工具源代码下载

      目前总共有经过了七个版本的升级,现在提供最新版本的下载地址

数据字典生成工具V2.0安装程序

最新安装程序

数据字典生成工具源代码

最新源代码

http://code.taobao.org/svn/DataDicPub

SVN最新源码共享地址

回到顶部

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

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏林德熙的博客

win2d 画出好看的图形

本文告诉大家,win2d 不需要从零开始做,以前做出来的很多库其实只需要做很小修改就可以做出好看的效果,而且用在 UWP 上。本文修改原先 大神写的 GDI 图...

651
来自专栏数据结构与算法

2017.5.26暴力赛解题报告

预计分数:T1:40AC+60TLE      T2:40AC+60TLE        T3:10AC+90TLE      总分=90 实际分数:T1:10...

3626
来自专栏数据结构与算法

1619. [HEOI2012]采花

输入文件:1flower.in   输出文件:1flower.out 简单对比 时间限制:5 s   内存限制:128 MB 【题目描述】 萧薰儿是古...

35013
来自专栏算法+

快速堆栈模糊算法

上一篇快速高斯模糊的原作者也有另一个比较快速的模糊算法Stack Blur,字面意思为堆栈模糊。 源地址为:http://incubator.quasimond...

3326
来自专栏Nian糕的私人厨房

腾讯课堂 IMWeb 七天前端求职提升营 Day 3

本次的系列博文主要是针对 腾讯课堂七天前端求职提升营 课程中,所推送的面试题目及编程练习的一次汇总,期间还包括三次直播课的分享,均由腾讯导师给大家讲解,该系列博...

845
来自专栏ml

HDUOJ----1234 开门人和关门人(浙江大学考研题)

开门人和关门人 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (J...

2595
来自专栏开发与安全

muduo网络库学习之EventLoop(六):TcpConnection::send()、shutdown()、handleRead()、handleWrite()

首先在EventLoop(五)基础上,在TcpConnection 构造函数中添加: // 通道可写事件到来的时候,回调TcpConnection::han...

3330
来自专栏飞扬的花生

qrCode生成二维码图片

QRCode.js 是一个用于生成二维码图片的插件。 1.文件脚本 var QRCode;!function(){function a(a){this.mode...

49711
来自专栏Flutter入门到实战

老司机带你重构Android的v4包的部分源码

版权声明:本文为博主原创文章,未经博主允许不得转载。https://www.jianshu.com/p/a08d754944c4

1051
来自专栏web开发

JavaScript二维码生成——qrcode.js

在开发中,有时候,我们需要根据不同的内容来动态生成二维码,则可以使用qrcode.js这个小插件来实现。 1.qrcode.js文件内容: (1)未压缩(qrc...

1856

扫码关注云+社区