2010-01-17 238 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);