2012-06-19 3 views
2

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

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

+0

Мое предложение было бы разорвать свои связи с Excel. Зачем создавать диаграммы в Excel, а затем использовать Python? Легко просто использовать python для чтения данных и выполнить построение с помощью matplotlib. – TJD

+0

К сожалению, предыдущая работа заставила меня придерживаться Excel. И есть более 10 графиков, построенных из нескольких листов. – Parikshit

+0

Почему бы не экспортировать диаграммы напрямую? Объект «Лист» имеет коллекцию «ChartObjects»: каждый «ChartObject» содержит «Chart» с методом «Export». Копирование диапазона, содержащего диаграмму, а затем вставки в пустую диаграмму, похоже, делает длинный путь. –

ответ

2

я должен был смотреть на некоторых примерах 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() 
+0

Хотя это может быть хорошей точкой отсчета, скрипт не работает ... – Patrick

3

Я знаю, что это старый вопрос, но это помогло поставить меня на правильном пути, так что я вернулся, чтобы разделить мой готовый скрипт, который находит все диаграммы на листе и экспортирует их как .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 
0

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

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) 

 Смежные вопросы

  • Нет связанных вопросов^_^