由於上週工作比較繁忙,所以這篇文章等了這麼久才寫(預告一下,下一個章節正式進入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群。
更多資料字典生成工具資料請點選資料字典生成工具專題。