Meilleur auteur de réponses
Transférer un graphique Excel dans C#

Question
-
Voici la routine suivante:
// Initialisation Excel.Application xlApp; Excel.Workbook xlWorkBook; Excel.Worksheet xlWorkSheet; object misValue = System.Reflection.Missing.Value; xlApp = new Excel.ApplicationClass(); xlWorkBook = xlApp.Workbooks.Add(misValue); xlWorkSheet = (Excel.Worksheet) xlWorkBook.Worksheets.get_Item(1); // Préparer les données xlWorkSheet.Cells[1, 1] = ""; xlWorkSheet.Cells[1, 2] = "Étudiant 1"; xlWorkSheet.Cells[1, 3] = "Étudiant 2"; xlWorkSheet.Cells[1, 4] = "Étudiant 3"; xlWorkSheet.Cells[2, 1] = "Terme 1"; xlWorkSheet.Cells[2, 2] = "80"; xlWorkSheet.Cells[2, 3] = "65"; xlWorkSheet.Cells[2, 4] = "45"; xlWorkSheet.Cells[3, 1] = "Terme 2"; xlWorkSheet.Cells[3, 2] = "78"; xlWorkSheet.Cells[3, 3] = "72"; xlWorkSheet.Cells[3, 4] = "60"; xlWorkSheet.Cells[4, 1] = "Terme 3"; xlWorkSheet.Cells[4, 2] = "82"; xlWorkSheet.Cells[4, 3] = "80"; xlWorkSheet.Cells[4, 4] = "65"; xlWorkSheet.Cells[5, 1] = "Terme 4"; xlWorkSheet.Cells[5, 2] = "75"; xlWorkSheet.Cells[5, 3] = "82"; xlWorkSheet.Cells[5, 4] = "68"; // Initialisation du graphique Excel.Range chartRange; Excel.ChartObjects xlCharts = (Excel.ChartObjects)xlWorkSheet.ChartObjects(Type.Missing); Excel.ChartObject myChart = (Excel.ChartObject)xlCharts.Add(10, 80, 300, 250); Excel.Chart chartPage = myChart.Chart; chartRange = xlWorkSheet.get_Range("A1", "D5"); chartPage.SetSourceData(chartRange, misValue); chartPage.ChartType = Excel.XlChartType.xlColumnClustered; // Transfert de l'image chartPage.CopyPicture(); var getImage = Clipboard.GetImage(); picGraphiqueTempsArrêt.Image = new Bitmap(getImage); // Fermeture Excel xlWorkBook.Close(false, misValue, misValue); xlApp.Quit(); // Terminaison System.Runtime.InteropServices.Marshal.FinalReleaseComObject(xlWorkSheet); xlWorkSheet = null; System.Runtime.InteropServices.Marshal.FinalReleaseComObject(xlWorkBook); xlWorkBook = null; System.Runtime.InteropServices.Marshal.FinalReleaseComObject(xlApp); xlApp = null; GC.Collect(); GC.WaitForPendingFinalizers();
Je suis en mesure de copier le graphique généré manuellement dans Paint mais pas dans le programme C#.
var getImage = Clipboard.GetImage();
getImage contient «null» comme résultat alors que le presse-papier contient le graphique désiré.
Suggestions?
Luc Saucier
Réponses
-
Vous pouvez convertir le type MetaFilePict en Image:
Image image = (Image)data.GetData(DataFormats.MetafilePict);
Ou bien:
Image image = (Image)data.GetData(DataFormats.EnhancedMetafile);
Sami CHNITER Software Engineer
- Proposé comme réponse Sami CHNITER mercredi 20 mars 2013 18:48
- Marqué comme réponse Aurel Bera jeudi 21 mars 2013 08:08
Toutes les réponses
-
Bonjour,
Au lieu d'appeler Clipboard.GetImage() essayez d'appeler Clipboard.GetDataObject()
Cette dernière renvoie un IDataObject. Par la suite, vous pouvez avoir le type de format retourné par IDataObject.
Un extrait de code peut vous aider:
var dataObject = Clipboard.GetDataObject(); string formatOfDataObject = dataObject.GetFormats();
Cordialement.
chniter sami
-
Bonjour Sami,
J'ai exécuté le code proposé pour obtenir le résultat suivant:
// string formatOfDataObject[4]
formatOfDataObject[0] = "Preferred DropEffect"; formatOfDataObject[1] = "InShellDragLoop"; formatOfDataObject[2] = "EnhancedMetafile"; formatOfDataObject[3] = "MetaFilePict";
Je ne sais pas comment traîter les informations obtenues.
Suggestions?
Luc Saucier
- Modifié LucSaucierSILS jeudi 14 mars 2013 16:53
-
Bonjour,
Si vous voulez enregistrer le graphique obtenu en tant que image, vous devez tester si le type de format retourné est Bitmap (image) ou non et après faire la conversion et enregistrer l'image, voila un extrait de code peut vous aider:
if (Clipboard.GetDataObject() != null) { IDataObject data = Clipboard.GetDataObject(); if (data.GetDataPresent(DataFormats.Bitmap)) { Image image = (Image)data.GetData(DataFormats.Bitmap,true); image.Save("image.bmp",System.Drawing.Imaging.ImageFormat.Bmp); image.Save("image.jpg",System.Drawing.Imaging.ImageFormat.Jpeg); image.Save("image.gif",System.Drawing.Imaging.ImageFormat.Gif); } else { MessageBox.Show("The Data In Clipboard is not as image format"); } } else { MessageBox.Show("The Clipboard was empty"); }
Cordialemet.
Sami CHNITER Software Engineer
- Modifié Sami CHNITER jeudi 14 mars 2013 17:41
-
Bonjour,
Le graphique n'est pas du format image selon les tests que j'ai fait:
var tampon = data.GetDataPresent(DataFormats.Bitmap);
La variable tampon retourne faux. Donc le format n'est pas une image.
J'ai essayé de rendre le format de l'image compatible avec l'objet chart mais je n'ai pas réussi.
var tampon = dataObject.GetDataPresent(DataFormats.MetafilePict);
tampon est à vrai pour cette ligne de code. J'ai aussi regarder comment interpréter les fichier metafilepict mais le code est complexe. J'aimerais trouver quelque chose de simple.
Suggestions?
Luc Saucier
- Modifié LucSaucierSILS jeudi 14 mars 2013 18:03
-
À défaut d'une meilleure solution, je vais utiliser le code suivant:
var repImage = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData); chartPage.Export(repImage + "\\DAP-FinProduction.jpg"); picGraphiqueTempsArrêt.Image = Image.FromFile(repImage + "\\DAP-FinProduction.jpg");
Est-ce qu'il y a une solution mémoire à ce code?
Luc Saucier
-
Vous pouvez convertir le type MetaFilePict en Image:
Image image = (Image)data.GetData(DataFormats.MetafilePict);
Ou bien:
Image image = (Image)data.GetData(DataFormats.EnhancedMetafile);
Sami CHNITER Software Engineer
- Proposé comme réponse Sami CHNITER mercredi 20 mars 2013 18:48
- Marqué comme réponse Aurel Bera jeudi 21 mars 2013 08:08
-
Bonjour
Un petit retour SVP?
Merci,
Cordialement,
-
Bonjour,
Pouvons-nous considérer que vous avez résolu votre problème avec les scénarios proposés ? Dans l'affirmative, pourriez-vous partager avec nous la solution, afin que d'autres personnes avec le même problème puissent profiter de cette solution ?
Désormais, nous marquons les solutions proposées. N'hésitez pas à revenir et supprimer la réponse marquée si la solution n’est pas correcte. Merci !
Cordialement,