专栏首页林德熙的博客通过 COM 读取 Office PPT 文件提示 COMException 错误码 0x80004005 可能原因

通过 COM 读取 Office PPT 文件提示 COMException 错误码 0x80004005 可能原因

使用 COM 的方式可以调用本机的 Office 组件进行 PPT 以及 Word 和 Excel 等文件的读写,在打开文件的时候,如果提示 System.Runtime.InteropServices.COMException (0x80004005) 就意味着这是一个通用的错误,没有具体的原因

调用 COM 组件,提示 System.Runtime.InteropServices.COMException (0x80004005): Error HRESULT E_FAIL has been returned from a call to a COM component. 表示发现通用的错误,或者未知的错误。我记录一些主要注意的事情,方便大家按照顺序去找是否此原因

STA 线程问题

如果当前线程不是 STA 线程,那么有一些文档打开将会提示此错误

如以下代码打开 PPT 文件

                Application = new Application();
                Presentation = Application.Presentations.Open(ppt.FullName + PASSWORD_MARK, MsoTriState.msoTrue,
                MsoTriState.msoFalse,
                MsoTriState.msoFalse);

        /// <summary>
        /// 使用密码打开ppt(如果课件无密码则正常导入,密码错误则会抛密码错误异常,这里我们使用一个密码“PASSWORD”进行解密);详见:https://stackoverflow.com/questions/17554892/unable-to-gracefully-abort-on-unknown-password-via-microsoft-office-interop-powe
        /// </summary>
        private const string PASSWORD_MARK = "::PASSWORD::";

在 Presentations.Open 提示 System.Runtime.InteropServices.COMException (0x80004005) 可能是因为当前线程不是 STA 线程。判断线程方法如下

                if (Thread.CurrentThread.GetApartmentState() == ApartmentState.STA)
                {
                    
                }

行为就是在 WPF 端可以调用,但是在单元测试时失败。解决方法是新建一个 STA 线程执行,新建 STA 线程方法如下

                var thread = new Thread(() =>
                {
                    // 执行逻辑
                })
                {
                    IsBackground = true
                };
                thread.SetApartmentState(ApartmentState.STA);

后缀名不符

例如我有文件是 PPT 格式的,但是我更改了后缀名为 PPTX 格式,那么此时也将会抛出如上错误

最简单判断是 PPT 还是 PPTX 的方法就是使用压缩方法去读取,能读取的就是 PPTX 格式,否则就是 PPT 格式。当然以上方法只是简单的方法而已,对于加密的 PPTX 格式文件或者其他非 PPT 和 PPTX 格式也没有解决

更多请看 Office 使用 OpenXML SDK 解析文档博客目录

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 通过解读 WPF 触摸源码,分析 WPF 插拔设备触摸失效的问题(问题篇)

    发布于 2018-08-15 07:42 更新于 2018-08...

    walterlv
  • .Net调用Office Com组件的原理及问题:检索com类工厂组件检索 COM 类工厂中 CLSID 为 {XXX} 的组件失败

    最近在本地64位win10操作系统+vs2015+office2010(卸载了2016,因为高版本反而不支持),做PPT文档的解析成HTML,在部署到windo...

    csxiaoyao
  • 在Windows10安装Docker遇到问题的解决方法

    在 Windows 上安装Docker是一个相当简单和直接的过程,之前接触Docker是在 Centos 系统下,在 Windows 下并没有尝试过

    沈唁
  • dotnet OpenXML 幻灯片 PPTX 的 Slide Id 和页面序号的关系

    在使用 OpenXML SDK 进行 Office 文档的解析时,对幻灯片 PPTX 文档的页面解析也许会遇到页面顺序的问题,本文告诉大家在 Office 文档...

    林德熙
  • dotnet OpenXML 简单聊聊 PPT 文本解析

    在 Office 里面的文本解析最全的范围是 Word 文本,就是属性数量本身就特别多。本文只是简单和大家聊聊 Office 里面的 PPT 的文本的解析入门。...

    林德熙
  • dotnet OpenXML 为什么资源使用 Relationship 引用

    在 OpenXML 文档格式里面,所有的资源以及页面之间的引用等,都是通过 Relationship 的引用,如资源需要通过 GetReferenceRelat...

    林德熙
  • dotnet OpenXML 解析 WPS 不规范的 PPT 文件的 cNvPr 重复 id 问题

    在收到了反馈说有一份课件,打开解析就发现替换的元素不对,原因是这个课件里面的 Slide Master 里面存在一个元素的 id 和某个页面的元素 id 是相同...

    林德熙
  • dotnet OpenXML 图片特效的 BiLevel 黑白特效修改图片颜色

    在 Office 中,如 PPT 和 Word 可以不对原图修改的前提下,通过叠加特效的方式,提供对图片的视觉输出进行修改的方法,本文将介绍 ECMA 376 ...

    林德熙
  • 使用 Microsoft.UI.Xaml 解决 UWP 控件和对老版本 Windows 10 的兼容性问题

    发布于 2018-07-21 13:51 更新于 2018-07...

    walterlv

扫码关注云+社区

领取腾讯云代金券