Получить заменить нормальный текст из документа Word в C # - PullRequest
2 голосов
/ 16 ноября 2011

Я вставляю некоторые данные из моего приложения в текстовый документ и затем сохраняю их снова.Код, который у меня сейчас есть, работает нормально для текста, который помещается в таблицу в документе word, но не получает текст, которого нет в таблице.Например, 1-я страница документа word не находится в таблице, и код пропускает 1-ю страницу и сразу переходит на 2-ю страницу, где в таблицу помещается текст, и он заменяет текст, как и должно быть.Вот код, который у меня есть:

Document docc = app.Documents.Open(ref path, ref o, ref readOnly, ref o, ref o, ref o, ref o, ref o, ref o, ref o, ref o, ref o, ref o, ref o, ref o, ref o);
 docc.Activate();
 try
 {
      foreach (Paragraph p in docc.Paragraphs)
      {
           Range rng = p.Range;
           Style sty = (Style)p.get_Style();                      

           if ((bool)rng.get_Information(WdInformation.wdWithInTable) == true)
           {
                foreach (Cell c in rng.Cells)
                {
                     if (rng.Cells.Count > 0)
                     {
                          string testtt = c.Range.Text.ToString();
                          if (c.Range.Text.ToString().Contains("[Company_Name]\r\a"))
                               //   c.Next.Range.Text = "Sacramento";
                               c.Range.Text = "Sacramento";
                     }
                }
                docc.Save();                        
           }
           docc.Close(ref o, ref o, ref o);
      }
 }

Я знаю, что эта строка:

 if ((bool)rng.get_Information(WdInformation.wdWithInTable) == true)

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

Ответы [ 2 ]

3 голосов
/ 17 ноября 2011

Прежде всего, вы сохраняете документ после изменения каждой ячейки - в этом нет необходимости.Во-вторых, что более важно, вы закрываете документ после первого абзаца, поэтому следующий (абзац) вызовет исключение.

Я бы порекомендовал использовать что-то вроде следующего кода, он заменяет все вхождения «[Company_Name]» на «Sacramento» (во всем документе).

using Word = Microsoft.Office.Interop.Word;
using System.Reflection;
using System.Runtime.InteropServices;

...

object o = Missing.Value;
object oFalse = false;
object oTrue = true;

Word._Application app = null;
Word.Documents docs = null;
Word.Document doc = null;

object path = @"C:\path\file.doc";

try
{
    app = new Word.Application();
    app.Visible = false;
    app.DisplayAlerts = Word.WdAlertLevel.wdAlertsNone;

    docs = app.Documents;
    doc = docs.Open(ref path, ref o, ref o, ref o, ref o, ref o, ref o, ref o, ref o, ref o, ref o, ref o, ref o, ref o, ref o, ref o);
    doc.Activate();

    foreach (Word.Range range in doc.StoryRanges)
    {
        Word.Find find = range.Find;
        object findText = "[Company_Name]";
        object replacText = "Sacramento";
        object replace = Word.WdReplace.wdReplaceAll;
        object findWrap = Word.WdFindWrap.wdFindContinue;

        find.Execute(ref findText, ref o, ref o, ref o, ref oFalse, ref o,
            ref o, ref findWrap, ref o, ref replacText,
            ref replace, ref o, ref o, ref o, ref o);

        Marshal.FinalReleaseComObject(find);
        Marshal.FinalReleaseComObject(range);
    }

    doc.Save();
    ((Word._Document)doc).Close(ref o, ref o, ref o);
    app.Quit(ref o, ref o, ref o);
}
finally
{
    if (doc != null)
        Marshal.FinalReleaseComObject(doc);

    if (docs != null)
        Marshal.FinalReleaseComObject(docs);

    if (app != null)
        Marshal.FinalReleaseComObject(app);
}

Есть две важные вещи:

1) Никогда не используйте две точки с COM-объектами:

// might be a problem soon:
app.Documents.Open(....

// better way:
Documents docs = app.Documents;
Document doc = docs.Open(...

2) Отпустите их, как только вы этого не сделаетенужны они в обратном порядке:

if (doc != null)
    Marshal.FinalReleaseComObject(doc);

if (docs != null)
    Marshal.FinalReleaseComObject(docs);
0 голосов
/ 16 ноября 2011

Вы на правильном пути.Вам нужно будет добавить еще один к своему большому, если:

else {
    if (rng.Text.Contains("[Company_Name]\r\a"))
           rng.Text = "Sacramento";
}

Текст уже строка, кстати.

Это соответствует вашему существующему коду (потому что я скопировал и вставил его),но я думаю, что вы хотите что-то немного другое:

rng.Text.Replace ("[CompanyName]","Sacramento");
...