Export Charts from Excel as images using Python

匿名 (未验证) 提交于 2019-12-03 00:48:01

问题:

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("") r = wb.Sheets("").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

回答1:

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 


回答2:

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().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()     # Delete the sheet     cht.Delete()     excel.ActiveSheet.Delete()     # Close the book     excel.ActiveWorkbook.Close() 


回答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) 


标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!