一、通過“域”寫入數據
在Word中,打開【插入】選項卡——【文檔部件】——【域】,在【域】的功能對話框中,可以看到有全部、編號、等式和公式等多種類別,通過選擇這些類別,可以使用域來進行自動更新的相關功能。包括公式計算、變化的時間日期、郵件合並等。
除了利用上述步驟插入域外,也可以按Ctrl+F9手工輸入域。域實際上是Word中的代碼,按Shift+F9可以在代碼與計算結果之間進行切換。此處不理解也沒關系,看下面例子就可以了。
“《》”並不是自己手動打出來的,要通過文本域構建
插入文本域。(插入--->文檔部件--->域---->選擇MergeFileID--->填寫域名---->點擊保存)
按Alt + F9 是這個樣子的
這個“域”可以通過我們后台代碼動態的顯示我們需要的值,比如說《Name》 想要變成 Name:Ramon ,Title:《Title》變成 Ramon Title
二、代碼實現
1.在實現的同時我們也需要准備好Aspose.Words.dll 破解版 可以上網找....
2.如果不是破解版他會有水印和自動生成的表頭和底部信息(商用還是用正版吧)
添加一個AsposeWordHelper幫助類
using Aspose.Words; using Aspose.Words.Drawing; using System; using System.Collections.Generic; using System.Data; using System.IO; using System.Net; using System.Net.Http; using System.Net.Http.Headers; namespace WordHelper { /// <summary> /// word文檔操作輔助類 /// </summary> public class AsposeWordHelper { /// <summary> /// Word /// </summary> private Document _doc; private string _tempPath; private SaveFormat _saveFormat; /// <summary> /// /// </summary> /// <param name="tempPath">模板地址</param> /// <param name="saveFormat">轉換后的類型</param> public AsposeWordHelper(string tempPath, SaveFormat saveFormat = SaveFormat.Doc) { this._tempPath = tempPath; this._saveFormat = saveFormat; } /// <summary> /// 文本域處理泛型集合賦值 /// </summary> /// <typeparam name="TEntity"></typeparam> /// <param name="entity"></param> public void Execute<TEntity>(TEntity entity) { var type = entity.GetType(); var properties = type.GetProperties(); List<string> names = new List<string>(); List<string> values = new List<string>(); foreach (var item in properties) { names.Add(item.Name); values.Add(item.GetValue(entity, null).ToString()); } _doc.MailMerge.Execute(names.ToArray(), values.ToArray()); } /// <summary> /// 文本域處理鍵值對賦值 /// </summary> /// <param name="entity"></param> public void Execute(Dictionary<string, string> entity) { List<string> names = new List<string>(); List<string> values = new List<string>(); foreach (var item in entity) { names.Add(item.Key); values.Add(item.Value); } _doc.MailMerge.Execute(names.ToArray(), values.ToArray()); } /// <summary> /// 保存 /// </summary> /// <param name="filePath"></param> public void Save(string filePath) { _doc.Save(filePath, _saveFormat); } /// <summary> /// 基於模版新建Word文件 /// </summary> /// <param name="path">模板路徑</param> public void OpenTempelte() { _doc = new Document(_tempPath); } /// <summary> /// 書簽賦值用法 /// </summary> /// <param name="LabelId">書簽名</param> /// <param name="Content">內容</param> public void WriteBookMark(string LabelId, string Content) { if (_doc.Range.Bookmarks[LabelId] != null) { _doc.Range.Bookmarks[LabelId].Text = Content; } } /// <summary> /// 列表賦值用法 /// </summary> /// <param name="dt"></param> public void WriteTable(DataTable dt) { _doc.MailMerge.ExecuteWithRegions(dt); } /// <summary> /// 不可編輯受保護,需輸入密碼 /// </summary> /// <param name="pwd">密碼</param> public void NoEdit(string pwd) { _doc.Protect(ProtectionType.ReadOnly, pwd); } /// <summary> /// 只讀 /// </summary> public void ReadOnly() { _doc.Protect(ProtectionType.ReadOnly); } /// <summary> /// 添加圖片 /// </summary> /// <param name="filename">文件路徑+文件名</param> /// <param name="field">文本域名</param> /// <param name="width">寬</param> /// <param name="height">高</param> public void AddImage(string filename, string field, double width = 70, double height = 70) { DocumentBuilder builder = new DocumentBuilder(_doc); Shape shape = new Shape(_doc, ShapeType.Image); shape.ImageData.SetImage(filename); shape.Width = width;//設置寬和高 shape.Height = height; shape.WrapType = WrapType.None; shape.BehindText = true; builder.MoveToMergeField(field); builder.InsertNode(shape); } /// <summary> /// 通過流導出word文件 /// </summary> /// <param name="fileName">文件名</param> public HttpResponseMessage ExportWord(string fileName) { var stream = new MemoryStream(); _doc.Save(stream, SaveFormat.Doc); fileName += DateTime.Now.ToString("yyyyMMddHHmmss"); HttpResponseMessage result = new HttpResponseMessage(HttpStatusCode.OK); result.Content = new StreamContent(stream); result.Content.Headers.ContentType = new MediaTypeHeaderValue("application/msword"); result.Content.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment"); result.Content.Headers.ContentDisposition.FileName = fileName + ".doc"; return result; } /// <summary> /// 通過流導出pdf文件 /// </summary> /// <param name="fileName">文件名</param> public HttpResponseMessage ExportPdf(string fileName) { var stream = new MemoryStream(); _doc.Save(stream, SaveFormat.Doc); fileName += DateTime.Now.ToString("yyyyMMddHHmmss"); HttpResponseMessage result = new HttpResponseMessage(HttpStatusCode.OK); result.Content = new StreamContent(stream); result.Content.Headers.ContentType = new MediaTypeHeaderValue("application/pdf"); result.Content.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment"); result.Content.Headers.ContentDisposition.FileName = fileName + ".pdf"; return result; } } }
調用
using Aspose.Words; using Model.Model; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using WordHelper; namespace WordTest.App { class Program { private static readonly AsposeWordHelper _AsposeWordHelper; static Program() { _AsposeWordHelper = new AsposeWordHelper(@"C:\Users\NING MEI\Desktop\學習\test.docx"); } static void Main(string[] args) { //鍵值對 _AsposeWordHelper.OpenTempelte(); //打開定義好的模板 _AsposeWordHelper.Execute(new Dictionary<string, string>{ { "Name","Ramon"}, { "Title","Ramon Title"}, }); //替換域 賦值 _AsposeWordHelper.ReadOnly();// 可以設為只讀 _AsposeWordHelper.Save(@"C:\Users\NING MEI\Desktop\學習\1.doc");//保存到哪個路徑 //泛型 _AsposeWordHelper.OpenTempelte(); //打開定義好的模板 _AsposeWordHelper.Execute(new ContractModel() { Name = "Ramon", Title = "RamonTitle" }); //替換域 賦值 _AsposeWordHelper.ReadOnly();// 可以設為只讀 _AsposeWordHelper.Save(@"C:\Users\NING MEI\Desktop\學習\2.doc");//保存到哪個路徑 } } }
效果
代碼只是隨便的寫了下還有很多可以擴展的地方的,小編就懶得擴展了,這只是一個demo