2012-05-09 3 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]@) разделено. Существует иногда содержимое XML между @@ и [email protected]@. Иногда само слово порокло.Замена содержимого Docx

Как заменить @@[email protected]@?

+3

Почему вы не используете функции слияния слов, чтобы предоставлять поля с содержимым вместо неправильного использования регулярного выражения? –

+0

Не являясь экспертом по формату файлов DOCX, я действительно сомневаюсь, что вы можете работать со строковыми функциями в содержимом файла DOCX. Я предлагаю использовать Aspose.Words или [Spire] (http://www.e-iceblue.com/Introduce/word-for-net-introduce.html). –

ответ

0

Простым обходным путем является наличие тега в текстовом поле или таблице (возможно, даже с заданным номером). Я не уверен, есть ли у вас другие таблицы или текстовые поля в документе, но захватывать то, что внутри таблицы или текстовое поле внутри единственного в документе, очень просто.

0

Если у вас есть код внутри объекта Paragraph, то вы могли бы сделать что-то вроде этого (бедную порядка п 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

Вы можете просто изменить Regex. (Это будет включать в себя все XML, но он будет заменен)

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

опам код решение задокументированы на 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 
Смежные вопросы