Docx内容替换

时间:2012-05-09 04:26:58

标签: c# replace openxml docx

using (WordprocessingDocument wordDoc = 
       WordprocessingDocument.Open(document, true))
{
    string docText = null;
    using (StreamReader sr = 
           new StreamReader(wordDoc.MainDocumentPart.GetStream()))
    {
        docText = sr.ReadToEnd();
    }

    Regex regexText = new Regex("@@username@@");
    docText = regexText.Replace(docText, "john thomas ");

    using (StreamWriter sw = 
           new StreamWriter(wordDoc.MainDocumentPart.GetStream(FileMode.Create)))
    {
        sw.Write(docText);
    }
}

这应该用代码中的名称替换doctext上的匹配项。我检查了doctext,并将要替换的单词(@@username@@)拆分。有时之间有XML内容 @@username@@。有时这个词本身就是畸形的。

如何替换@@username@@

3 个答案:

答案 0 :(得分:0)

一个简单的解决方法是将标记放在文本框或表格中(甚至可能使用预先指定的标识)。我不确定文档中是否有其他表格或文本框,但抓住表格中的内容或文档中唯一的文本框内的文本框非常简单。

答案 1 :(得分:0)

如果你在Paragraph对象中有代码,那么你可以做这样的事情(一个糟糕的Order n ^ 2解决方案....):

foreach (Paragraph para in wordprocessingDocument.MainDocumentPart.Document.Descendants<Paragraph>()) 
{
    foreach(Run r in para.Elements<Run>()) 
    {
          if (r.Elements<text>().ElementAt(0).Text.Equals(string_to_search)) 
              r.Elements<Text>().ElementAt(0).Text = string_to_insert;
    }
}

另外,请查看MSDN http://msdn.microsoft.com/en-us/library/office/ff478255.aspx

答案 2 :(得分:0)

你可以改变正则表达式。 (这将包括所有XML,但它将被替换)

New Regex("@@.*?username.*?@@")

操作代码是MSDN上记录的解决方案: https://msdn.microsoft.com/en-us/library/office/bb508261.aspx

如果要用不同的名称替换多个字段,可以尝试在读者和作者之间调用此函数:

    Private Function ReplaceMatches(ByVal text As String) As String
        Dim Matches = Regex.Matches(text, "@@.*?@@")
        For Each m As Match In Matches
            For Each c As Capture In m.Captures
                If Not String.IsNullOrEmpty(c.Value) Then
                    text = text.Replace(c.Value, "NEW-VALUE")
                End If
            Next
        Next
        Return text
    End Function
相关问题