【问题标题】:Powerpoint could not open filePowerpoint 无法打开文件
【发布时间】:2013-03-08 13:09:22
【问题描述】:

我正在开发一个创建 PowerPoint 演示文稿的 C# 程序。但是,我遇到了以下指令的问题:

Presentation pres = pres_set.Open(path,
  Microsoft.Office.Core.MsoTriState.msoFalse,
  Microsoft.Office.Core.MsoTriState.msoTrue,
  Microsoft.Office.Core.MsoTriState.msoTrue);

此指令仅在某些时候有效。如果没有,它会抛出异常消息“PowerPoint 无法打开文件”。当我然后手动打开模板文件,关闭它并再次执行该函数时,大多数情况下它会正确执行。

我使用过 Microsoft Powerpoint 14.0 和 Microsoft Powerpoint 12.0 库,但都有同样的问题。

有什么办法可以避免这个奇怪的问题吗?

【问题讨论】:

  • 如果英语不是您的母语,您更有理由使用拼写检查器。也就是说,除了你的拼写之外,理解你原本出色的英语是没有问题的。
  • 你为什么不接受这个解决方案?它会对其他人有所帮助。

标签: c# vsto powerpoint


【解决方案1】:

答案要简单得多:Powerpoint 应用程序需要一个现有文件。

我刚刚遇到了同样的异常,因为我使用了相对路径,而 PowerPoint 尝试打开相对于 PowerPoint.exe 而不是您的 Program.exe 的文件。

这个问题可以通过在调用 open-method 之前添加这样的东西来快速解决:

// Start Powerpoint
var powerpointApp = new Microsoft.Office.Interop.PowerPoint.Application();
// Get a fileInfo object to generate the full path
FileInfo fileInfo = new FileInfo(@"RelativeDir\YourPresentation.pptx");
// Use the full path
powerpointApp.Presentations.Open(fileInfo.FullName, MsoTriState.msoTrue, WithWindow: MsoTriState.msoFalse);

【讨论】:

  • 很好的答案。谢谢亚历山大!
【解决方案2】:

你试过不设置 TriState,像这样吗?

Object oMiss = System.Reflection.Missing.Value; 
Presentation pres = pres_set.Open(ref path, ref oMiss, ref oMiss, ref oMiss); 

【讨论】:

  • 我尝试了这个解决方案,但它给出了错误“指定的演员表无效”
【解决方案3】:

我在尝试打开现有的 PowerPoint 演示文稿时遇到了同样的问题,直到我发现我的 Office 安装选项中没有安装 Visual Basic for Applications (VBA),如下所述:

http://www.debugging.com/bug/22261

显然,此问题仅在使用 PowerPoint 时发生,因为我在处理 Excel 和 Word 文件时没有问题。

当我修复我的 Office(包括安装的 VBA)后,问题就消失了。

希望对你有帮助!

【讨论】:

    【解决方案4】:

    我在使用 PowerPoint 时遇到了类似的问题。我发现我的 Presentations.Open 方法失败了,除非我打开了 PowerPoint。

    一种可能的解决方案是设置PowerPointApplication.Visible = MsoTriState.msoTrue 但是,这会导致 PowerPoint 物理打开,这可能是不受欢迎的。

    我通过将 Open 方法的最后一个参数设置为 msoFalse 解决了我的问题,这指定 PowerPoint 窗口不应在服务器上打开,这是更可取的。

    Presentations.Open(inputFileName, 
                       MsoTriState.msoFalse, 
                       MsoTriState.msoTrue,
                       MsoTriState.msoFalse);
    

    查看this MSDN KB article,了解有关 Open 方法的不同参数的更多信息。

    【讨论】:

      【解决方案5】:
              ProcessStartInfo ten_ct = new ProcessStartInfo();
              ten_ct.FileName = "POWERPNT.EXE";
              ten_ct.Arguments = @"D:\project\GiaoAn\GiaoAn\MyPpt.pptx";
              Process.Start(ten_ct);
      

      【讨论】:

        【解决方案6】:

        我在 Excel 中遇到过类似的问题,即使我尝试以用户身份启动它并打开命令行文件也是如此。因此,您的程序可能没有任何问题。当我作为用户执行此操作时,通常它会第二次起作用。

        所以我的建议是要么

        1) 让您的程序先尝试在没有文件的情况下打开 Power Point,等待(从 5 秒开始),然后让它尝试加载文件。

        2) 您的程序可以捕获异常,如果失败,只需尝试再次打开文件(如果您发现这可行,则应添加最大尝试次数,因此程序不会循环尝试执行此操作一整天)。您还可以选择检查文件是否存在(如果在您的场景中可能存在这种情况 - 但听起来这不是您当前面临的问题)。

        【讨论】:

        • 你的意思是打开Power Point这个代码Application app = new Application(); app.Visible = Microsoft.Office.Core.MsoTriState.msoTrue;还是我必须在程序文件夹中的某处打开 powerpoint.exe?
        • 你应该尝试两者(如果需要),显然第一个更容易尝试。
        【解决方案7】:

        试试这个:

        Presentation pres = pres_set.Open(path, 
          Microsoft.Office.Core.MsoTriState.msoFalse, 
          Microsoft.Office.Core.MsoTriState.msoTrue, 
          Microsoft.Office.Core.MsoTriState.msoFalse);
        

        【讨论】:

          【解决方案8】:

          我使用以下方法解决了这个问题:

                  var app = new PP.Application();
                  PP.Presentation pres = null;
                  try
                  {
                      Process.Start(inputFile);
                      var presCol = app.Presentations;
                      // Waiting for loading
                      Thread.Sleep(2000);
                      pres = presCol[inputFile];
                      // Your code there
                      // ...............
                  }
                  catch (System.Exception ex)
                  {
                      Log.Error(ex.Message);
                      throw;
                  }
                  finally
                  {
                      if (pres != null)
                      {
                          pres.Close();
                      }
                      if (app != null)
                      {
                          app.Quit();
                      }
                      pres = null;
                      app = null;
                  }
          

          【讨论】:

          • 等待进程以 Thread.Sleep 启动是一种非常糟糕的做法(因为您无法预测启动需要多长时间),在任何情况下都应该避免!
          猜你喜欢
          • 1970-01-01
          • 2017-04-22
          • 2014-02-08
          • 1970-01-01
          • 1970-01-01
          • 2019-01-06
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多