資料字典生成工具之旅(5):DocX元件讀取與寫入Word

weixin_34015860發表於2014-08-16

      由於上週工作比較繁忙,所以這篇文章等了這麼久才寫(預告一下,下一個章節正式進入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最新原始碼共享地址

學習使用

      如果你使用了該工具,或者想學習該工具,歡迎加入這個小組,一起討論資料字典生成工具、把該工具做的更強,更方便使用,一起加入147425783 QQ群

      更多資料字典生成工具資料請點選資料字典生成工具專題

相關文章