4 votes

Excel.Chart.Export ne fonctionne pas

J'ai un fichier Excel avec plusieurs graphiques sur une feuille. Je récupère les graphiques d'Excel et les enregistre dans une image.

Mon code :

workSheet = workBook.Sheets[1] as Excel._Worksheet;
Excel.ChartObjects chartObjects =(Excel.ChartObjects)workSheet.ChartObjects(Type.Missing);
int chartCount = chartObjects.Count;
for (int j = 1; j <= chartCount; j++)
{
     Excel.ChartObject chart = (Excel.ChartObject)chartObjects.Item(j);
     path = Path.Combine(Application.StartupPath, @"Img\" + chart.Chart.Name + ".bmp");
     chart.Chart.Export(path, "BMP", true);
}

mais seule une image vide est exportée.

Aidez-moi, s'il vous plaît

3voto

Xiaofu Points 6163

L'exportation de graphiques qui ne sont pas au moins partiellement visibles à l'écran au moment de l'appel à l'exportation semble donner lieu à des images vides.

Essayez d'ajouter une ligne de code pour activer le graphique à exporter avant de l'exporter (j'ai rencontré le même problème et cela a fonctionné pour moi) :

Excel.ChartObject chart = (Excel.ChartObject)chartObjects.Item(j);
path = Path.Combine(Application.StartupPath, @"Img\" + chart.Chart.Name + ".bmp");
chart.Activate(); //New line
chart.Chart.Export(path, "BMP", true);

1voto

GrizCollazo Points 11

J'ai rencontré le même problème et j'ai essayé l'astuce .Activate, mais cela n'a pas aidé. Sur la base du commentaire selon lequel les graphiques doivent devenir au moins partiellement visibles, j'ai essayé une simple boucle de retard juste avant la ligne .Export :

For i = 1 to N
  DoEvents
Next i

Cela a réglé le problème. En expérimentant un peu, j'ai constaté que N >= 3 fonctionnait, mais que si N = 1 ou 2, ou si je supprimais la boucle, le code revenait à l'affichage d'images vierges. Je ne comprends pas, mais j'ai pensé que je devais faire part de mes observations.

0voto

Juno55 Points 11

Merci @Xiaofu Vos informations sur l'activation des graphiques avant l'exportation m'ont vraiment aidé car j'ai passé presque une journée à chercher une solution pour mon petit projet Python. Merci.

Pour tous ceux qui cherchent une version de Python script pour exporter des graphiques Excel au format GIF ou PNG, voici le code qui a fonctionné pour moi :

# Python function to export an Excel chart to a GIF image format
# Ref: https://stackoverflow.com/questions/11110752/export-charts-from-excel-as-images-using-python
def ChartExport(cwd, fileName):
    app = win32.Dispatch('Excel.Application')
    workbook_file_name = cwd + fileName
    workbook = app.Workbooks.Open(Filename=workbook_file_name)

    # WARNING: The following line will cause the script to discard any unsaved changes in your workbook
    app.DisplayAlerts = False

    i = 1   # There are multiple charts on the worksheet. So using a number suffix to add the output gif filename
    for sheet in workbook.Worksheets:
        for chartObject in sheet.ChartObjects():
            #print('i = ', i, ' -- ', sheet.Name + ':' + chartObject.Name)
            chartObject.Activate()  # This line was added after finding exporting problem with 2nd and 3rd charts. Thanks Xiaofu Ref: https://stackoverflow.com/questions/15911536/excel-chart-export-not-working
            chartObject.Chart.Export(cwd + '\\chart' + str(i) + '.gif')  # Export chart to a gif file format
            i += 1

    workbook.Close(SaveChanges=False, Filename=workbook_file_name)
    return

0voto

Gerald Howell Points 46

Je viens de tomber sur cette situation exacte. Malheureusement, l'utilisation de chart.Activate() n'a pas fonctionné pour moi. Cependant, la partie concernant le fait que le graphique doit être partiellement visible m'a donné un indice sur ce qu'il faut faire. J'ai simplement maximisé la fenêtre, rendant tous mes graphiques visibles, et l'exportation a recommencé à fonctionner.

Excel.WindowState = Microsoft.Office.Interop.Excel.XlWindowState.xlMaximized;    
Excel.ChartObject chart = (Excel.ChartObject)chartObjects.Item(j);
path = Path.Combine(Application.StartupPath, @"Img\" + chart.Chart.Name + ".bmp");
chart.Activate(); //New line
chart.Chart.Export(path, "BMP", true);

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X