2012-05-09 120 views
2
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("@@[email protected]@"); 
    docText = regexText.Replace(docText, "john thomas "); 

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

這應該用代碼中的名稱替換doctext上的匹配項。我檢查了doctext和替換字(@@[email protected]@)是分裂的。在 @@[email protected]@之間有時會有XML內容。有時這個詞本身是畸形的。Docx內容替換

如何替換@@[email protected]@

+3

爲什麼你不使用處理合並功能來提供字段的內容而不是濫用正則表達式? –

+0

作爲DOCX文件格式專家,我真的懷疑你可以使用字符串函數對DOCX文件的內容進行操作。我建議使用Aspose.Words或[Spire](http://www.e-iceblue.com/Introduce/word-for-net-introduce.html)。 –

回答

0

一個簡單的解決方法是將標籤放在文本框或表格中(甚至可以使用預先指定的標識)。我不確定文檔中是否有其他表格或文本框,但是抓取表格或文檔中唯一文本框內的文本內容非常簡單。

0

如果你有一個段落對象內部代碼,那麼你可以做這樣的事情(一個貧窮的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

0

你可以改變正則表達式。 (這將包括所有的XML,但它會被替換)

New Regex("@@.*?username.*[email protected]@") 

的OPS代碼是記錄在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, "@@.*[email protected]@") 
     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