Экспорт диаграмм из Excel в виде изображений с помощью Python

Я пытался экспортировать диаграммы из Excel в виде файла изображения (JPG или ING) в Python. Я смотрю на WIn32com. Вот что у меня есть до сих пор.

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()

Вот где я застрял. Мне нужно скопировать выбранный диапазон в файл сейчас. Любая помощь или указатели на документ могут мне очень помочь.

Я смоделировал приведенный выше код на основе следующего сценария VBA:

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

Фрагмент кода из: http://vbadud.blogspot.com/2010/06/how-to-save-excel-range-as-image-using.html


person Parikshit    schedule 19.06.2012    source источник
comment
Мое предложение состояло бы в том, чтобы разорвать ваши связи с Excel. Зачем делать диаграммы в Excel, а затем использовать Python? Легко просто использовать python для чтения данных и построения графиков с помощью matplotlib.   -  person TJD    schedule 20.06.2012
comment
К сожалению, проделанная ранее работа вынуждает меня придерживаться Excel. И есть более 10 графиков, построенных на нескольких листах.   -  person Parikshit    schedule 20.06.2012
comment
Почему бы не экспортировать диаграммы напрямую? Объект Sheet имеет коллекцию ChartObjects: каждый ChartObject содержит Chart с методом Export. Копирование диапазона, содержащего диаграмму, а затем вставка его в пустую диаграмму, похоже на долгий путь.   -  person Tim Williams    schedule 20.06.2012


Ответы (5)


Мне пришлось посмотреть на некоторые примеры VBA, чтобы заставить это работать. Хотя я ненавижу отвечать на свои вопросы, я оставляю это здесь для тех, кому это может понадобиться.

    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()
person Parikshit    schedule 22.06.2012

Я знаю, что это старый вопрос, но он помог мне встать на правильный путь, поэтому я вернулся, чтобы поделиться своим готовым скриптом, который находит все диаграммы на листе и экспортирует их в формате .png. Приведенный выше скрипт может работать, но, поскольку он просто копирует диапазон на рабочем листе, вы зависите от графиков, находящихся именно в этом месте.

    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
person Habadasher    schedule 12.08.2014

Для меня это сработало хорошо:

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)

Или это:

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)
person snaiste    schedule 22.11.2017
comment
есть ли способ экспортировать по определенному пути? - person Creamy Oreo; 12.12.2019
comment
Я не мог изменить выходной путь для этого, есть ли способ это изменить? - person Sanch; 09.03.2021

В настоящее время я бы порекомендовал библиотеку excel2img, она мне хорошо послужила. Убедитесь, что он у вас установлен (pip install excel2img)

import excel2img

excel2img.export_img("test.xlsx", "test.gif", "Sheet1", "MyNamedRange")

Если вам не нужны линии сетки - просто скройте их в excel.

git rep: excel2img, чтобы узнать больше.

person yomajo    schedule 31.05.2019
comment
Yomajo excel2img не работает с Microsoft Excel 2016. Не могли бы вы предложить альтернативу? - person Python Bang; 11.02.2020

Я попытался выполнить команду ниже, но в Excel ничего не обновилось. Файл открыт только для чтения? в чем может быть проблема с кодом.

import win32com.client as win32
from win32com.client import Dispatch
import os
xlApp = Dispatch('Excel.Application')
workbook = xlApp.Workbooks.Open(r'C:\Users\eshsubh\Documents\EKN\DL MS1.xls')
xlApp.Sheets("Sheet2").Select()
xlSheet1 = xlApp.Sheets(1)
xlApp.DisplayAlerts = False
i = 0
for chart in xlSheet1.ChartObjects():
 print (chart.Name)
 chart.CopyPicture()
 #Create new temporary sheet
xlSheet1.ActiveWorkbook.Sheets.Add(After=xlSheet1.ActiveWorkbook.Sheets(3)).Name="temp_sheet" + str(i)
xlSheet1 = sheet_ranges.ActiveSheet
#Add chart object to new sheet.
cht = xlSheet1.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  
person Subhash Sharma    schedule 04.04.2020
comment
Пожалуйста, задавайте вопросы в отдельной теме, а не в другом ответе. Ваш вопрос может получить больше внимания и быть полезным для сообщества. - person disp_name; 04.04.2020