2017-05-28 87 views
3

我有幾張Excel圖表,我想用Python導出爲圖像。每張圖表都在一張單獨的Excel文件中,只有一張。該腳本適用於幾乎所有的圖表:Python win32 Excel將圖表粘貼爲位圖(PasteSpecial)?

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

xl = Dispatch('Excel.Application') 
xl.Visible = True 
wb = xl.Workbooks.Open("C:\\test.xlsx") 

xl.DisplayAlerts = False 

chart = wb.Worksheets(1).ChartObjects(1) 
chart.CopyPicture() 

#Create new temporary sheet (after first sheet) 
xl.ActiveWorkbook.Sheets.Add(After=xl.ActiveWorkbook.Sheets(1)).Name="temp_sheet" 
temp_sheet = xl.ActiveSheet 

#Add chart object to new sheet. 
cht = xl.ActiveSheet.ChartObjects().Add(0,0,chart.Width, chart.Height) 

#Paste copied chart into new object 
cht.Activate()  # dit is bij de topsheets nodig, anders plakt die een wit vlak... (bij trends en staafjes hoeft het niet) 
cht.Chart.Paste() 

#Export image 
cht.Chart.Export("C:\\test.png") 

temp_sheet.Delete() 
xl.ActiveWorkbook.Close() 

#Restore default behaviour 
xl.DisplayAlerts = True 

我有一個圖表但不能出口......我得到的導出功能後此錯誤:

pywintypes.com_error: (-2147352567, 'Exception occurred.', (0, None, None, None, 0, -2147287037), None) 

圖表複製到臨時工作表,但導出失敗。在導出此圖寫了一些舊的Excel VBA代碼,我看這樣行:

ActiveSheet.PasteSpecial Format:="Bitmap", Link:=False, 
DisplayAsIcon:=False 

什麼是Python等同?這:

cht.Chart.PasteSpecial(Format="Bitmap") 

不工作(AttributeError的: '' 對象有沒有屬性 'PasteSpecial的')

  • 編輯 -

「剪貼板評論」 從Xukrao指出我在另一方向。在本教程https://www.penwatch.net/cms/images_from_excel/的幫助下,我使用了PIL中的ImageGrab。導出圖表正在工作! :)

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

xl = Dispatch('Excel.Application') 
xl.Visible = True 
wb = xl.Workbooks.Open("C:\\test.xlsx") 

xl.DisplayAlerts = False 

chart = wb.Worksheets(1).ChartObjects(1) 
chart.CopyPicture() 

#Create new temporary sheet (after first sheet) 
xl.ActiveWorkbook.Sheets.Add(After=xl.ActiveWorkbook.Sheets(1)).Name="temp_sheet" 
temp_sheet = xl.ActiveSheet 

xl.ActiveSheet.PasteSpecial() 

# Use PIL (python imaging library) to save from Windows clipboard 
# to a file 
wb.Worksheets(2).Pictures(1).Copy() 
image = ImageGrab.grabclipboard() 
image.save('blabla.bmp','bmp') 

#This line is not entirely neccessary since script currently exits without 
saving 
temp_sheet.Delete() 
xl.ActiveWorkbook.Close() 

#Restore default behaviour 
xl.DisplayAlerts = True 

回答

0

直接的Python相當於

ActiveSheet.PasteSpecial Format:="Bitmap", Link:=False, DisplayAsIcon:=False 

會是這樣:

xl.ActiveSheet.PasteSpecial(Format="Bitmap", Link=False, DisplayAsIcon=False) 
+0

我使用這條線時,出現此錯誤:pywintypes.com_error:(-2147352567,「異常發生。',(0,u'Microsoft Excel',u'PasteSpecial方法的工作表類失敗。',u'xlmain11.chm',0,-2146827284),無) – Joost

+1

該錯誤的最可能的原因是剪貼板尚未包含圖表。 – Xukrao

+0

我認爲圖表在剪貼板中,因爲當我使用這一行時:xl.ActiveSheet.PasteSpecial()將圖表粘貼到臨時表單上。然而,不是位圖格式,我需要... – Joost