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

时间:2016-03-16 18:10:12

标签: c# .net com ms-word

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

我能够达到读取形状的AlternateText但它会引发异常: '((Microsoft.Office.Interop.Word.Shape)(S))AlternativeText&#39。抛出了#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?看起来它应该是非常直接的。

感谢您提供任何帮助。

1 个答案:

答案 0 :(得分:2)

我不确定为什么会这样,但我能够通过使用" 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);
            }
        }