2010-01-17 175 views
3

我正在开发创建PowerPoint演示文稿的C#程序。但是,我遇到以下指令的问题:Powerpoint无法打开文件

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库,但两者都有相同的问题。

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

+2

如果英语不是您的母语,您有更大的理由使用拼写检查器。这就是说,除了你的拼写外,理解你优秀的英语是没有问题的。 – Zano 2010-01-17 16:02:08

+0

你为什么不接受解决方案?它会帮助其他人。 – Sampath 2013-08-23 05:54:37

回答

0

我已经在Excel中看到类似这样的问题,即使当我尝试以打开的命令行文件的用户身份启动它时也是如此。所以你的程序可能没有什么问题。当我以用户身份执行此操作时,通常它会第二次运行。

所以我的建议是,要么

1)你的程序尝试没有文件先打开电源点,等待(开始5秒),然后把它尝试加载该文件。

2)你的程序可以捕获该异常,并简单地尝试打开该文件,如果再失败(如果你发现这个工程,你应该增加尝试的最大数量,所以程序没有按” t循环尝试整天这样做)。你也可以选择查看文件是否存在(如果这是你的场景中的可能性 - 但它听起来不像是目前你面临的问题)。

+0

您是否打开Power Point此代码 Application app = new Application(); app.Visible = Microsoft.Office.Core.MsoTriState.msoTrue; 或者我必须在程序文件文件夹中的某处打开powerpoint.exe? – sander 2010-01-18 18:54:49

+0

你应该尝试两个(如果需要),第一个显然更容易尝试。 – 2010-01-20 03:55:09

1

您是否尝试过不设置TriState?

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

我试过这个解决方案,但它给出错误“指定的转换无效” – sander 2010-01-18 18:50:01

0

试试这个:

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

我有一个类似的问题与PowerPoint。我发现我的Presentations.Open方法失败,除非我打开PowerPoint。

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

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

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

有关Open方法的不同参数的更多信息,请参阅this MSDN KB article

-1

我使用解决这个问题:

 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; 
     } 
+0

等待一个以Thread.Sleep开始的进程是一个非常糟糕的做法(因为你无法预测启动需要多长时间),应该是在任何情况下都避免! – 2014-02-24 14:37:56

5

答案是简单得多:在PowerPoint应用程序预计现有文件。

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

这个问题可以很快通过调用open-方法之前加入这样的固定:

// 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); 
+0

万启动,这解决了我的问题,谢谢你 – 2013-03-27 12:53:09

+0

伟大的答案。谢谢亚历山大! – 2014-11-11 21:25:51

1

试图打开一个现有的PowerPoint演示文稿,直到我发现,Visual Basic,为我有同样的问题应用程序(VBA)这里描述并没有在我的Office安装选项安装:

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

显然,使用PowerPoint工作时,因为我没有PROBL这个问题只发生ems操作Excel和Word文件。

只要我修复了我的Office,包括VBA到安装,问题就消失了。

希望它有帮助!

1
 ProcessStartInfo ten_ct = new ProcessStartInfo(); 
     ten_ct.FileName = "POWERPNT.EXE"; 
     ten_ct.Arguments = @"D:\project\GiaoAn\GiaoAn\MyPpt.pptx"; 
     Process.Start(ten_ct);