none
Presentation PowerPoint SmartArt RRS feed

  • Question

  • Bonjour,

    Je demande votre aide car je n'arrive pas à créer de SmartArt en C#, que ce soit à partir de la méthode AddSmartArt(), ConvertTextToSmartArt() ou même après insertion à partir d'un autre fichier (InsertFromFile()) il m'est impossible de le modifier.

    Voici un exemple quand je l’insère à partir d'un autre fichier :

    objSlides.InsertFromFile("Test.pptx", 4, 1, 1);
    
    foreach (Microsoft.Office.Interop.PowerPoint.Shape shape in objPres.Slides[5].Shapes)
    {
    	//Check if shape is of SmartArt type
    	//if (shape is Microsoft.Office.Core.SmartArt)
    	if (shape.HasSmartArt.ToString() == "msoTrue")
    	{
    		//Typecast shape to SmartArt
    		Microsoft.Office.Core.SmartArt smart = (Microsoft.Office.Core.SmartArt)shape.SmartArt;
    		Microsoft.Office.Core.SmartArtLayout artLayout = smart.Layout;
    		try
    		{
    			objPres.Slides[5].Shapes.AddSmartArt(artLayout, 50, 50, 200, 200);
    		}
    		catch (Exception ex)
    		{
    			System.Windows.Forms.Application.Exit();
    		}
    	}
    }

    Mais ça ne fonctionne quand même pas... Même si j'essaye de le modifier.

    Comment puis-je faire ?

    Merci beaucoup.

    mardi 4 février 2014 15:22

Réponses

  • Veuillez vérifier les types des objets.

    Le code qui fonctionne bien pour moi c'est :

    using PowerPoint = Microsoft.Office.Interop.PowerPoint;
    using Office = Microsoft.Office.Core;
    namespace CsPPT
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
            }
    
            private void button1_Click(object sender, EventArgs e)
            {
                PowerPoint.Application  oPowerPoint = new PowerPoint.Application();
                PowerPoint.Presentations oPres = oPowerPoint.Presentations;
                PowerPoint.Presentation oPre = oPres.Add(Office.MsoTriState.msoFalse);
                oPre.SaveAs(@"d:\temp\a.ppt");
                oPre.Close();
                oPre = oPres.Open(@"d:\temp\a.ppt");
                PowerPoint.Slides  oSlides = oPre.Slides;
                PowerPoint.Slide oSlide = oSlides.Add(1, PowerPoint.PpSlideLayout.ppLayoutText);
                Office.SmartArtLayout myLayout = oSlide.Application.SmartArtLayouts[1];
                Console.WriteLine(myLayout.Name);
            }
        }
    }
    

    Cordialement,


    Aurel BERA, MSFT
    MSDN Community Support. LE CONTENU EST FOURNI "TEL QUEL" SANS GARANTIE D'AUCUNE SORTE, EXPLICITE OU IMPLICITE.
    S'il vous plaît n'oubliez pas de "Marquer comme réponse" les réponses qui ont résolu votre problème. C'est une voie commune pour reconnaître ceux qui vous ont aidé, et rend plus facile pour les autres visiteurs de trouver plus tard la résolution.

    • Marqué comme réponse DJunior59 lundi 10 février 2014 12:25
    jeudi 6 février 2014 13:42
  • Bonjour

    Je dirais que c'est le cas de ouvrir un bug sur connect.microsoft.com.

    Avec la fenêtre invisible, on a un message d’erreur.

    Avec la fenêtre PowerPoint visible le code fonctionne bien.

    Une astuce peut-être de utiliser  OpenXML :

    http://msdn.microsoft.com/fr-fr/library/gg583880(v=office.14).aspx

    Cordialement,

     


    Aurel BERA, MSFT
    MSDN Community Support. LE CONTENU EST FOURNI "TEL QUEL" SANS GARANTIE D'AUCUNE SORTE, EXPLICITE OU IMPLICITE.
    S'il vous plaît n'oubliez pas de "Marquer comme réponse" les réponses qui ont résolu votre problème. C'est une voie commune pour reconnaître ceux qui vous ont aidé, et rend plus facile pour les autres visiteurs de trouver plus tard la résolution.

    • Marqué comme réponse DJunior59 lundi 10 février 2014 12:24
    lundi 10 février 2014 09:26

