本文使用的是Microsoft.Office.Interop.Word組件,必須在系統安裝了office相關組件的條件下進行,在com裏面找到Microsoft Word 16.0 Object Library並引用。c#
問題:使用c#操做word替換佔位符的時候,當要替換的字符串超過必定的長度,就會提示「字符串參量過長」,搜索發現,替換的最大長度爲255字符。安全
以220個字符串爲例,執行替換工做。app
//構造數據 Dictionary<string, string> datas = new Dictionary<string, string>() { { "{name}", "張三" }, { "{sex}", "男" }, { "{provinve}", "浙江" } }; //模板文件 object path = Server.MapPath("/Template/template.docx"); //生成文件 string physicNewFile = Server.MapPath("/createdfile/" + Guid.NewGuid().ToString() + ".docx");
/// <summary> /// 根據模板生成替換文件並下載 /// </summary> /// <param name="path">文件/模板地址</param> /// <param name="datas">須要替換的key:value集合</param> /// <param name="physicNewFile">生成文件地址</param> public void ReplaceToWord(object path, Dictionary<string, string> datas, string physicNewFile) { Microsoft.Office.Interop.Word.Application app = null; Microsoft.Office.Interop.Word._Document doc = null; object oMissing = System.Reflection.Missing.Value; try { app = new Microsoft.Office.Interop.Word.Application(); object fileName = path; //打開模板文件 doc = app.Documents.Open(ref fileName, ref oMissing, ref oMissing, ref oMissing, ref oMissing, ref oMissing, ref oMissing, ref oMissing, ref oMissing, ref oMissing, ref oMissing, ref oMissing, ref oMissing, ref oMissing, ref oMissing, ref oMissing); object replace = Microsoft.Office.Interop.Word.WdReplace.wdReplaceAll; foreach (var item in datas) { app.Selection.Find.Replacement.ClearFormatting(); app.Selection.Find.ClearFormatting(); if (item.Value.Length > 220) FindAndReplaceLong(app, item.Key, item.Value); else FindAndReplace(app, item.Key, item.Value); } //對替換好的word模板另存爲一個新的word文檔 doc.SaveAs(physicNewFile, oMissing, oMissing, oMissing, oMissing, oMissing, oMissing, oMissing, oMissing, oMissing, oMissing, oMissing, oMissing, oMissing, oMissing, oMissing); //準備導出word Response.Clear(); Response.Buffer = true; Response.Charset = "utf-8"; Response.AddHeader("Content-Disposition", "attachment;filename=" + DateTime.Now.ToString("yyyyMMddHHmmssss") + ".doc"); Response.ContentEncoding = System.Text.Encoding.GetEncoding("utf-8"); Response.ContentType = "application/ms-word"; Response.End(); } catch (Exception ex) { throw ex; } finally { if (doc != null) { //關閉word文檔 doc.Close(ref oMissing, ref oMissing, ref oMissing); doc = null; } if (app != null) { //退出word應用程序 app.Quit(ref oMissing, ref oMissing, ref oMissing); app = null; } //GC.Collect(); //GC.WaitForPendingFinalizers(); //GC.Collect(); //GC.WaitForPendingFinalizers(); //若是文件存在則輸出到客戶端 if (System.IO.File.Exists(physicNewFile)) { Response.WriteFile(physicNewFile); } } }
/// <summary> /// 根據字符串長度執行替換操做 /// </summary> /// <param name="wordApp">當前word程序</param> /// <param name="findText">佔位符(key)</param> /// <param name="replaceText">替換字符串(值)</param> public void FindAndReplaceLong(Microsoft.Office.Interop.Word.Application wordApp, object findText, object replaceText) { int len = replaceText.ToString().Length; //要替換的文字長度 int cnt = len / 220; //不超過220個字 string newstr; object newStrs; if (len < 220) //小於220字直接替換 { FindAndReplace(wordApp, findText, replaceText); } else { for (int i = 0; i <= cnt; i++) { if (i != cnt) newstr = replaceText.ToString().Substring(i * 220, 220) + findText; //新的替換字符串 else newstr = replaceText.ToString().Substring(i * 220, len - i * 220); //最後一段須要替換的文字 newStrs = newstr; FindAndReplace(wordApp, findText, newStrs); //進行替換 } } }
/// <summary> /// 執行替換操做 /// </summary> /// <param name="wordApp">當前word程序</param> /// <param name="findText">佔位符(key)</param> /// <param name="replaceText">替換字符串(值)</param> public void FindAndReplace(Microsoft.Office.Interop.Word.Application wordApp, object findText, object replaceText) { //object oMissing = System.Reflection.Missing.Value; object matchCase = true; object matchWholeWord = true; object matchWildCards = false; object matchSoundsLike = false; object matchAllWordForms = false; object forward = true; object format = false; object matchKashida = false; object matchDiacritics = false; object matchAlefHamza = false; object matchControl = false; object read_only = false; object visible = true; object replace = 2; //object replace = Microsoft.Office.Interop.Word.WdReplace.wdReplaceAll; object wrap = 1; wordApp.Selection.Find.Execute(ref findText, ref matchCase, ref matchWholeWord, ref matchWildCards, ref matchSoundsLike, ref matchAllWordForms, ref forward, ref wrap, ref format, ref replaceText, ref replace, ref matchKashida, ref matchDiacritics, ref matchAlefHamza, ref matchControl); // wordApp.Selection.Find.Execute( ref oMissing, ref oMissing,ref oMissing, ref oMissing,ref oMissing, ref oMissing, ref oMissing, ref oMissing, ref oMissing,ref oMissing, ref replace, //ref oMissing, ref oMissing,ref oMissing, ref oMissing); }
Asp.Net操做Word內容ide
若是要正常操做Word Com組件的話,必需要給用戶賦上足夠的權限的,ui
一、運行Dcomcnfg.exe二、組件服務――計算機――個人電腦――DCOM配置――找到microsoft word 文檔
三、點擊屬性
四、選擇「安全性」
五、選定「使用自定義訪問權限」和「使用自定義啓動權限」
六、分別編輯權限,添加ASPNET,VS Developers,Debugger User //不必定
七、選擇「身份標識」,在選定「交互式用戶」 便可 (關鍵步驟)必須
八、在Web.config里加 <identity impersonate="true"/>spa
參考地址:https://blog.csdn.net/lutaotony/article/details/51789666.net