工作中需要對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