Toutes les réponses

  • Bonjour

    Quel est le comportement? Il y a un message d'erreur?
    En place de quitter l'application en cas d'exception, sera utile d'afficher un message d'erreur et le partager avec nous?

    Merci!

    Cordialement,


    Aurel BERA, MSFT
    MSDN Community Support. LE CONTENU EST FOURNI "TEL QUEL" SANS GARANTIE D'AUCUNE SORTE, EXPLICITE OU IMPLICITE.
    S'il vous plaît n'oubliez pas de "Marquer comme réponse" les réponses qui ont résolu votre problème. C'est une voie commune pour reconnaître ceux qui vous ont aidé, et rend plus facile pour les autres visiteurs de trouver plus tard la résolution.

    mercredi 5 février 2014 12:45
  • Bonjour,

    Merci de votre réponse rapide.

    Voici un exemple d'erreur lors de l’exécution de ces 2 lignes :

    Microsoft.Office.Core.SmartArtLayout artLayout1 = objApp.SmartArtLayouts[8];
    objPres.Slides[5].Shapes.AddSmartArt(artLayout1, 10, 125);
    System.Runtime.InteropServices.COMException (0x80048010): Application (unknown member) : Object does not exist.
       à Microsoft.Office.Interop.PowerPoint.ApplicationClass.get_SmartArtLayouts()

    J'en conclus que dès l'essai de créer un SmartArtLayout, ça ne fonctionne pas... Pourquoi ? Je n'en ai aucun idée.

    J'en ai donc importé un à partir d'un autre fichier et je l'ai copié grâce à ces commandes :

    objSlides.InsertFromFile(@"C:\Users\ISEN\Documents\Visual Studio 2010\Projects\PowerPointTest\PowerPointTest\bin\Debug\Test.pptx", 4, 1, 1);
    foreach (Microsoft.Office.Interop.PowerPoint.Shape shape in objPres.Slides[5].Shapes)
    {
    	if (shape.HasSmartArt.ToString() == "msoTrue")
    	{
    		Microsoft.Office.Core.SmartArt smart = (Microsoft.Office.Core.SmartArt)shape.SmartArt;
    		Microsoft.Office.Core.SmartArtLayout artLayout = smart.Layout;
    		try
    		{
    			objPres.Slides[5].Shapes.AddSmartArt(artLayout, 50, 50, 200, 200);
    		}
    		catch (Exception ex)
    		{
    			MessageBox.Show(ex.Message);
            	}
    	}
    }

    Lorsque j’exécute ce code, rien ne se passe, je ne peux plus interagir avec l'application.

    Merci de votre aide.

    mercredi 5 février 2014 15:57
  • Bonjour

    Voir la réponse marquée dans ce thread:

    http://social.msdn.microsoft.com/Forums/en-US/b178cc69-d226-4ae1-a11a-050d513c6309/creating-smartart-in-powerpoint?forum=officegeneral

    Cordialement,


    Aurel BERA, MSFT
    MSDN Community Support. LE CONTENU EST FOURNI "TEL QUEL" SANS GARANTIE D'AUCUNE SORTE, EXPLICITE OU IMPLICITE.
    S'il vous plaît n'oubliez pas de "Marquer comme réponse" les réponses qui ont résolu votre problème. C'est une voie commune pour reconnaître ceux qui vous ont aidé, et rend plus facile pour les autres visiteurs de trouver plus tard la résolution.

    jeudi 6 février 2014 11:27
  • Bonjour,

    Encore une fois, merci de votre réponse et du temps que vous accordez à mon problème.

    Pour ma part, j'essayais déjà d'insérer un SmartArt à partir d'un PowerPoint déjà existant (et plus précisément un .potx).

    J'ai tout de même essayé la solution proposée en exécutant ces quelques lignes :

    objPres.SaveAs(@"test.pptx", Microsoft.Office.Interop.PowerPoint.PpSaveAsFileType.ppSaveAsDefault, Microsoft.Office.Core.MsoTriState.msoTrue);
    objPres.Close();
    objPres = objPresSet.Open(@"test.pptx", Microsoft.Office.Core.MsoTriState.msoFalse, Microsoft.Office.Core.MsoTriState.msoFalse, Microsoft.Office.Core.MsoTriState.msoFalse);
    objSlides = objPres.Slides;
    objSlide = objSlides.Add(6, Microsoft.Office.Interop.PowerPoint.PpSlideLayout.ppLayoutText);
    Microsoft.Office.Core.SmartArtLayout myLayout = objSlide.Application.SmartArtLayouts[1];

    Mais j'obtiens tout de même l'erreur suivante :

    L'exception COMException n'a pas été gérée
    
    Application (unknown member) : Object does not exist.

    Et l'erreur indique que c'est la dernière ligne qui provoque cette erreur :

    Microsoft.Office.Core.SmartArtLayout myLayout = objSlide.Application.SmartArtLayouts[1];

    Pour information, j'utilise la version 14.0.0.0 de Microsoft.Office.Interop.Powerpoint et la version 2.7 de Microsoft Office 15 Object Library.

    Merci de votre aide.

    jeudi 6 février 2014 12:14
  • Veuillez vérifier les types des objets.

    Le code qui fonctionne bien pour moi c'est :

    using PowerPoint = Microsoft.Office.Interop.PowerPoint;
    using Office = Microsoft.Office.Core;
    namespace CsPPT
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
            }
    
            private void button1_Click(object sender, EventArgs e)
            {
                PowerPoint.Application  oPowerPoint = new PowerPoint.Application();
                PowerPoint.Presentations oPres = oPowerPoint.Presentations;
                PowerPoint.Presentation oPre = oPres.Add(Office.MsoTriState.msoFalse);
                oPre.SaveAs(@"d:\temp\a.ppt");
                oPre.Close();
                oPre = oPres.Open(@"d:\temp\a.ppt");
                PowerPoint.Slides  oSlides = oPre.Slides;
                PowerPoint.Slide oSlide = oSlides.Add(1, PowerPoint.PpSlideLayout.ppLayoutText);
                Office.SmartArtLayout myLayout = oSlide.Application.SmartArtLayouts[1];
                Console.WriteLine(myLayout.Name);
            }
        }
    }
    

    Cordialement,


    Aurel BERA, MSFT
    MSDN Community Support. LE CONTENU EST FOURNI "TEL QUEL" SANS GARANTIE D'AUCUNE SORTE, EXPLICITE OU IMPLICITE.
    S'il vous plaît n'oubliez pas de "Marquer comme réponse" les réponses qui ont résolu votre problème. C'est une voie commune pour reconnaître ceux qui vous ont aidé, et rend plus facile pour les autres visiteurs de trouver plus tard la résolution.

    • Marqué comme réponse DJunior59 lundi 10 février 2014 12:25
    jeudi 6 février 2014 13:42
  • Bonjour,

    Le code que vous m'avez fourni fonctionne effectivement chez moi.

    J'ai fini par trouver l'erreur : c'est lors de l'ouverture de mon fichier que ça ne fonctionne pas.

    En effet, je ne souhaite pas que la personne voit l'application PowerPoint s'ouvrir, c'est pourquoi j'avais mis la 3ème composante de la fonction open() à msoFalse. Et quand je fais ça, il m'indique l'erreur "Object does not exist".

    oPre = oPres.Open(@"d:\temp\a.ppt", Office.MsoTriState.msoFalse, Office.MsoTriState.msoFalse, Office.MsoTriState.msoFalse);

    Comment cela se fait-il ?

    Je suis donc obligé d'afficher PowerPoint à l'utilisateur pour gérer les SmartArt ?

    Merci beaucoup pour votre aide.

    Cordialement.

    vendredi 7 février 2014 17:42
  • Bonjour

    Je dirais que c'est le cas de ouvrir un bug sur connect.microsoft.com.

    Avec la fenêtre invisible, on a un message d’erreur.

    Avec la fenêtre PowerPoint visible le code fonctionne bien.

    Une astuce peut-être de utiliser  OpenXML :

    http://msdn.microsoft.com/fr-fr/library/gg583880(v=office.14).aspx

    Cordialement,

     


    Aurel BERA, MSFT
    MSDN Community Support. LE CONTENU EST FOURNI "TEL QUEL" SANS GARANTIE D'AUCUNE SORTE, EXPLICITE OU IMPLICITE.
    S'il vous plaît n'oubliez pas de "Marquer comme réponse" les réponses qui ont résolu votre problème. C'est une voie commune pour reconnaître ceux qui vous ont aidé, et rend plus facile pour les autres visiteurs de trouver plus tard la résolution.

    • Marqué comme réponse DJunior59 lundi 10 février 2014 12:24
    lundi 10 février 2014 09:26
  • D'accord, je vais regarder ça, ou je vais laisser la fenêtre visible.

    Merci beaucoup pour votre aide, elle m'aura été très utile.

    En vous remerciant aussi du temps que vous m'avez accordez.

    Bonne journée !

    Cordialement.

    lundi 10 février 2014 12:24