Export Charts from Excel as images using Python

19,024

Solution 1

I had to look at some VBA examples to get this working. Although I hate answering my own questions, I am leaving this here for people who might need it.

    import win32com.client as win32
    wb = excel.Workbooks.Open(excel_file)
    selection = "A1:J30" 
    xl_range = wb.Sheets(<sheet_name>).Range(selection)
    excel.ActiveWorkbook.Sheets.Add(                  After=excel.ActiveWorkbook.Sheets(3)).Name="image_sheet"
    cht = excel.ActiveSheet.ChartObjects().Add(0,0,
                                            xl_range.Width, xl_range.Height)
    xl_range.CopyPicture()
    # add the chart to new sheet
    cht.Chart.Paste()
    # Export the sheet with the chart to a new file
    cht.Chart.Export(<image_filename>)
    # Delete the sheet
    cht.Delete()
    excel.ActiveSheet.Delete()
    # Close the book
    excel.ActiveWorkbook.Close()

Solution 2

I know this is an old question but it helped to put me on the right track so I came back to share my finished script that finds all charts in a worksheet and exports them as .png. The above script can work but since it just copies a range within the worksheet, you are depending on the graphs being in exactly that spot.

    import win32com.client as win32
    from win32com.client import Dispatch
    import os

    xlApp = Dispatch('Excel.Application')

    workbook = xlApp.Workbooks.Open("Book1.xls")
    xlApp.Sheets("Sheet1").Select()

    xlSheet1 = xlApp.Sheets(1)

    #WARNING: The following line will cause the script to discard any unsaved changes in your workbook
    #Ensure to save any work before running script
    xlApp.DisplayAlerts = False

    i = 0
    for chart in xlSheet1.ChartObjects():
        print chart.Name

        chart.CopyPicture()
        #Create new temporary sheet
        xlApp.ActiveWorkbook.Sheets.Add(After=xlApp.ActiveWorkbook.Sheets(3)).Name="temp_sheet" + str(i)
        temp_sheet = xlApp.ActiveSheet

        #Add chart object to new sheet.
        cht = xlApp.ActiveSheet.ChartObjects().Add(0,0,800, 600)
        #Paste copied chart into new object
        cht.Chart.Paste()
        #Export image
        cht.Chart.Export("chart" + str(i) + ".png")

        #This line is not entirely neccessary since script currently exits without saving
        temp_sheet.Delete()
        i = i+1

    xlApp.ActiveWorkbook.Close()
    #Restore default behaviour
    xlApp.DisplayAlerts = True

Solution 3

For me this worked well:

from win32com.client import Dispatch

app = Dispatch("Excel.Application")
workbook_file_name = 'Programmes.xlsx'
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
for sheet in workbook.Worksheets:
    for chartObject in sheet.ChartObjects():
        # print(sheet.Name + ':' + chartObject.Name)
        chartObject.Chart.Export("chart" + str(i) + ".png")
        i += 1

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

Or this:

from win32com.client import Dispatch

app = Dispatch("Excel.Application")
workbook_file_name = 'Programmes.xlsx'
workbook = app.Workbooks.Open(Filename=workbook_file_name)
app.DisplayAlerts = False
try:
    workbook.SaveAs(Filename="ExcelCharts.htm", FileFormat=44)  # 44 = html file format
except Exception as ex:
    print(ex)
finally:
    workbook.Close(SaveChanges=False, Filename=workbook_file_name)
Share:
19,024
Parikshit
Author by

Parikshit

Updated on June 04, 2022

Comments

  • Parikshit
    Parikshit almost 2 years

    I have been trying to export the charts from Excel as an image file (JPG or ING) in Python. I am looking at the WIn32com. Here is what I have till now.

    import win32com.client as win32
    excel = win32.gencache.EnsureDispatch("Excel.Application")
    wb = excel.Workbooks.Open("<WORKSHEET NAME>")
    r = wb.Sheets("<SHEET NAME>").Range("A1:J50") 
    # Here A1:J50 is the area over which cart is
    r.CopyPicture()
    

    This is where I am stuck. I need to copy the selected range to a file now. Any help or pointers towards the doc can help me a lot.

    I have modelled the above code based on the following VBA script:

    Sub Export_Range_Images()
        ' =========================================
        ' Code to save selected Excel Range as Image
        ' =========================================
        Dim oRange As Range
        Dim oCht As Chart
        Dim oImg As Picture
    
        Set oRange = Range("A1:B2")
        Set oCht = Charts.Add
        oRange.CopyPicture xlScreen, xlPicture
        oCht.Paste
        oCht.Export FileName:="C:\temp\SavedRange.jpg", Filtername:="JPG"
    End Sub
    

    Code Snippet from : http://vbadud.blogspot.com/2010/06/how-to-save-excel-range-as-image-using.html

  • Shreamy
    Shreamy over 4 years
    is there a way i can export to a certain path ?
  • Python Bang
    Python Bang over 4 years
    Yomajo excel2img does not work for microsoft excel 2016. Could you please suggest for an alternative ?
  • Sanch
    Sanch about 3 years
    I couldn't change the output path for this, is there a way to change that?
  • ambigus9
    ambigus9 over 2 years
    @PythonBang did you find a solution?