Как заменить текст в docx

276
05 июня 2017, 21:17

Есть документ с содержимым вроде "Привет [[username]]". Нужно программно заменить "[[username]]" на свой текст не испортив форматирование и не используя word.

Answer 1

Добавить в References Microsoft.Office.Interop.Word и использовать replace(string fileName, string findText, string replaceText) из кода, приведенного ниже

using Word = Microsoft.Office.Interop.Word;
...
protected static void ReplaceWord(Word.Range range, object findText, object replaceText)
{
  object matchCase = false;
  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 = Word.WdReplace.wdReplaceAll;
  object wrap = Word.WdFindWrap.wdFindContinue;
  range.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);
  foreach (Word.Shape shape in range.ShapeRange)
    if (Convert.ToBoolean(shape.TextFrame.HasText).Equals(true))
      ReplaceWord(shape.TextFrame.TextRange, findText, replaceText);
}
public static replace(string fileName, string findText, string replaceText)
{
  Word.Application objWord = new Word.Application();
  try
  {
    Word.Document doc = objWord.Documents.Open(fileName);
    foreach (Word.Range range in doc.StoryRanges)
      ReplaceWord(range, findText, replaceText);
    foreach (Word.Section section in doc.Sections)
    {
      foreach (Word.HeaderFooter headerFooter in section.Headers)
        ReplaceWord(headerFooter.Range, findText, replaceText);
      foreach (Word.HeaderFooter headerFooter in section.Footers)
        ReplaceWord(headerFooter.Range, findText, replaceText);
    }
    doc.Save();
    object save = false;
    object missing = null;
    doc.Close(ref save, ref missing, ref missing);
  }
  catch (Exception ex)
  {
  }
  objWord.Quit();
}
READ ALSO
SqlBulkCopy вылетает по TimeOut

SqlBulkCopy вылетает по TimeOut

Сначала пытался закинуть в SqlBulkCopy DataTable из 1000 (Для теста), но получил ошибку таймаута

277
Передача данных между формами

Передача данных между формами

Здравствуй ХэшКод, скажите у меня есть

347
Entity Framework и сборщик мусора

Entity Framework и сборщик мусора

Или все привязано к контексту и нужно его пересоздавать?

258
json.net Как сериализовать такой объект?

json.net Как сериализовать такой объект?

jsonnet обычно сериализует словарь в коллекцию:

259