OpenXML替换所有文档中的文本我有以下代码。我想用“NewText”替换文本“Text1”,这有效。但是当我将文本“Text1”放入表格时,它不再适用于表格中的“Text1”。我想在所有文件中进行替换。使用(WordprocessingDocumentdoc=WordprocessingDocument.Open(String.Format("c:\temp\filename.docx"),true)){varbody=doc.MainDocumentPart.Document.Body;foreach(varparainbody.Elements()){foreach(varruninpara.Elements()){foreach(vartextinrun.Elements()){if(text.Text.Contains("##Text1##"))text.Text=text.Text.Replace("##Text1##","NewText");您的代码不起作用,因为表格元素(w:tbl)未包含在段落元素(w:p)中。有关详细信息,请参阅以下MSDN文章。Text类(序列化为w:t)通常表示Word文档中Run元素中的文字文本。因此,如果文本元素(w:t)包含您的标记,您只需搜索所有w:t元素(Text类)并替换您的标记:使用(WordprocessingDocumentdoc=WordprocessingDocument.Open("yourdoc.docx",true)){varbody=doc.MainDocumentPart.Document.Body;foreach(vartextinbody.Descendants()){if(text.Text.Contains("##Text1##")){text.Text=text.Text.Replace("##Text1##","NewText");}}}借鉴了不同地方的一些其他答案,必须克服四个主要障碍:删除.任何高级Unicode字符(来自错误的用户输入)能够跨多个运行或段落中的文本元素搜索查找结果(Word通常会将单个句子拆分为多个文本运行)能够在替换文本中包含换行符,插入多个文档中的文本行。能够传入任何节点作为搜索的起点,以便将搜索限制在文档的该部分(例如文本、页眉、页脚、特定表格、表格行或表格单元格)。我确信书签、复杂嵌套等高级场景需要对此进行更多修改,但它适用于我目前遇到的基本word文档类型,并且比完全忽略运行或使用要好得多整个文件上的正则表达式,您无法将其定位到特定的TableCell或文档部分(对于高级方案)。使用方法示例:varbody=document.MainDocumentPart.Document.Body;替换文本(正文,替换,用);代码:使用系统;使用System.Collections.Generic;使用System.Linq;使用DocumentFormat.OpenXml;使用DocumentFormat.OpenXml.Packaging;使用DocumentFormat.OpenXml.Wordprocessing;namespaceMy.Web.Api.OpenXml{publicstaticclassWordTools{//////在指定段落内查找/替换。////////////publicstaticvoidReplaceText(Paragraphparagraph,stringfind,stringreplaceWith){vartexts=paragraph.Descendants();对于(intt=0;t0)lines[0]=txt.Text.Substring(0,c)+lines[0];//有一个前缀if(match.EndCharIndex+1(SpaceProcessingModeValues.Preserve);//如果你的值以空格开始/结束txt.Text=lines[0];//删除任何额外的文本。for(inti=t+1;i1){OpenXmlElementcurrEl=txt;Breakbr;//添加更多行varrun=txt.ParentasRun;for(inti=1;i(txt,currEl);t++;//跳到下一个文本元素currEl=txt;}c=跳过;//换行}else{//继续处理同一行c+=skip;}}}}}//////确定文本(从元素t开始,字符c)是否完全包含查找文本//////////////////null或结果信息静态匹配IsMatch(IEnumerable文本,intt,intc,字符串查找){intix=0;for(inti=t;i///定义一个匹配结果///classMatch{//////最后一个包含部分搜索文本的匹配元素索引///publicintEndElementIndex{get;set;}//////最后一个匹配元素中搜索文本的最后一个匹配字符索引///publicintEndCharIndex{get;set;}}}//class}//namespacepublicstaticclassOpenXmlTools{//过滤控制字符但允许仅格式正确的代理项序列privatestaticRegex_invalidXMLChars=newRegex(@"(?///删除任何无法编码为XML的异常unicode字符,这会在保存时产生异常///publicstaticstringRemoveInvalidXMLChars(stringtext){if(string.IsNullOrEmpty(text))return"";返回_invalidXMLChars.Replace(text,"");}}也许这个解决方案更简单以上是C#学习教程:OpenXML替换所有文档中的所有文本并共享所有内容。如果对大家有用,需要了解更多C#学习教程,希望大家多多关注——using(WordprocessingDocumentwordDoc=WordprocessingDocument.Open(document,true)){stringdocText=null;//1。使用(StreamReadersr=newStreamReader(wordDoc.MainDocumentPart.GetStream()))docText=sr.ReadToEnd();将所有文件复制到一个字符串中//2。使用正则表达式替换所有文本RegexregexText=newRegex(find);docText=regexText.Replace(docText,replace);//3。使用(StreamWritersw=newStreamWriter(wordDoc.MainDocumentPart.GetStream(FileMode.Create)))sw.Write(docText);再次将更改后的字符串写入文件中本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如有转载请注明出处:
