Автоматизация Word: замена изображения с помощью C#

Я пытаюсь изменить текст и изображения в текстовом документе, используя С# и автоматизацию слов. У меня он отлично работает для текста, где я делаю что-то вроде фрагмента ниже, но я даже не знаю, как начать замену изображения.

Любая помощь приветствуется!

Оливер

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);

person Community    schedule 15.07.2009    source источник
comment
Любопытно, какое решение вы пытаетесь сделать. Это функция, которую вы предоставляете внутри надстройки Word, или это какая-то пакетная автоматизация из внешнего приложения? Если внешний, я бы предпочел переопределить WordML через OpenXML SDK для 2007 или просто возиться с xml, если вместо этого 2003. Гораздо быстрее и проще сделать.   -  person Jimmy Chandra    schedule 15.07.2009
comment
Просто предложение. Используйте ВБ. Это сделает вашу жизнь в мире COM Automation проще. Что касается замены изображений, вы можете заглянуть в «Диапазоны» и, возможно, сможете перебирать текст и объекты в них в поисках типов объектов изображения.   -  person    schedule 15.07.2009
comment
@roygbiv: +1. VB намного проще для автоматизации COM   -  person shahkalpeshp    schedule 15.07.2009
comment
@oktavakol: чем ты пытаешься заменить изображение?   -  person shahkalpeshp    schedule 15.07.2009


Ответы (3)


Вы можете перебрать InlineShapes и заменить изображения

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
 }
}
person Travis    schedule 09.10.2009
comment
Отличный код! Но можно ли идентифицировать картинку в петле? это потому, что мне нужно заменить только одно изображение в моем проекте автоматизации, спасибо заранее - person Ariel Gimenez; 28.06.2011
comment
Я знаю, что это действительно старо, но единственный способ, которым вы действительно можете отличить формы, — это добавить к ним пользовательскую информацию. Вы можете добавить гиперссылку и использовать адрес или использовать свойства Title или AlternativeText (они отображаются в диалоговом окне Format Picture под Alt Text). - person Chris; 24.03.2016

Вы хотите заменить фигуру или встроенную фигуру? Это большая разница!

Для встроенной формы в сети есть множество примеров. Для формы вы можете сделать так:

    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();
            }
        }
person Mario Favere    schedule 28.10.2019

Я просто копирую какой-то путь из @Mario Favere и упрощаю

  • Сначала создайте пустое изображение и вставьте изображение в документ Word.

введите здесь описание изображения

  • Во-вторых, нужно добавить замещающий текст, щелкните правой кнопкой мыши изображение.

введите здесь описание изображения

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");                       
    }
}
person Vanda Ros    schedule 16.04.2020