Python 基于win32com客户端实现Excel操作
Posted 授客的博客
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python 基于win32com客户端实现Excel操作相关的知识,希望对你有一定的参考价值。
测试环境
Python 3.6.2
代码实现
非多线程场景下使用
新建并保存EXCEL
import win32com.client
from win32api import RGB
def save_something_to_excel(result_file_path):
excel_app = win32com.client.Dispatch(\'Excel.Application\')
excel_app.Visible = False # 设置进程界面是否可见 False表示后台运行
excel_app.DisplayAlerts = False # 设置是否显示警告和消息框
book = excel_app.Workbooks.Add() # 添加Excel工作簿
sheet = excel_app.Worksheets(1) # 获取第一个Sheet
sheet.name = \'汇总统计\' # 设置Sheet名称
sheet.Columns.ColumnWidth = 10 # 设置所有列列宽
sheet.Columns(1).ColumnWidth = 20 # 设置第1列列宽
sheet.Rows.RowHeight = 15 # 设置所有行高
sheet.Rows(1).RowHeight = 20 # 设置第一行行高
usedRange = sheet.UsedRange # 获取sheet的已使用范围
rows = usedRange.Rows.Count # 获取已使用范围的最大行数,初始值为 1
cols = usedRange.Columns.Count # 获取已使用范围的最大列数,初始值为 1
print(rows, cols) # 输出 1 1
usedRange.Rows.RowHeight = 30 # 设置已使用范围内的行高
usedRange.Columns.ColumnWidth = 30 # 设置已使用范围内的列宽
# do something ...
row_index = 1
for index, item in enumerate([\'日期\', \'请求方法\', \'URL\', \'调用次数\']):
# 单元格赋值 sheet.Cells(row_index, col_index).Value = 目标值 row_index, col_index 起始值为1
sheet.Cells(row_index, index + 1).Value = item
row_index += 1
# do something else ...
usedRange = sheet.UsedRange
rows = usedRange.Rows.Count
cols = usedRange.Columns.Count
print(rows, cols) # 输出 1 4
sheet.Cells(1, 2).Font.Size = 29 # 设置单元格字体大小
sheet.Cells(1, 2).Font.Bold = True # 字体是否加粗 True 表示加粗,False 表示不加粗
sheet.Cells(2, 2).Font.Name = "微软雅黑" # 设置字体名称
# sheet.Cells(2, 2).Font.Color = RGB(0, 0, 255) # 设置字体颜色 # 不起作用
sheet2 = excel_app.Worksheets.Add() # 添加Sheet页
sheet2.Activate # 设置默认选中的sheet为sheet2
sheet3 = excel_app.Worksheets.Add()
#注意,Move操作,会将被移动的表单(本例中的sheet)设置为默认选中状态,也就是说覆盖 sheet.Activate所做的变更
sheet.Move(sheet3, None) # 将sheet移动到sheet3之前
book.SaveAs(result_file_path) # 注意:结果文件路径必须是绝对路径
book.Close() # 关闭工作簿
excel_app.Quit() # 退出
if __name__ == \'__main__\':
save_something_to_excel(\'D:\\\\codePojects\\\\logStatistics\\\\result\\\\result.xlsx\')
了解更多API,可以查看参考连接
读取现有EXCEL
import win32com.client
def read_something_from_excel(excel_file_path):
excel_app = win32com.client.Dispatch(\'Excel.Application\')
excel_app.Visible = False
excel_app.DisplayAlerts = False
book = excel_app.Workbooks.Open(result_file_path, False, True, None, None) # 打开工作簿
# do something ...
sheet = excel_app.Worksheets(1)
print(sheet.name)
print(sheet.Cells(1, 1).Value)
book.SaveAs(result_file_path) # 注意:结果文件路径必须是绝对路径
book.Close() # 关闭工作簿
excel_app.Quit() # 退出
if __name__ == \'__main__\':
read_something_from_excel(\'D:\\\\codePojects\\\\logStatistics\\\\result\\\\result.xlsx\')
多线程场景下使用
import threading
import win32com.client
import pythoncom
def save_something_to_excel(result_file_path):
pythoncom.CoInitialize()
excel_app = win32com.client.DispatchEx(\'Excel.Application\')
# excel_app = win32com.client.Dispatch(\'Excel.Application\')
excel_app.Visible = False
excel_app.DisplayAlerts = False
book = excel_app.Workbooks.Add()
sheet = excel_app.Worksheets(1)
sheet.name = \'汇总统计\'
row_index = 1
for index, item in enumerate([\'日期\', \'请求方法\', \'URL\', \'调用次数\']):
sheet.Cells(row_index, index + 1).Value = item
row_index += 1
book.SaveAs(result_file_path)
book.Close()
excel_app.Quit()
pythoncom.CoUninitialize() # 释放资源
if __name__ == \'__main__\':
for i in range(3):
file_path = \'D:\\\\codePojects\\\\logStatistics\\\\result\\\\result%s.xlsx\' % i
thread = threading.Thread(target=save_something_to_excel,
args=(file_path,))
thread.start()
说明:
-
如果不添加以下代码行:
pythoncom.CoInitialize()
会报错,如下:
pywintypes.com_error: (-2147221008, \'尚未调用 CoInitialize。\', None, None)
-
建议使用
excel_app = win32com.client.DispatchEx(\'Excel.Application\')
替代
# excel_app = win32com.client.Dispatch(\'Excel.Application\')
实践发现,多线程的情况下,使用
Dispatch
会出现报错,原因似乎是Dispatch
若发现进程已经存在的话,就不会创建新的进程。若不创建新的进程,有些操作会有冲突,可能会影响到已经打开的文件。
参考连接
https://learn.microsoft.com/zh-cn/office/vba/api/excel.font.color
作者:授客
微信/QQ:1033553122
全国软件测试QQ交流群:7156436
Git地址:https://gitee.com/ishouke
友情提示:限于时间仓促,文中可能存在错误,欢迎指正、评论!
作者五行缺钱,如果觉得文章对您有帮助,请扫描下边的二维码打赏作者,金额随意,您的支持将是我继续创作的源动力,打赏后如有任何疑问,请联系我!!!
微信打赏
支付宝打赏 全国软件测试交流QQ群
python基于pywinauto实现PC客户端自动化
一、前言
我们柠檬班的小可爱,在学完我们柠檬班自动化的课程之后,就掌握了接口自动化,web自动化,app自动化,这些工作中常用的自动化技能,在工作足以够应对90%以上的自动化需求了。不过近期也有部分小可爱在问PC端自动化怎么去做?对这个技术比较好奇,使用python可以不可以实现PC客户端自动化测试?答案当然是可以的,所以今天在这边专门整理了一遍文章,和大家一起聊聊如何使用python做PC端自动化!
二、环境安装
使用python实现来做PC端自动化,前提是先安装好python,那么还需要用到一个第三方库:pywinauto,在这边我们首先需要安装好这个库,安装命令如下:
pip install pywinauto
三、使用说明
安装好了之后,关于使用说明大家可以参照官方文档上的说明,如下图:
上述内容翻译如下:
就是说在我们安装好Pywinauto之后,首先要确定哪种可访问性技术(pywinauto的backend)可以用于我们的应用程序,在windows上受支持的辅助功能技术有两种:
-
Win32 API (
backend="win32"
) 默认backend -
MS UI Automation (
backend="uia"
)
如果您不能确定程序到底适用于那种backend,可以借助于GUI对象检查工具来做,常用的检查工具有Inspect.ex,Spy++ 等,这个不做过多介绍,大家自行学习和下载,使用很简单,也非常便捷。
四、快速入门
在安装好环境之后,并且确定了应用程序适用的backend,那么接下来我们就可以使用Pywinauto这个模块来对应用程序进行自动化操作了
1、连接到应用程序
这边以window自带的计算器程序作为案例,给大家做讲解
连接应用程序,首先需要用到pywinauto.application.Application()来创建一个应用程序对象,然后再连接到应用程序,有如下两种方法:
-
方式一:直接通过start方法打开操作的应用程序,
from pywinauto import application # 方式一:创建应用程序时可以,指定应用程序的合适的backend,start方法中指定启动的应用程序 app = application.Application(backend=\'uia\').start(\'notepad.exe\')
-
方式二:连接已经打开应用程序,可以通过connect连接到指定的应用程序
from pywinauto import application # 方式二:查看要打开的程序进程号,通过process指定进程号连接 app = application.Application().connect(process=19035)
运行以上代码,就会自动打开记事本记事本,如下
2、窗口选择
打开这个窗口之后,我们要操作该窗口的话,那么就的先选中这个窗口,关于窗口的选择有一下几种方式
# 方式一 :不适用于窗口名为中文的 wind_1 = app.窗口名 # 方式二 :窗口名可以为中文 wind_2 = app["窗口名"] # 案例使用:选择上面打开的计算器程序窗口 wind_calc = app[\'无标题 - 记事本\']
3、控件操作
程序窗口中的内容,把它称之为控件,我们要对这个窗口的内容进行操作,就需要选择到对应的控件,
-
获取所有控件
我们可以通过print_control_identifiers()这个方法,来获取这个窗口下的直接子控件,如下:
app[\'无标题 - 记事本\'].print_control_identifiers()
打印出来的结果如下:
上面打印出来的内容分别对应窗口种的以一下部分:
-
选择控件
关于控件选择的方法有好几种,最简单的方法如下:
# 选择控件的方法 wind_calc = app["窗口名"]["控件名"] # 案例操作:选择编辑窗口 edit = app[\'无标题 - 记事本\'][\'Edit\']
-
内容输入
在上面选择到编辑窗口之后,我们就可以进行内容输入了,
内容输入的方法:type_key()
# 在编辑栏种输入内容 edit.type_keys("柠檬班") edit.type_keys("python自动化") edit.type_keys("musen")
运行结果如下:
4、键盘操作
输入完上述内容之后,接下来我们要修改编辑框中的内容,
通过键盘完成以下操作:全选(ctrl+A) 复制(ctrl+C) 粘贴(ctrl+V)
-
pywinauto.keyboard.send_key
pywinauto模拟操作键盘,需要使用到 pywinauto.keyboard.send_keys这个方法
# 导入模块 from pywinauto.keyboard import send_keys # 全选(ctrl+A) send_keys("^a") # 复制(ctrl+C) send_keys("^c") # 粘贴(ctrl+V) send_keys("^v") # 回车键 send_keys("{VK_RETURN}") # 粘贴(ctrl+V) send_keys("^v")
-
常见的按键操作
-
字母按键用按键小写字母表示
-
常用的一些按键
ESC键:VK_ESCAPE 回车键:VK_RETURN TAB键:VK_TAB Shift键:VK_SHIFT Ctrl键:VK_CONTROL Alt键:VK_MENU
-
按键修饰符
-
# 对于一些常用的按键,可以通过修饰符来表示,使用的时候比较方便 \'+\': {VK_SHIFT} \'^\': {VK_CONTROL} \'%\': {VK_MENU} Alt键 # 上面:全选(ctrl+A) 复制(ctrl+C) 粘贴(ctrl+V)就使用的是修饰符^来代表ctrl
-
更多的键盘操作大家可以参考官网文档
-
5、鼠标操作
-
pywinauto. mouse
pywinauto操作鼠标,需要导入mouse模块,mouse模块中设置了一系列的鼠标操作事件
-
鼠标移动:move方法
-
move(coords=(x轴坐标,y轴坐标))
-
缓慢移动鼠标案例
for i in range(10): x = 10 * i y = 10 * i time.sleep(0.5) # 移动鼠标 mouse.move(coords=(x, y))
-
-
鼠标点击:click
# button指定左击还是右击,coords指定鼠标点击的位置 # 3.1、鼠标单击 # 指定位置,鼠标左击 mouse.click(button=\'left\', coords=(40, 40)) # 指定位置 鼠标右击 # mouse.click(button=\'right\', coords=(100, 200)) # 3.2 鼠标双击 mouse.double_click(button=\'left\', coords=(140, 40)) # 4 按下鼠标:press # 将属性移动到(140,40)坐标处按下 mouse.press(button=\'left\', coords=(140, 40)) # 5 释放鼠标:repleace # 将鼠标移动到(300,40)坐标处释放, mouse.release(button=\'left\', coords=(300, 40)) # 6、右键单击指定坐标 mouse.right_click(coords=(400, 400)) # 7、鼠标中键单击指定坐标(很少用的到) mouse.wheel_click(coords=(400, 400)) # 8 滚动鼠标 # coords:指定鼠标的坐标位置。 # wheel_dist指定鼠标滚轮滑动的次数,正数往上,负数往下。 mouse.scroll(coords=(1200,300),wheel_dist=-3)
-
五、说明
关于pywinauto模块的基本使用就该大家介绍到这里了,对pc端自动化感兴趣的同学可以往这个方向去深入学习。
ps:关于pc端自动化的视频教程可以私聊获取
以上是关于Python 基于win32com客户端实现Excel操作的主要内容,如果未能解决你的问题,请参考以下文章
win32client dispatch在python中失败,而win32 :: ole new在perl中成功运行for com dll