【问题标题】:Word Automation: Replace an Image using C#Word 自动化:使用 C# 替换图像
【发布时间】:2010-11-10 20:41:00
【问题描述】:

我正在尝试使用 c# 和 word 自动化来更改 word 文档中的文本和图像。我已经让它在我做下面的 sn-p 之类的文本时工作得很好,但我什至不知道如何开始替换图像。

非常感谢任何帮助!

奥利弗

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

【问题讨论】:

  • 很好奇你想做出什么样的解决方案。这是您在 Word 加载项中公开的功能,还是来自外部应用程序的某种批处理自动化?如果是外部的,我宁愿在 2007 年通过 OpenXML SDK 覆盖 WordML,或者在 2003 年使用 xml 来代替。做起来更快更容易。
  • 只是一个建议。使用 VB。它将使您在 COM 自动化领域的生活更轻松。至于替换图像,您可以查看“范围”,并且可能能够遍历其中的文本和对象以查找图像对象类型。
  • @roygbiv:+1。 VB 更容易实现 COM 自动化
  • @oktavakol:你想用什么替换图片?

标签: c# image automation ms-word replace


【解决方案1】:

您可以循环遍历 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
 }
}

【讨论】:

  • 优秀的代码!但是,是否可以将图片识别到循环中?这是因为我只需要将一张图片替换到我的自动化项目中,提前谢谢
  • 我知道这真的很老了,但是你可以真正区分形状的唯一方法是向它添加自定义信息。您可以添加超链接并使用地址,或使用TitleAlternativeText 属性(这些属性在Format Picture 对话框中的Alt Text 下可见)。
【解决方案2】:

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

对于内联形状,网上有很多例子。 对于形状,您可以这样做:

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

【讨论】:

    【解决方案3】:

    我只是从@Mario Favere 复制一些路径并使其更容易

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

    • 第二次需要在图片上右键添加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");                       
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-18
      • 2023-02-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多