从c#中的word文档中替换普通文本

时间:2011-11-16 18:27:12

标签: c# ms-word interop

我在word文档中插入我的应用程序中的一些数据,然后再次保存。我现在使用的代码适用于放在word文档中的表中的文本,但它不会得到不在表中的文本。例如,word文档的第一页不在表格中,代码跳过第一页并立即转到第二页,其中有一个文本放在表格中,它正在替换文本。 这是我的代码:

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 个答案:

答案 0 :(得分:3)

首先,您在更改每个单元格后保存文档 - 没有必要这样做。第二个也是更重要的是你在第一个段落之后关闭文档,所以下一个(段落)将抛出异常。

我建议使用类似于以下代码的内容,它会将所有出现的“[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);

答案 1 :(得分:0)

你走在正确的轨道上。你需要在你的大号if:

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

文字已经是一个字符串,BTW。

这符合您现有的代码(因为我复制并粘贴了它),但我认为您想要一些不同的东西:

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