工作中需要對excel的單元格區域進行截圖,以前是調用vba進行(走了很多彎路,雖然能實現,但比較low),后來逐步發現python的win32com與vba師出同門,很多方法操作都是類似的。
可以對代碼進行優化。
解決方案如下:
#!/usr/bin/env python # -*- coding:utf-8 -*- # Datetime:2018/9/16 11:45 # Author:Xzs from win32com.client import Dispatch, DispatchEx import pythoncom from PIL import ImageGrab, Image import uuid # screen_area——類似格式"A1:J10" def excel_catch_screen(filename, sheetname, screen_area, img_name=False): """ 對excel的表格區域進行截圖——用例:excel_catch_screen(ur"D:\Desktop\123.xlsx", "Sheet1", "A1:J10")""" pythoncom.CoInitialize() # excel多線程相關 excel = DispatchEx("Excel.Application") # 啟動excel excel.Visible = True # 可視化 excel.DisplayAlerts = False # 是否顯示警告 wb = excel.Workbooks.Open(filename) # 打開excel ws = wb.Sheets(sheetname) # 選擇sheet ws.Range(screen_area).CopyPicture() # 復制圖片區域 ws.Paste() # 粘貼 ws.Paste(ws.Range('B1')) # 將圖片移動到具體位置 name = str(uuid.uuid4()) # 重命名唯一值 new_shape_name = name[:6] excel.Selection.ShapeRange.Name = new_shape_name # 將剛剛選擇的Shape重命名,避免與已有圖片混淆 ws.Shapes(new_shape_name).Copy() # 選擇圖片 img = ImageGrab.grabclipboard() # 獲取剪貼板的圖片數據 if not img_name: img_name = name + ".PNG" img.save(img_name) # 保存圖片 wb.Close(SaveChanges=0) # 關閉工作薄,不保存 excel.Quit() # 退出excel pythoncom.CoUninitialize() if __name__ == '__main__': pass # excel_catch_screen(ur"D:\Desktop\123.xlsx", "Sheet1", "A1:J10")
ps有個美眉用了后發現截圖出現疊字,一頓操作后來發現是office2010的版本問題,更換后office2016后解決。有同樣問題的可參考
vba實現:
Sub catch_screen() Dim path path = Range("A1").Value Workbooks.Open Filename:=path, UpdateLinks:=False Sheets(2).Select Range("A38:T67").Select Selection.Copy Set shp = ActiveSheet.Pictures.Paste shp.CopyPicture Name = Split(ThisWorkbook.Name, ".xlsx")(0) With ActiveSheet.ChartObjects.Add(0, 0, shp.Width, shp.Height).Chart .Parent.Select .Paste .Export ThisWorkbook.path & "\\" & Name & "-" & ActiveSheet.Name & ".JPEG" .Parent.Delete End With shp.Delete ActiveWorkbook.Close (SaveChanges = False) End Sub