Python通过xlwings自动化Excel-持续更新
一.自动化脚本注意事项
背景:pyautogui基于坐标(x,y)或点击图片进行相关操作,分辨率不同会使坐标(x,y)发生偏移或图像不被识别,导致脚本无法正常使用,注意事项如下。
为保证自动化程序正常运行,尽可能关闭不相关的应用程序窗口。
为保证在指定窗口执行,用getWindowsWithTitle()获取窗口句柄,并 activate()将窗口置顶。
为保证窗口的位置坐标(x,y)不会更改,建议在相同的屏幕分辨率设备上运行脚本。
为保证按钮和菜单的位置不发生变化,建议每次maximize()最大化需要操作的应用程序窗口。
为保证程序在就绪后进行操作,建议每执行一步操作都加入适当的等待时间。
点击按钮或菜单,locateOnScreen()不依赖于坐标(X,Y),更稳定。
尽量用热键hotkey()或者keyDown('tab')键代替点击Click(),比坐标(x,y)更稳定更可靠。
二.鼠标相关-pyautogui
a.获取显示屏的尺寸
#引入pyautogui的包,取别名为pg
import pyautogui as pg#获取屏幕尺寸
wSize = pg.size()
# 屏幕的宽
print(wSize[0])
print(wSize.width)
# 屏幕高
print(wSize[1])
print(wSize.height)
执行结果
b.获取鼠标位置
通过pyautogui工具获取坐标(X,Y)
#启动pyautogui自带的工具
import pyautogui as pg
pg.mouseInfo()
当鼠标移动到需要点击的按钮或者菜单上,实时看到坐标(X,Y)等信息。
通过图表获取坐标(X,Y)
截取全部刷新按钮,保存到桌面命名为refreshbtn.jpg。
import pyautogui as pg
try:b = pg.locateOnScreen(r'C:\Users\mypc\Desktop\refreshbtn.jpg')pg.click((b.left, b.top, b.width, b.height))
except:print('未找到图片。')
import pyautogui as pg
try:pg.click(r'C:\Users\mypc\Desktop\refreshbtn.jpg')
except:print('未找到图片。')
通过跨界键,点击“全部刷新”
先点击键盘的ALT键,查看快捷键,如图,快捷键为 Y4
键盘先点击ALT键,再点击Y键,再点击数字4,会显示全部刷新按钮的快捷键盘为R
根据上述的实际操作步骤,模拟创建点击代码。加入Sleep休眠代码,是防止python程序运行太快,excel还没有准备好下一步响应,程序就运行结束。因为hotkey('ALT','Y','4'),hotkey('ALT+Y+4')未找到如何实现点击到二级菜单的快捷键的用法,所以示例代码使用了press函数。
import pyautogui as pg
#依次点击ALT
pg.press('ALT')
time.sleep(2)
#依次点击Y
pg.press('Y')
time.sleep(2)
#选择Analysis
#依次点击4
pg.press('4')
time.sleep(2)
#点击全部刷新
#依次点击R
pg.press('R')
运行效果图,正常点击“全部刷新”按钮。
c.获取窗口信息
遍历窗口进行查找
import pyautogui as pg
#获取所有打开的应用窗口
windows = pg.getAllWindows()
#如果当前没有窗口打开,提示异常
if len(windows) == 0:raise Exception("窗口未找到")
#遍历窗口
for window in windows:#窗口的名字包含关键字时,打印到屏幕上if "要找的窗口的名字" in window.title:print(window.title)
根据窗口的标题查找窗口
import pyautogui as pg
windows = pg.getWindowsWithTitle('my.xlsx - Excel')
if len(windows) == 0:raise Exception("窗口未找到")
print(windows[0])#最大化窗口
windows[0].maximize()
#取消最大化
windows[0].restore()
#最小化窗口
windows[0].minimize()
#取消最小化
windows[0].restore()
#关闭窗口
windows[0].close()
d.操作键盘
import pyautogui as pg
#点击客户端的文本框
pg.click(854,504)
#输入80
pg.write('80')
#按一次Tab键,移动到用户
pg.keyDown('tab')
#输入用户名user
pg.write('user')
#按一次Tab键,移动到密码
pg.keyDown('tab')
#输入密码password
pg.write('password')
运行后效果图
e.Excel加载完成判断
1.通过光标状态判断完成
数据在加载过程中,光标会一直转圈显示忙碌。可以判断当前光标的图片是否为圆圈。
import win32gui, win32uiwhile True:# 等待2秒time.sleep(2) # 获取光标信息curinfo = win32gui.GetCursorInfo() # 异常回避:如果光标消失,继续循环if (curinfo[1] == 0):continue# 获取光标图像信息iamgeinfo = win32gui.GetIconInfo(curinfo[1]) # 获取bitmap信息bminfo = win32gui.GetObject(iamgeinfo[3]) # gdc = win32gui.GetDC(0) # 创造DC对象hdc = win32ui.CreateDCFromHandle(gdc) # 创建一个新位图hbmp = win32ui.CreateBitmap() hbmp.CreateCompatibleBitmap(hdc, bminfo.bmWidth, bminfo.bmHeight) hdc = hdc.CreateCompatibleDC() hdc.SelectObject(hbmp) win32gui.DrawIconEx(hdc.GetHandleOutput(), 0, 0, ci[1], bm.bmWidth, bm.bmHeight, 0, None, 2) bitmapbits = hbmp.GetBitmapBits(True)# busy 加载中图片的二进制内容loadbitmap = b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00\x00\x00\x10\x00\x00\x00\x14\x00\x00\x00\x14\x00\x00\x00\x14\x00\x00\x00\x14\x00\x00\x00\x10\x00\x00\x00\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0b\x00\x00\x00\x18\xc5{"b\xe5\x8e\'\x99\xef\x95)\xc3\xef\x95)\xc3\xef\x95)\xc3\xef\x95)\xc3\xe5\x8e\'\x99\xc5{"b\x00\x00\x00\x18\x00\x00\x00\x0b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x14\xbbt S\xf1\x96*\xe2\xf3\x97*\xff\xf3\x97*\xff\xf3\x97*\xff\xf3\x97*\xff\xf3\x97*\xff\xf3\x97*\xff\xf3\x97*\xff\xf3\x97*\xff\xf1\x96*\xe2\xbbt S\x00\x00\x00\x14\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x15\xe0\x8b\'\x8b\xf3\x97*\xff\xf3\x97*\xff\xf3\x97*\xff\xf3\x97*\xff\xf3\x97*\xff\xf3\x97*\xff\xf3\x97*\xff\xf3\x97*\xff\xf3\x97*\xff\xf3\x97*\xff\xf3\x97*\xff\xf3\x97*\xff\xe0\x8b\'\x8b\x00\x00\x00\x15\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x14\xec\xa3&\xa8\xf3\x97*\xff\xf3\x97*\xff\xf3\x97*\xff\xf3\x97*\xff\xf3\x97*\xff\xf3\x97*\xff\xf3\x97*\xff\xf3\x97*\xff\xf3\x97*\xff\xf3\x97*\xff\xf3\x97*\xff\xf3\x97*\xff\xf3\x97*\xff\xf3\x97*\xff\xe0\x8b\'\x8b\x00\x00\x00\x14\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0b\xde\xa0#~\xff\xcc%\xff\xfb\xb8\'\xff\xf4\x9a*\xff\xf3\x97*\xff\xf3\x97*\xff\xf2\x96*\xf1\xe9\x90(\xa7\xe2\x8c\'\x8a\xe2\x8c\'\x8a\xe9\x90(\xa7\xf2\x96*\xf1\xf3\x97*\xff\xf3\x97*\xff\xf3\x97*\xff\xf3\x97*\xff\xf3\x97*\xff\xbbt S\x00\x00\x00\x0b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x18\xfe\xc5&\xfb\xff\xcc%\xff\xff\xcc%\xff\xfd\xc1&\xff\xf4\x9a*\xff\xeb\x92)\xb6`<\x11(\x00\x00\x00\x10\x00\x00\x00\r\x00\x00\x00\r\x00\x00\x00\x10`<\x11(\xeb\x92)\xb6\xf3\x97*\xff\xf3\x97*\xff\xf3\x97*\xff\xf3\x97*\xff\xf1\x96*\xe2\x00\x00\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\xe1\xa0#\x89\xff\xcc%\xff\xff\xcc%\xff\xff\xcc%\xff\xff\xcc%\xff\xf9\xba&\xe4\x00\x00\x00\x18\x00\x00\x00\x05\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x05\x00\x00\x00\x18\xeb\x92)\xb6\xf3\x97*\xff\xf3\x97*\xff\xf3\x97*\xff\xf3\x97*\xff\xc5{"b\x00\x00\x00\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10\xf7\xb8&\xd3\xff\xcc%\xff\xff\xcc%\xff\xff\xcc%\xff\xfe\xc9%\xfe\x90g\x165\x00\x00\x00\x05\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x05`<\x11(\xf2\x96*\xf1\xf3\x97*\xff\xf3\x97*\xff\xf3\x97*\xff\xe5\x8e\'\x99\x00\x00\x00\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x14\xfc\xc0&\xf0\xff\xcc%\xff\xff\xcc%\xff\xff\xcc%\xff\xf9\xbb&\xde\x00\x00\x00\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10\xe9\x90(\xa7\xf3\x97*\xff\xf3\x97*\xff\xf3\x97*\xff\xef\x95)\xc3\x00\x00\x00\x14\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x14\xfd\xc3&\xf7\xff\xcc%\xff\xff\xcc%\xff\xff\xcc%\xff\xf5\xb5&\xc5\x00\x00\x00\r\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\r\xe2\x8c\'\x8a\xf3\x97*\xff\xf3\x97*\xff\xf3\x97*\xff\xef\x95)\xc3\x00\x00\x00\x14\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x14\xfd\xc3&\xf7\xff\xcc%\xff\xff\xcc%\xff\xff\xcc%\xff\xf5\xb5&\xc5\x00\x00\x00\r\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\r\xe2\x8c\'\x8a\xf3\x97*\xff\xf3\x97*\xff\xf3\x97*\xff\xef\x95)\xc3\x00\x00\x00\x14\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x14\xfc\xc0&\xf0\xff\xcc%\xff\xff\xcc%\xff\xff\xcc%\xff\xfa\xbe&\xe4\x00\x00\x00\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10\xe9\x90(\xa7\xf3\x97*\xff\xf3\x97*\xff\xf3\x97*\xff\xef\x95)\xc3\x00\x00\x00\x14\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10\xf7\xb8&\xd3\xff\xcc%\xff\xfe\xc5&\xff\xfa\xb4\'\xff\xf5\xa0)\xf4`<\x11(\x00\x00\x00\x05\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x05`<\x11(\xf2\x96*\xf1\xf3\x97*\xff\xf3\x97*\xff\xf3\x97*\xff\xe5\x8e\'\x99\x00\x00\x00\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\xdb\x99#\x80\xf7\xa7(\xff\xf3\x97*\xff\xf3\x97*\xff\xf3\x97*\xff\xeb\x92)\xb6\x00\x00\x00\x18\x00\x00\x00\x05\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x05\x00\x00\x00\x18\xeb\x92)\xb6\xf3\x97*\xff\xf3\x97*\xff\xf3\x97*\xff\xf3\x97*\xff\xc5{"b\x00\x00\x00\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x18\xf1\x96*\xe2\xf3\x97*\xff\xf3\x97*\xff\xf3\x97*\xff\xf3\x97*\xff\xeb\x92)\xb6`<\x11(\x00\x00\x00\x10\x00\x00\x00\r\x00\x00\x00\r\x00\x00\x00\x10`<\x11(\xeb\x92)\xb6\xf3\x97*\xff\xf3\x97*\xff\xf3\x97*\xff\xf3\x97*\xff\xf1\x96*\xe2\x00\x00\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0b\xbbt S\xf3\x97*\xff\xf3\x97*\xff\xf3\x97*\xff\xf3\x97*\xff\xf3\x97*\xff\xf2\x96*\xf1\xe9\x90(\xa7\xe2\x8c\'\x8a\xe2\x8c\'\x8a\xe9\x90(\xa7\xf2\x96*\xf1\xf3\x97*\xff\xf3\x97*\xff\xf3\x97*\xff\xf3\x97*\xff\xf3\x97*\xff\xbbt S\x00\x00\x00\x0b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x14\xe0\x8b\'\x8b\xf3\x97*\xff\xf3\x97*\xff\xf3\x97*\xff\xf3\x97*\xff\xf3\x97*\xff\xf3\x97*\xff\xf3\x97*\xff\xf3\x97*\xff\xf3\x97*\xff\xf3\x97*\xff\xf3\x97*\xff\xf3\x97*\xff\xf3\x97*\xff\xf3\x97*\xff\xe0\x8b\'\x8b\x00\x00\x00\x14\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x15\xe0\x8b\'\x8b\xf3\x97*\xff\xf3\x97*\xff\xf3\x97*\xff\xf3\x97*\xff\xf3\x97*\xff\xf3\x97*\xff\xf3\x97*\xff\xf3\x97*\xff\xf3\x97*\xff\xf3\x97*\xff\xf3\x97*\xff\xf3\x97*\xff\xe0\x8b\'\x8b\x00\x00\x00\x15\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x14\xbbt S\xf1\x96*\xe2\xf3\x97*\xff\xf3\x97*\xff\xf3\x97*\xff\xf3\x97*\xff\xf3\x97*\xff\xf3\x97*\xff\xf3\x97*\xff\xf3\x97*\xff\xf1\x96*\xe2\xbbt S\x00\x00\x00\x14\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0b\x00\x00\x00\x18\xc5{"b\xe5\x8e\'\x99\xef\x95)\xc3\xef\x95)\xc3\xef\x95)\xc3\xef\x95)\xc3\xe5\x8e\'\x99\xc5{"b\x00\x00\x00\x18\x00\x00\x00\x0b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00\x00\x00\x10\x00\x00\x00\x14\x00\x00\x00\x14\x00\x00\x00\x14\x00\x00\x00\x14\x00\x00\x00\x10\x00\x00\x00\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'if bitmapbits != loadbitmap:# 资源释放win32gui.ReleaseDC(0, gdc) # 释放上下文 参数(窗口句柄,上下文句柄)hdc.DeleteDC()win32gui.DeleteObject(hbmp.GetHandle())#print("Load is finish...")time.sleep(2)break# else:# print(time.localtime())#hbmp.SaveBitmapFile(hdc, 'scre99t.bmp') # 将位图保存为图片,注意这里只能放dc# 资源释放win32gui.ReleaseDC(0, gdc) # 释放上下文 参数(窗口句柄,上下文句柄)hdc.DeleteDC()win32gui.DeleteObject(hbmp.GetHandle())
注意:加载过程中,光标会变化,会变成Cross十字架,会消失,存在一定的不稳定性,需要多运行几次。
2. 通过菜单图标的颜色判断
数据加载前后,某些应用程序icon按钮的状态会变化,由不可使用变为可以使用,可以通过这个变化做为数据加载结束的判断。
灰色图片为加载前,取名start.png
亮色图片为加载后,取名stop.png
while True:time.sleep(2)xyps = pg.locateOnScreen(os.environ['USERPROFILE'] + r'\Desktop\{}'.format("stop.png"))# 如果坐标为None,继续循环等待,否则结束循环if xyps == None:continueelse:time.sleep(2)break
注意:在不同的分辨率屏幕上,参照的图片需要重新获取。当CPU高负荷运行,程序会出现无响应,此时该方法因为无法获取应用程序的图像,该方法失效。
3. 当无法找到以上1和2的参照标准时,用timesleep设置足够长的等待时间
time.sleep(希望等待的时间)
f.Excel另存为操作
def saveExcelAs():#打开另存为窗口 pg.hotkey('fn', 'f12')time.sleep(3)# 删除默认的文件名pg.press("delete")time.sleep(2)# 把文件名放入剪切板(因为 pyautogui.write不支持输入中文,通过复制黏贴的方法来替换实现)pyperclip.copy(“mysaveasfile.xlsx”)# 黏贴另存为的文件名pg.hotkey('ctrl', 'v')time.sleep(2)# 保存pg.hotkey('alt', 's')time.sleep(8)# 关闭Excel窗口pg.hotkey('alt', 'f4')
三.邮件发送
需要将生成的Excel通过邮件发给相关人员
from email.utils import formataddrdef sendMail():pathName = os.environ['USERPROFILE'] + r"\Desktop\{}{}".format(“savefilename”,".xlsx")mail_msg = """<p>(Confidential) </p><p></p><p>{}</p><p></p><p>测试邮件。请查收附件。</p><p></p><p>------------------------------------------------------</p><p>发送频度:每月,第一周</p><p>------------------------------------------------------</p><p></p><p>以上,谢谢!</p><p></p>"""sender = 'xxx@gmail.com'to_receivers = ['xxx001@gmail.com','xxx002@gmail.com']cc_receivers = ['cc-xxx001@gmail.com','cc-xxx002@gmail.com']receiver = to_receivers + cc_receivers#本例邮件正文的参数,通过string.format实现mail_msg = mail_msg.format(“XX经理,您好”)message = MIMEMultipart()message.attach(MIMEText(mail_msg, 'html', 'utf-8'))att1 = MIMEText(open(pathName, 'rb').read(), 'base64', 'utf-8')att1["Content-Type"] = 'application/octet-stream'att1.add_header('Content-Disposition', 'attachment', filename = savefilename + '.xlsx')message.attach(att1)message['From'] = formataddr((测试者', sender))message['To'] = ",".join(to_receivers)message['Cc'] = ",".join(cc_receivers)subject = '{}'subject = subject.format(“测试邮件”)message['Subject'] = Header(subject, 'utf-8')try:smtpObj = smtplib.SMTP('192.168.XX.XX')smtpObj.sendmail(sender, receiver, message.as_string())print("邮件发送成功")except smtplib.SMTPException:print("Error: 无法发送邮件")
需要的邮件地址,如果变动来自文件,将收件人称呼和收件人地址保存到appconfig.txt文件
' xxx001@gmail.com, ' xxx002@gmail.com
' cc-xxx001@gmail.com, ' cc-xxx002@gmail.com
赵经理,钱经理
f = open(os.environ['USERPROFILE'] + r'\Desktop\appconfig.txt', 'r', encoding='UTF-8')datalist = f.readlines()#读取第一行的邮件地址maillist = datalist[0].rstrip('\n')#将字符串以逗号分割并保存到数组中to_receivers = maillist.split(',')#将字符串以逗号分割并保存到数组中cc_maillist = datalist[1].rstrip('\n')cc_receivers = cc_maillist.split(',')receiver = to_receivers + cc_receivers# 获取邮件正文中收件人名称mail_msg = mail_msg.format(datalist[2].rstrip('\n'),last_month.strftime("%Y"), last_month.strftime("%m"))f.close()
四.其他
a.Python实现获取上个月的日期
from datetime import datetime, timedelta
#获取当前时间
today = datetime.today()
#获得当月第一天
firstday = today.replace(day=1)
#获得上个月时间
last_month = firstday - timedelta(days=1)
#格式化日期 202301->2301
new_date = last_month.strftime("%Y.%m")
#转为日期格式为string字符串格式
new_comdate = datetime.strptime(new_date, "%Y.%m")#日期比较
difdays = (new_comdate - old_date).days
b.Python实现Excel断开外部链接
Excel的操作采用xlwings既支持xls也支持xlsx,还支持批注修改,Range带格式拷贝,综合性比openpyxl(不支持xls),xlrd(只读,不支持xlsx),xlwt(只写),xlutils方便。
关键点,可以通过Excel 宏录制的方式获知断开外部的接口和调用方式。
ActiveWorkbook.BreakLink Name:= _
"C:\Users\Desktop\daily report\orignal\PSI-全社 (Form).xlsx", Type:= _
xlExcelLinks
接口名:BreakLink
参数1:Name
参数2:Type
改写成Python语言,完整版
xls转xlsx或者反之,可以通过SaveAs中的参数实现
# 断开链接
def breakLinkAndCopytoServer(wbName):# 获取excel的link地址linkPath = os.environ['USERPROFILE'] + r"\Desktop\PSI-全社 (Form).xlsx"# 打开引用外部链接的文件origFname = os.environ['USERPROFILE'] + r"\Desktop\orignal\XXX.xlsx"excel = win32.gencache.EnsureDispatch('Excel.Application')# 以更新的方式打开 wb = excel.Workbooks.Open(origFname, UpdateLinks=True)# 更新所有Linkwb.RefreshAll()# 断开外部Link# xlExcelLinks的值为1wb.BreakLink(Name=linkPath, Type=1)# 重命名另存子表newpath = os.environ['USERPROFILE'] + r"\Desktop\orignal\XXX-new.xlsx"# 51:表示另存为 .xlsx # 56:表示另存为 .xlswb.SaveAs(newpath, FileFormat=51) # 关闭子表wb.Close()# 退出Excel应用excel.Application.Quit()
c.Python实现Excel的Range复制(带单元格式)
import xlwings as xwdef copyrefSheet(wb_ref, copyrange, dstsheet):# 通过Sheet的位置获取第Sheet对象src_sheet = wb_ref.sheets[0]# 根据参数,复制A:S列的内容到剪贴板src_sheet.range(copyrange).copy()# 通过Sheet的名字获取Sheet对象dst_sheet = workbook.sheets[dstsheet]# 将剪贴板的内容拷贝到目标SHeet的A:S列dst_sheet.range(copyrange).paste()# 为了避免执行过程中跳出如下对话框,中断程序,任意复制一个单元格的内容,达到类似清空剪贴板的目的dst_sheet.range("A1").copy()# 调用函数
app = xw.App(visible=False, add_book=False)
wb_refClass = app.books.open("C:\Desktop\xxx.xlsx")
copyrefSheet(wb_refClass, 'A:S', '目标Sheet名字')
d.Python实现Excel的Column列的值复制(不带单元格式)
def copyDsttoSrc(sheetName):# 指定列所在的Sheetsheet = workbook.sheets[sheetName]# 获取最大有效行数max_rows = sheet.used_range.last_cell.rowi = 0# 进行值的复制for src, dst in zip(sheet['AD:AD'], sheet['AI:AI']):if i > max_rows:breakelse:dst.value = src.valuei = i + 1copyDsttoSrc("目标Sheet的名字")
e.Python实现Excel的批注更新
# 批注内容:下期达成率=下半年实际工作日(82)/下半年总工作日(121)
# 更新内容:下期达成率=下半年实际工作日(83)/下半年总工作日(121)
# 希望将Comment中的82/121 更新为 83/121,实现代码如下
def updateComment(sheetName, dstRange):sheet = workbook.sheets[sheetName]cellAG2 = sheet.range(dstRange)oldAG2 = cellAG2.formula_array# 获取 82/121的82,并实现82+1,变成83arAG2 = oldAG2.split("/", 1)intAG2 = int(arAG2[0][1:]) + 1beforeVal = arAG2[0][1:]afterVal = str(intAG2)# 获取单元格的批注oldComment = cellAG2.api.Comment.Text()# 替换批准中的内容newCommnet = oldComment.replace(beforeVal, afterVal)# 更新单元格的批注cellAG2.api.Comment.Text(newCommnet)
Python通过xlwings自动化Excel-持续更新相关推荐
- excel python插件_利用 Python 插件 xlwings 读写 Excel
Python 通过 xlwings 读取 Excel 数据 去年底公司让我做设备管理,多次委婉拒绝,最终还是做了.其实我比较喜欢技术.做管理后发现现场没有停机率统计,而原始数据有,每次要自己在Exce ...
- python xlwings追加数据_大数据分析Python库xlwings提升Excel工作效率教程
原标题:大数据分析Python库xlwings提升Excel工作效率教程 Excel在当今的企业中非常非常普遍.在AAA教育,我们通常建议出于很多原因使用代码,并且我们的许多数据科学课程旨在教授数据分 ...
- 利用 Python 插件 xlwings 读写 Excel
Python 通过 xlwings 读取 Excel 数据 去年底公司让我做设备管理,多次委婉拒绝,最终还是做了.其实我比较喜欢技术.做管理后发现现场没有停机率统计,而原始数据有,每次要自己在Exce ...
- 【干货】Python:load_workbook用法(持续更新)
[干货]Python中load_workbook用法(持续更新) 功能 方法 示例文件 模块读取 导入excel表格 获取Sheet 查看行与列 查看单元格 批量访问数据 功能 读取excel文件,并 ...
- 使用python和xlwings合并excel文件
使用python和xlwings合并excel文件 20年前读书时间考了一个C语言二级,许多年都没有使用过,现在工作上遇到一个合并汇总excel文件问题,找了一个新版pyhon,网络百度,自学2周,编 ...
- python 用 xlwings 处理 Excel 中的重复数据
xlwings 简介 xlwings 是一个 Python 库.简化了 Python 和 Excel 通信. xlwings - 让Excel跑得飞快! 本文写作背景 & 需求 & 方 ...
- python使用xlwings提取excel表中所有单元格的数据
有时我们需要使用一个excel表中所有单元格的数据来进行操作,可以使用循环来实现,我对比了一下,使用xlwings直接提取成列表,速度最快. 记录一下我的操作. Excel数据(测试数据)如图,有部分 ...
- python初中级开发面经(持续更新2020-3-7)
前言:欢迎各位留言补充遗漏的知识点,本文适用于初中级开发求职~ 文章目录 0. 开发者(程序猿)tip(杂) 1.游戏后端架构设计 1.1 设计方案 1.2 web服务架构 1.3 运维监控 2 面试 ...
- python开发题库-进阶(持续更新2020-3-18)
文章目录 1.网络相关 01 IP地址的正则 03 三次握手四次挥手全过程 为什么握手不是三次或者两次 04 使用python打开百度页面 05 进程 线程 协程 06 IO多路复用 07 TCP和U ...
最新文章
- 大数据在企业IT的应用
- SAP PM交叉申请时间表
- 菜鸟要做架构师(一)——如何快速开发中小型系统
- Go 1.4 正式版发布,官方正式支持 Android
- poj1050 To the Max
- 手贱随手在Linux敲了 as 命令,出不来了
- SAP Fiori attachment rename debug
- sql根据类别拆分上下级_运用SQL对黑五销售数据进行分析
- linux l显示详细信息,fdisk -l显示信息详解
- linux行位换行符,换行符或标点符号作为elasticsearch中的位置间隔
- 关于链表中经常用到的二级指针
- ubuntu服务器系统不识别,U盘安装16.04server版 安装好后重启 无法进入系统
- Matlab中的各种运算符的用法
- FX2LP与FPGA的简单批量回环
- 热烈祝贺:关于OpenJDK8 LINUX版本输入法候选框不能跟随光标移动的BUG及解决办法,已上报Oracle
- WIFi6与WIFI5技术路线演进及优势
- 计算机kb和gb单位的在线换算器,KB/MB/GB。。单位换算
- 龙渊服务器信息丢失,多多自走棋为什么停止运营 游戏数据转移腾讯服务器
- 物流行业智能化转型的幕后推手!盘点机器视觉物流分拣四大优势
- c语言调用win10麦克风,Win10系统麦克风如何开启?Win10系统开启麦克风的方法