2016-05-12 3 views
0

Ich versuche, ein Bild von einem Excel namens Inputs_v3 und Blatt mit dem Namen Eingaben zu kopieren und zu speichern. Der Code ist als follows`Kopieren Sie Bild aus Excel und speichern Sie es mit Python

import win32com.client as win32  
from PIL import ImageGrab 
from xlrd import open_workbook 
import os 

excel = win32.gencache.EnsureDispatch("Excel.Application") 
wb = open_workbook('Inputs_v3.xlsm') 
r = wb.sheet_by_name('Inputs') 
r.CopyPicture() 

im = ImageGrab.grabclipboard() 
im.save('somefile.png','PNG') 

`Der Fehler wird wie folgt

'Attribute error: 'Sheet' object has no attribute 'CopyPicture'' 

Bitte legen nahe, wo ich wrong.Thanks im Voraus tue

+0

Sie vermischen Win32com-Aufrufe mit dem 'xlrd'-Paket, die nichts miteinander zu tun haben. Sie haben "Excel" als Verweis auf die Excel-App festgelegt, aber Sie tun nichts damit. Ich bin weder mit xlrd noch mit dem Excel-COM-Modell vertraut, aber es sieht so aus, als ob 'CopyPicture' eine Methode ist, die Sie für das Excel-Arbeitsblattobjekt und nicht für das xlrd-Objekt 'sheet_by_name' aufrufen müssen. Wenn Sie das Bild mit xlrd erhalten können, tun Sie das und verwenden Sie nicht COM, andernfalls verwenden Sie COM, und Sie brauchen xlrd nicht. – nekomatic

+0

Hi ... ich habe versucht, das Arbeitsbuch mit win32.com zu öffnen von Excel = Win32.gencache.EnsureDispatch ("Excel.Application") wb = Excel.Workbooks.Open ("Inputs_v3.xlsm") ... aber Es zeigt, dass wir die Datei nicht finden konnten –

+0

Klingt so, als könnte sie die Datei nicht finden ;-) Versuchen Sie es mit einem vollständigen Pfadnamen. – nekomatic

Antwort

0

Sie müssen die Zellenposition für die einschließen Bild meiner Meinung nach. Versuchen (ersetzen Sie bitte mit Zellwerten):

import win32com.client as win32  
from PIL import ImageGrab 
from xlrd import open_workbook 
import os 

excel = win32.gencache.EnsureDispatch("Excel.Application") 
wb = open_workbook('Inputs_v3.xlsm') 
r = wb.sheet_by_name('Inputs') 
r.Range(r.Cells(1,1),r.Cells(8+rows,total_length)).CopyPicture() 

im = ImageGrab.grabclipboard() 
im.save('somefile.png','PNG') 

Alternativ können Sie auch die Diagrammobjekte verwenden:

import win32com.client as win32 
from PIL import ImageGrab 
from xlrd import open_workbook 
import os 

excel = win32.gencache.EnsureDispatch("Excel.Application") 
wb = open_workbook('Inputs_v3.xlsm') 
r = wb.sheet_by_name('Inputs') 
for chart in r.Chartobjects(): 
    //implement your custom logic here 
    chart.CopyPicture() 
im = ImageGrab.grabclipboard() 
im.save('somefile.png','PNG') 

Weitere Referenzen:

Python save xlPicture from clipboard

Export Charts from Excel as images using Python

https://msdn.microsoft.com/en-/library/microsoft.office.interop.excel.picture.copypicture(v=office.14).aspx

+0

Haben Sie das getestet? Ein xlrd Sheet-Objekt verfügt nicht über Zellen-, Bereichs- oder Diagrammobjekteigenschaften oder eine CopyPicture-Methode. – nekomatic

+0

Nein, habe ich nicht, aber scheint mit verschiedenen Quellen zu arbeiten; bitte finden Sie die Referenzen. – PseudoAj

1

Der folgende Code erhalten Sie die win32com Referenz erhalten, die Sie tatsächlich das Excel-Arbeitsblatt die Objekte und Methoden zugreifen müssen:

import win32com.client as win32 
excel = win32.gencache.EnsureDispatch('Excel.Application') 
wb = excel.Workbooks.Open('myworkbook.xlsx') 
ws = wb.Worksheets('worksheet_name')   # alternatively Worksheets(1) etc 

Jetzt können Sie tun, zum Beispiel:

ws.Shapes(1).CopyPicture() 

I habe dies mit Python 3.4, pywin32 219 und Excel 2010 unter Windows 7 getestet.

Beachten Sie, dass dies xlrd bei nicht beteiligt ist all - das ist ein Paket, das Excel-Dateien lesen kann, ohne dass Excel auf dem Computer installiert ist, aber ich weiß nicht, ob es Bilder von oder von Excel-Arbeitsmappen unterstützt.

+0

Danke .. Ich muss ein bestimmtes Bild auf dem Arbeitsblatt bekommen. Entsprechend Ihrem Code (Bereich) nimmt es Bild des gesamten Bildschirms in dem Bereich und in dem Code, der es den Fehler gibt, auf: 'Nonetype-Objekt hat kein Attribut speichern' . Ich denke, der Code erkennt das Bild in der Zwischenablage nicht. Aber Bild wird in die Zwischenablage kopiert. Können Sie eine Lösung für dieses Problem vorschlagen? –

+0

Sehen Sie die bearbeitete Antwort, um das Bild zu kopieren, anstatt das Bild des Arbeitsblatts.Ich kenne PIL nicht und kann es nicht testen, da ich Python 2.x nicht installiert habe - ich schlage vor, dass Sie etwas mehr Forschung und Experimente dazu machen und wenn Sie nirgends hinkommen, stellen Sie eine neue Frage speziell zu Das. – nekomatic

+0

http://stackoverflow.com/questions/17282278/python-save-xlpicture-from-clipboard könnte relevant sein? – nekomatic

Verwandte Themen