C# Word自动化:使用C替换图像#

C# Word自动化:使用C替换图像#,c#,image,automation,ms-word,replace,C#,Image,Automation,Ms Word,Replace,我正在尝试使用c#和word自动化更改word文档中的文本和图像。我已经让它在文本中工作得很好,我做了下面的代码片段,但我甚至不知道如何开始替换图像 非常感谢您的帮助 奥利弗 using Microsoft.Office.Interop.Word; ... private static Application WordApp; private static object missing = System.Reflection.Missing.Value; private static obje

我正在尝试使用c#和word自动化更改word文档中的文本和图像。我已经让它在文本中工作得很好,我做了下面的代码片段,但我甚至不知道如何开始替换图像

非常感谢您的帮助

奥利弗

using Microsoft.Office.Interop.Word;
...

private static Application WordApp;
private static object missing = System.Reflection.Missing.Value;
private static object yes = true;
private static object no = false;

...
object search;
object replace;

object replaceAll =
    Microsoft.Office.Interop.Word.WdReplace.wdReplaceAll;

object filename = SourceFile;
object destination = DestinationFile;

Document d = WordApp.Documents.Open(
    ref filename, ref missing, ref missing, ref missing, ref missing,
    ref missing, ref missing, ref missing, ref missing, ref missing,
    ref missing, ref missing, ref missing, ref missing, ref missing,
    ref missing);

d.Activate();
search = "OLDSTRING";
replace = "NEWSTRING";
WordApp.Selection.Find.Execute(
    ref search, ref yes, ref yes, ref no, ref no, ref no, ref yes,
    ref missing, ref missing, ref replace, ref replaceAll,
    ref missing, ref yes, ref missing, ref missing);

您可以在内联形状中循环并替换图片

using System.Collections.Generic;
using Word = Microsoft.Office.Interop.Word;

namespace WordExample
{
    class WordExample
    {
        #region Constructor
        public WordExample()
        {
            WordApp = new Microsoft.Office.Interop.Word.Application();
        }
        #endregion

        #region Fields
        private Word.Application WordApp;
        private object missing = System.Reflection.Missing.Value;
        private object yes = true;
        private object no = false;
        private Word.Document d;
        private object filename = @"C:\FullPathToFile\example.doc";
        #endregion

        #region Methods
        public void UpdateDoc()
        {
            d = WordApp.Documents.Open(ref filename, ref missing, ref no, ref missing,
               ref missing, ref missing, ref  missing, ref  missing, ref  missing,
               ref  missing, ref missing, ref yes, ref  missing, ref  missing, ref  missing, ref  missing);
            List<Word.Range> ranges = new List<Microsoft.Office.Interop.Word.Range>();
            foreach (Word.InlineShape s in d.InlineShapes)
            {
                if (s.Type == Microsoft.Office.Interop.Word.WdInlineShapeType.wdInlineShapePicture)
                {
                    ranges.Add(s.Range);
                    s.Delete();
                }
            }
            foreach (Word.Range r in ranges)
            {
                r.InlineShapes.AddPicture(@"c:\PathToNewImage\Image.jpg", ref missing, ref missing, ref missing);
            }
            WordApp.Quit(ref yes, ref missing, ref missing);
        }
        #endregion
 }
}
使用System.Collections.Generic;
使用Word=Microsoft.Office.Interop.Word;
名称空间单词示例
{
类单词示例
{
#区域构造函数
public WordExample()
{
WordApp=新的Microsoft.Office.Interop.Word.Application();
}
#端区
#区域字段
私有Word.applicationwordapp;
缺少私有对象=System.Reflection.missing.Value;
私有对象yes=true;
私有对象编号=false;
私人Word.d文件;
私有对象文件名=@“C:\FullPathToFile\example.doc”;
#端区
#区域方法
public void UpdateDoc()
{
d=WordApp.Documents.Open(参考文件名、参考缺失、参考编号、参考缺失、,
参考缺失,参考缺失,参考缺失,参考缺失,参考缺失,参考缺失,
参考缺失、参考缺失、参考是、参考缺失、参考缺失、参考缺失、参考缺失);
列表范围=新列表();
foreach(d.InlineShapes中的Word.InlineShapes)
{
if(s.Type==Microsoft.Office.Interop.Word.WdInlineShapeType.wdinlineshapectrure)
{
范围。添加(s.范围);
s、 删除();
}
}
foreach(范围中的单词范围r)
{
r、 InlineShapes.AddPicture(@“c:\PathToNewImage\Image.jpg”,缺少ref,缺少ref,缺少ref);
}
退出(引用是,引用缺失,引用缺失);
}
#端区
}
}

要替换形状还是内联形状?这是一个很大的不同

对于内联形状,网上有很多例子。 对于形状,可以执行以下操作:

    private object missing = System.Reflection.Missing.Value;
    .....other code.....



        foreach (Microsoft.Office.Interop.Word.Shape s in wordApp.ActiveDocument.Shapes)
        {

            if (s.AlternativeText.ToUpper().Contains("FOTO"))
            {
                object A = s.Anchor;
                Shape new = Brief.Shapes.AddPicture(@"mynewpicture.jpg", ref missing, ref missing, ref missing, ref missing, ref missing, ref missing,ref A);
                new.Top = s.Top;
                new.Left = s.Left;
                new.Width = s.Width;
                new.Height = s.Height;
                s.Delete();
            }
        }

我只是从@Mario Favere复制了一些路径,让它变得更简单

  • 首先创建空白图片并将图片插入word文档

  • 第二个需要添加Alt文本的右键点击图片


想知道你在尝试什么样的解决方案。这是您在Word加载项中公开的功能,还是来自外部应用程序的某种批处理自动化?如果是外部的,我宁愿在2007年通过OpenXMLSDK覆盖WordML,或者在2003年用xml替代。快得多,容易得多。只是一个建议。使用VB。这将使你在COM自动化领域的生活更加轻松。至于替换图像,您可以查看“范围”,并可以遍历其中的文本和对象以查找图像对象类型。@roygbiv:+1。VB对于COM来说要容易得多automation@oktavakol:您试图用什么替换图像?卓越的代码!但是如果有可能在循环中识别出一张图片呢?这是因为我只需要将一个图像替换到我的自动化项目中。谢谢。我知道这确实很旧,但唯一能真正区分形状的方法是向其中添加自定义信息。您可以添加超链接并使用地址,或使用
标题
可选文本
属性(这些属性在
设置图片格式
对话框中的
Alt Text
下可见)。
private object missing = System.Reflection.Missing.Value;
.....other code.....

// Change Image

foreach (Microsoft.Office.Interop.Word.Shape s in wordApp.ActiveDocument.Shapes)
{

    if (s.AlternativeText.ToUpper().Contains("POTO"))
    {
        s.Fill.UserPicture(@"PATH");                       
    }
}