Net Core DocXCore 實現word模板匯出
阿新 • • 發佈:2019-09-07
實際工作中,往往有這樣的需求,需要匯出word,還有各種各樣的樣式,於是有了word模板匯出。
實現以下幾個需求:
1、表單匯出
2、表格匯出
3、表單表格混合匯出
4、實際用例測試
解決方案:
實現是基於NET Core 2.1 ,搜尋了各個開源專案最終基於DocX這個開源庫,當初實現時發現DocX作者並沒有釋出Core的版本,最後在Nuget搜尋到DocXCore這個包,但是沒有GitHub搜尋到這個庫。
上面還遇到一個坑爹的問題,系統在win執行沒問題,一部署到centos匯出就掛了,根據錯誤研究發現裡面居然要獲取當前登入的使用者資訊,win系統沒有問題,centos報錯,於是去掉獲取系統使用者這塊,居然沒有原始碼。
一怒之下,反編譯了DocXCore包,移除了獲取登入系統程式碼,最終win和centos都匯出正常。
奉上原始碼地址:https://github.com/deeround/DocXCore
1、表單匯出
模板
程式碼
1 public class FormTest 2 { 3 public static void Test() 4 { 5 Console.WriteLine($"表單"); 6 Stopwatch sw = new Stopwatch(); 7 Dictionary<string, object> data = new Dictionary<string, object>() 8 { 9 { "xmmc","測試姓名測試姓名111"}, 10 { "sqje","1417.4"}, 11 { "xmdw","部落格園Deeround"}, 12 { "glfs","自行管理方式"}, 13 { "xmgk","部落格園Deeround來函申請辦理 應急搶險治理工程專案竣工結(決)算,該專案已完工並通過專案初步驗收,現擬按程式採取政府購買服務方式開展評審"}, 14 { "psyj",""}, 15 { "gzyq", @"(一)對建設程式進行評審,包括可行性研究報告、初步設計等批准檔案的程式性審查。 16 (二)對建設規模、建設標準、可研執行情況等進行評審。 17 (三)對工程投資進行評審,包括工程計量、定額選用、材料價格及費用標準等的評審。 18 (四)對設施裝置資進行評審,包括設施裝置型號、規格、數量及價格的評審。 19 "}, 20 { "wcsx","1. 收到委託書後在10天內報送評審方案,評審完成後需提交評審報告紙質件7份及電子文件。"}, 21 { "ywcs","伯爵二元"}, 22 { "lxr","千年 12345678"}, 23 }; 24 25 sw.Start(); 26 string root = System.AppDomain.CurrentDomain.BaseDirectory; 27 WordHelper.Export(root + Path.Combine("Templates", "temp_form.docx"), root + "temp_form_out.docx", data); 28 sw.Stop(); 29 var time = sw.ElapsedMilliseconds; 30 Console.WriteLine($"耗時:{time}毫秒"); 31 } 32 }
最終效果
2、表格匯出
模板
程式碼
1 public class TableListTest 2 { 3 public static void Test(int count = 10) 4 { 5 Console.WriteLine($"表格"); 6 Stopwatch sw = new Stopwatch(); 7 IList<Dictionary<string, object>> data = new List<Dictionary<string, object>>(); 8 for (int i = 0; i < count; i++) 9 { 10 Dictionary<string, object> d = new Dictionary<string, object>() 11 { 12 { "xm","測試"+i.ToString()}, 13 { "nl",i}, 14 { "xb","男"} 15 }; 16 data.Add(d); 17 } 18 19 Dictionary<string, object> data1 = new Dictionary<string, object>(); 20 data1.Add("list", data); 21 sw.Start(); 22 string root = System.AppDomain.CurrentDomain.BaseDirectory; 23 WordHelper.Export(root + Path.Combine("Templates", "temp_table_list.docx"), root + "temp_table_list_out.docx", data1); 24 sw.Stop(); 25 var time = sw.ElapsedMilliseconds; 26 Console.WriteLine($"耗時:{time}毫秒"); 27 } 28 }
最終效果
3、表單表格混合匯出
模板
程式碼
1 public class FormTableTest 2 { 3 public static void Test() 4 { 5 Console.WriteLine($"表單表格混合"); 6 Stopwatch sw = new Stopwatch(); 7 Dictionary<string, object> data = new Dictionary<string, object>() 8 { 9 { "xmmc","測試姓名測試姓名111"}, 10 { "sqje","1417.4"}, 11 { "xmdw","部落格園Deeround"}, 12 { "glfs","自行管理方式"}, 13 { "xmgk","部落格園Deeround來函申請辦理 應急搶險治理工程專案竣工結(決)算,該專案已完工並通過專案初步驗收,現擬按程式採取政府購買服務方式開展評審"}, 14 { "psyj",""}, 15 { "gzyq", @"(一)對建設程式進行評審,包括可行性研究報告、初步設計等批准檔案的程式性審查。 16 (二)對建設規模、建設標準、可研執行情況等進行評審。 17 (三)對工程投資進行評審,包括工程計量、定額選用、材料價格及費用標準等的評審。 18 (四)對設施裝置資進行評審,包括設施裝置型號、規格、數量及價格的評審。 19 "}, 20 { "wcsx","1. 收到委託書後在10天內報送評審方案,評審完成後需提交評審報告紙質件7份及電子文件。"}, 21 { "ywcs","測試處"}, 22 { "lxr","李 123456"}, 23 }; 24 //明細資料 25 IList<Dictionary<string, object>> mx = new List<Dictionary<string, object>>(); 26 for (int i = 0; i < 10; i++) 27 { 28 mx.Add(new Dictionary<string, object>() { 29 { "a",i}, 30 { "b","專案概況表專案概況表專案概況表專案概況表專案概況表"}, 31 { "c","評審中"}, 32 }); 33 } 34 data.Add("mx", mx); 35 sw.Start(); 36 string root = System.AppDomain.CurrentDomain.BaseDirectory; 37 WordHelper.Export(root + Path.Combine("Templates", "temp_form_table.docx"), root + "temp_form_table_out.docx", data); 38 sw.Stop(); 39 var time = sw.ElapsedMilliseconds; 40 Console.WriteLine($"耗時:{time}毫秒"); 41 } 42 }
最終效果
4、例項
請看原始碼
簡單說明:
採用字串模板方式替換形式,之前也用過其他方式設定引數,多多少少會遇到些坑,還不如自定義字串靈活。
#:普通表單關鍵字使用#包裹
$:表格關鍵字使用$包裹,裡面使用.分割
原始碼下載:
DocXCore原始碼地址: https://github.com/deeround/DocXCore
上面demo原始碼:https://files.cnblogs.com/files/deeround/WordExportDemo.zip
&n