2010-01-17 3 views
3

Je développe un programme C# qui crée une présentation PowerPoint. Cependant, je courais un problème avec l'instruction suivante:Powerpoint n'a pas pu ouvrir le fichier

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

Cette instruction ne fonctionne que parfois. Si ce n'est pas le cas, il déclenche une exception avec le message "PowerPoint n'a pas pu ouvrir le fichier". Lorsque j'ouvre ensuite manuellement le fichier modèle, fermez-le et relancez la fonction, la plupart du temps, il s'exécutera correctement.

Je l'ai utilisé Microsoft Powerpoint 14.0 et Microsoft Powerpoint 12.0 bibliothèques, mais les deux ont le même problème.

Est-il possible d'éviter ce problème étrange?

+2

Si l'anglais n'est pas votre langue maternelle, vous avez une raison encore plus grande d'utiliser un vérificateur d'orthographe. Cela dit, en dehors de votre orthographe, il n'y a aucun problème à comprendre votre anglais autrement excellent. – Zano

+0

Pourquoi n'acceptez-vous pas la solution? Ça va aider les autres. – Sampath

Répondre

0

J'ai vu des problèmes comme celui-ci avec Excel, même lorsque je tente de le lancer en tant qu'utilisateur avec un fichier en ligne de commande pour ouvrir. Donc, ce n'est peut-être pas un problème avec votre programme. Lorsque je fais cela en tant qu'utilisateur, habituellement cela fonctionne la deuxième fois.

Donc, mon conseil serait soit

1) Pour votre programme pour essayer d'ouvrir d'abord Power Point sans le fichier, attendez (commencer avec 5 secondes), puis l'avoir essayer de charger le fichier.

ou

2) Votre programme peut attraper l'exception, et essayez simplement d'ouvrir le fichier si elle échoue (et si vous trouvez cela fonctionne, vous devez ajouter un nombre maximum d'essais, de sorte que le programme n » t boucle en essayant de faire cela toute la journée). Vous pouvez également vérifier si le fichier existe (si cela est possible dans votre scénario, mais cela ne semble pas être le problème auquel vous êtes actuellement confronté).

+0

Voulez-vous dire par l'ouverture de Power Point ce code Application application = new Application(); app.Visible = Microsoft.Office.Core.MsoTriState.msoTrue; ou dois-je ouvrir le fichier powerpoint.exe quelque part dans le dossier des fichiers du programme? – sander

+0

Vous devriez essayer les deux (si nécessaire), le premier étant évidemment plus facile à essayer. –

1

Avez-vous essayé de ne pas régler la TriState, comme celui-ci?

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

J'ai essayé cette solution, mais elle donne l'erreur "Distribution spécifiée n'est pas valide" – sander

0

Essayez ceci:

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

J'ai eu un problème similaire avec PowerPoint. J'ai trouvé que ma méthode Presentations.Open échouait à moins que PowerPoint ne soit ouvert.

Une solution possible consiste à définir PowerPointApplication.Visible = MsoTriState.msoTrue Toutefois, cela entraînera l'ouverture physique de PowerPoint, ce qui risque d'être indésirable.

Je résolu mon problème en réglant le dernier argument de la méthode ouverte msoFalse, qui précise que la fenêtre PowerPoint ne doit pas ouvrir sur le serveur qui est plus souhaitable.

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

Jetez un oeil à this MSDN KB article pour plus d'informations sur les différents paramètres de la méthode Open.

-1

je résoudre ce problème en utilisant:

 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

En attente d'un processus pour démarrer avec Thread.Sleep est une très mauvaise pratique (car vous ne pouvez pas prédire combien de temps il faudra pour démarrer) et devrait être évité en toutes circonstances! –

5

La réponse est beaucoup plus simple: Le Powerpoint application attend un fichier existant.

Je viens d'avoir la même exception parce que j'utilisé un chemin relatif et PowerPoint essayé d'ouvrir le fichier par rapport à powerpoint.exe au lieu de votre Program.exe.

Ce problème peut être rapidement résolu en ajoutant quelque chose comme ça avant d'appeler la méthode ouverte:

// 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

Millions commence, cela résout mon problème, MERCI MAN –

+0

Grande réponse. Merci Alexander! –

1

J'ai eu le même problème en essayant d'ouvrir une présentation PowerPoint existante jusqu'à ce que j'ai découvert que Visual Basic pour applications (VBA) n'a pas été installé sur mes options d'installation de bureau comme décrit ici:

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

Apparemment, ce problème ne se produit que lorsque vous travaillez avec PowerPoint comme je ne probl ems manipulant des fichiers Excel et Word.

Le problème est parti dès que j'ai réparé mon bureau, y compris le VBA à l'installation.

J'espère que ça aide!

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