2009-06-09 10 views
1

Je veux extraire des données à partir de diapositives PowerPoint, puis les coller dans classeur Excel, où chaque diapositive dans PowerPoint correspond à une feuille dans classeur Excel et vice-versa (d'Excel à PowerPoint).VSTO PowerPoint/Excel interaction

Comment faire? J'ai extrait les données PowerPoint mais maintenant comment puis-je faire envoyer des données à Excel? Quelles options/possibilités ai-je?

J'utilise VSTO avec C#, s'il vous plaît me dire des solutions pour le bureau 2003/2007

Répondre

3

lui Manzoor,

Votre question est un peu ouvert terminé, et je ne suis pas vraiment sûr de ce genre des valeurs PowerPoint que vous essayez de placer dans Excel, mais vous pouvez certainement utiliser Excel Automation pour atteindre votre objectif. Par exemple, quelque chose comme ceci:

void AutomateExcelExample() 
{ 
    Excel.Application excelApp = new Excel.Application(); 
    excelApp.Visible = true; 

    Excel.Workbook workbook = excelApp.Workbooks.Add(Type.Missing); 
    Excel.Worksheet worksheet = (Excel.Worksheet)workbook.Worksheets[1]; 
    Excel.Range range = worksheet.get_Range("A1", Type.Missing); 

    range.set_Value(Type.Missing, "Hello World"); 

    MessageBox.Show("Intentional pause so you can see the result."); 

    // Cleanup: 
    GC.Collect(); 
    GC.WaitForPendingFinalizers(); 

    Marshal.FinalReleaseComObject(range); 
    Marshal.FinalReleaseComObject(worksheet); 

    workbook.Close(false, Type.Missing, Type.Missing); 
    Marshal.FinalReleaseComObject(workbook); 

    excelApp.Quit(); 
    Marshal.FinalReleaseComObject(excelApp); 
} 

Dans l'exemple ci-dessus, le code ouvre une nouvelle instance d'application Excel, rend l'application visible (que vous ne voulez probablement pas à faire, mais peut être utile lors du test), ouvre un nouveau classeur, puis affecte la valeur de chaîne "Hello World" dans la cellule A1 de la première feuille de calcul dans le classeur.

Je ne sais pas quel genre de données PowerPoint que vous récupérez, mais une cellule Excel peut gérer les types de valeurs les plus standards tels que chaîne, double, bool, DateTime, etc.

Cette solution fonctionnera aussi bien avec ou sans VSTO, et fonctionnera pour les versions Excel 2007 et ultérieures ainsi que pour les versions Excel 2003 et suivantes.

Est-ce que cela vous aide à démarrer?

Mike

4

Cet échantillon est principalement correct, sauf pour la routine de nettoyage qui est faux ...

La partie

// Cleanup:  
GC.Collect();  
GC.WaitForPendingFinalizers(); 

doit être déplacé à la fin de cette méthode comme si ..

Marshal.FinalReleaseComObject(range);  
Marshal.FinalReleaseComObject(worksheet);  
workbook.Close(false, Type.Missing, Type.Missing);  
Marshal.FinalReleaseComObject(workbook);  
excelApp.Quit();  
Marshal.FinalReleaseComObject(excelApp); 

// move deterministic call to garbage collector to AFTER release 
// of all COM objects. 
GC.Collect();  
GC.WaitForPendingFinalizers(); 

GC.Collect(); 

C'est parce qu'il est inutile d'essayer de finaliser le file d'attente des objets COM avant même que la plupart de ces objets aient été placés dans la file d'attente de finalisation. De même, l'appel préventif de GC.Collect provoquera une traversée supplémentaire des objets en mémoire, ce qui aura un impact négatif sur les performances et ne garantira pas que les objets sont nettoyés.

Egalement un autre problème avec cet exemple, pourquoi utilisez-vous les méthodes Set_Value et get_Range? Cela semble inutile. Pour ce qui est de la question, je pense que vous devrez ajouter des instructions foreach pour parcourir les diapositives de l'objet de présentation et, une fois que vous aurez collecté les données souhaitées, ajouter une nouvelle diapositive dans le champ l'itération de diapositive actuelle.

à savoir

foreach slide in Presentation.Slides() 
{ 
    string data = getData(slide); 
    Excel.WorkSheet worksheet = workbook.Sheets.Add(Type.Missing); 
    worksheet.Range("A1").Value = data; 
} 
// you will need to write the getData method yourself... 

question de côté VB.NET ... Pour la personne qui pose au sujet de l'échantillon VB.Net de ce qui précède ...

  1. Retirez les points-virgules.

  2. Remplacer toutes les instances de Type.Missing avec BLANK (ie "pas d'espace")

  3. Remplacer get_range() avec .Range()

  4. Remplacer set_value() avec .Value()

  5. Ajoutez une instruction Imports Excel = Microsoft.Office.Interop.Excel au sommet de votre classe.
+0

hey merci! j'apprécie! – Justin

+0

pas de problème, la prochaine fois donner un upvote si cela vous aide ou vous le trouvez factuellement correct. –