C# COMException 读取 属性 of MSWord Shape 对象 Microsoft.Office.Interop.Word

C# COMException reading property of MSWord Shape object Microsoft.Office.Interop.Word

我正在尝试遍历文档中的所有形状并检查它们的 "Alternate Text",其中已将该图像的源文件名记录为替代文本。我需要读取特定的源图像并将它们转换为不同的图像格式。

我能够阅读形状的 AlternateText,但它抛出异常: '((Microsoft.Office.Interop.Word.Shape)(s)).AlternativeText' 引发了 'System.Runtime.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?看起来应该是很直接的。

感谢您提供的任何帮助。

我不确定为什么会这样,但我可以使用形状的 "Select" 方法解决这个问题。一旦选择了形状,就会填充以前抛出错误的大部分属性。仍然有大约 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);
            }
        }