.net C# COMException阅读MSWord Shape对象的属性Microsoft.Office.Interop.Word

gzjq41n4  于 2023-10-21  发布在  .NET
关注(0)|答案(1)|浏览(110)

我试图通过一个文件中的所有形状循环,并检查其“替代文本”,其中已为该图像记录为它的替代文本的源文件名。我需要读取特定的源图像并将其转换为不同的图像格式。
我能够到达阅读形状的AlternateText的点,但它抛出一个异常:“((Microsoft.Office.Interop.Word.Shape)).AlternativeText”引发了类型为“System. System.InteropServices.COMException”的异常
当我设置一个断点并查看“s”对象时,大多数属性都抛出了这个异常,但是有些属性没有,例如我可以读取LinkFormat属性和其他一些属性而没有问题,但是大多数属性都抛出了一个错误。
下面是我正在使用的代码:

Word.Application WordApp = new Word.Application();
        d = WordApp.Documents.Open(@strFilename, ReadOnly: true, Visible: false);
        int iReplacements = 0;
        int iReplacementNoLink = 0;

        foreach (Word.Shape s in d.Shapes)
        {
            Application.DoEvents();
            try
            {
                if (s.LinkFormat.SourceName.ToString().Contains(".eps") || s.LinkFormat.SourceName.ToString().Contains(".png"))
                {
                    iReplacements++;
                }
                if (s.AlternativeText != "")
                {
                    iReplacementNoLink++;
                }

            }
            catch (Exception fff)
            {
                Console.Write(fff);
            }
        }

检查s.AlternateText的if语句总是在catch中结束。
我正在使用Visual Studio 2013和Office 2007,我不确定这是否相关。
谁能告诉我我需要做什么才能阅读形状的替代文本?如果我以错误的方式去做,或者需要包括一个库,或者如果我需要升级VS或Office?它看起来应该是非常直接的。
感谢您提供的任何帮助。

e3bfsja2

e3bfsja21#

我不知道为什么这工作,但我能够解决这个问题,通过使用“选择”的形状方法。一旦选择了形状,以前抛出错误的大多数属性都将被填充。仍然有大约20个属性抛出错误,但我现在能够访问以前抛出错误的“AlternativeText”,“Name”,“Callout”等内容。

Word.Application WordApp = new Word.Application();
        d = WordApp.Documents.Open(@strFilename, ReadOnly: true, Visible: false);
        int iReplacements = 0;
        int iReplacementNoLink = 0;
        foreach (Word.Shape s in d.Shapes)
        {
            Application.DoEvents();
            try
            {
                //if (s.Type == Microsoft.Office.Core.MsoShapeType.msoLinkedPicture)
                if (s.LinkFormat.SourceName.ToString().Contains(".eps") || s.LinkFormat.SourceName.ToString().Contains(".png"))
                {
                    iReplacements++;
                }
                s.Select();
                if (s.AlternativeText != "" && s.AlternativeText != null)
                {
                    iReplacementNoLink++;
                }

            }
            catch (Exception fff)
            {
                Console.Write(fff);
            }
        }

相关问题