在C#中用同一位置的图像替换文本

时间:2016-04-28 09:46:30

标签: c# ms-word office-interop

此代码正在用图像替换文本,但是它放置图像的多个副本并将它们放在文档的开头。我希望图像放置在文本存在的相同位置。我的查找文本在表格单元格中可用。是因为那个吗?

using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Diagnostics;
    using System.IO;
    using word = Microsoft.Office.Interop.Word;
    using System.Runtime.InteropServices;
    //using System.Drawing;


    namespace WritingIntoDocx
    {
        [ComVisible(true)]
        public interface IMyClass
        {

          void DocumentDigitalSign(string filep,string findt,string replacet);
        }


        [ComVisible(true)]
        [ClassInterface(ClassInterfaceType.None)]

       public class Program : IMyClass
        {
             public void DocumentDigitalSign(string filep, string findt, string imagepath)
            {
                string filepath = filep;
                string Findtext = findt;
                word.Application app = new word.Application();
                word.Document doc = app.Documents.Open(filepath);

                word.Range myStoryRange = doc.Range();

                //First search the main document using the Selection
                word.Find myFind = myStoryRange.Find;
                myFind.Text = Findtext;               myFind.Replacement.Application.Selection.InlineShapes.AddPicture(imagepath);
                myFind.Forward = true;
                myFind.Wrap = word.WdFindWrap.wdFindContinue;
                myFind.Format = false;
                myFind.MatchCase = false;
                myFind.MatchWholeWord = false;
                myFind.MatchWildcards = false;
                myFind.MatchSoundsLike = false;
                myFind.MatchAllWordForms = false;
                myFind.Execute(Replace: word.WdReplace.wdReplaceAll);

                //'Now search all other stories using Ranges
                foreach (word.Range otherStoryRange in doc.StoryRanges)
                {
                    if (otherStoryRange.StoryType != word.WdStoryType.wdMainTextStory)
                    {
                        word.Find myOtherFind = otherStoryRange.Find;
                        myOtherFind.Text = Findtext;          myOtherFind.Replacement.Application.Selection.InlineShapes.AddPicture(imagepath);
                        myOtherFind.Wrap = word.WdFindWrap.wdFindContinue;
                        myOtherFind.Execute(Replace: word.WdReplace.wdReplaceAll);
                    }

                    // 'Now search all next stories of other stories (doc.storyRanges dont seem to cascades in sub story)
                    word.Range nextStoryRange = otherStoryRange.NextStoryRange;
                    while (nextStoryRange != null)
                    {
                        word.Find myNextStoryFind = nextStoryRange.Find;
                        myNextStoryFind.Text = Findtext;
                        myNextStoryFind.Replacement.Application.Selection.InlineShapes.AddPicture(imagepath);
                        myNextStoryFind.Wrap = word.WdFindWrap.wdFindContinue;
                        myNextStoryFind.Execute(Replace: word.WdReplace.wdReplaceAll);

                        nextStoryRange = nextStoryRange.NextStoryRange;
                    }

                }
                app.Documents.Save();
                app.Documents.Close();
            }

        }


 }

1 个答案:

答案 0 :(得分:1)

Replacement.Application是对应用程序对象的引用。当你打电话给AddPicture()时,图片会立即插入当前位置,然后才能执行查找操作。

我看到两种可能性:

  1. 加载图片,将其放入Windows剪贴板,然后执行指定“^ c”作为替换文本的查找操作。 Word将使用剪贴板的当前内容替换“^ c”。这就是documentation所说的:
  2.   

    ReplaceWith
      键入:System.Object
      可选对象。
      替换文字。要删除Find参数指定的文本,请使用空字符串(“”)。您可以像查找参数一样指定特殊字符和高级搜索条件。要指定图形对象或其他非文本项作为替换项,请将项移动到剪贴板并为ReplaceWith指定“^ c”。

    1. 不要使用wdReplaceAll,而是使用wdReplaceNone,以便find操作本身不会进行任何替换。但是,您有机会在找到的地方插入您的内容。在循环中执行此操作,直到找不到更多事件。