通过pywinauto和win32gui和pyautogui自动化实现批量导入

清空文件,两行以下的文件

import os# 要操作的文件路径
file_path = 'example.txt'# 删除文件
if os.path.exists(file_path):os.remove(file_path)# 重新创建文件
with open(file_path, 'w') as file:file.write('')  # 如果需要写入内容,可以在这里写入

拆分文件选择写入

from openpyxl import load_workbook
from openpyxl import Workbook
from openpyxl import styles
from openpyxl.styles import *
import pandas as pd
import string
import re
import os
from openpyxl.comments import Commentdef segmentation_col(df, col_name):# 按列的值分组list_type = df[col_name].unique()df_list = []for item in list_type:df_list.append(df[df[col_name] == item])return df_listdef create_excel(file_path):# 没有就创建if os.path.exists(file_path):print("文件已存在")print(file_path)else:# 创建一个新的 Excel 文件wb = Workbook()wb.save(file_path)if __name__ == '__main__':file_path1 = './src/冬装客户库存清理.xlsx'file_path2 = './src/分组数据.xlsx'# delete_empty_rows_and_columns(file_path1)create_excel(file_path2)# 加载工作簿wb = load_workbook(file_path1)# 获取sheet页,修改第一个sheet页面为name1 = wb.sheetnames[0]ws1 = wb[name1]ws1.title = "销售明细"wb.save(file_path1)# 销售明细df0 = pd.read_excel(file_path1, sheet_name='销售明细', dtype={"颜色代码": str, '尺码代码':str})df0 = df0.dropna()df_list = segmentation_col(df0, "仓库名称")print(len(df_list))for i in range(0, len(df_list)):item = df_list[i]item = item.reset_index(drop=True)store_code = item["仓库代码"][0]result_df = item.copy()result_df.pop("仓库代码")result_df.pop("商品名称")result_df.pop("仓库名称")result_df["店员代码"] = ""result_df["VIP代码"] = ""result_df["备注"] = ""result_df["标准价"] = ""result_df["折扣"] = ""result_df["单价"] = ""print(store_code)result_df = result_df[["商品代码", "颜色代码", "尺码代码", "店员代码", "VIP代码", "备注", "数量", "标准价", "折扣", "单价"]]result_df.to_excel(file_path2, index=False)# 插入一行wb = load_workbook(file_path2)# 获取sheet页,修改第一个sheet页面为name1 = wb.sheetnames[0]ws1 = wb[name1]ws1.title = "销售明细"wb.save(file_path2)# 获取指定的文件wb = load_workbook(file_path2)# 获取指定的sheetws = wb["销售明细"]ws.insert_rows(1)ws["A1"] = "ltGen"# 为单元格A1添加批注comment = Comment('TableName:ExcelMx;BRow:2;ERow:2;BCol:1;ECol:11;', 'Author')ws['A1'].comment = commentws["B1"] = "商品分色分码明细"wb.save(file_path2)quit()

将文件复制到两行之后

总体思路

通过win32获取窗口句柄

通过pywinauto 连接窗口

并找到工具栏控件点击

通过pyautogui对图片点击,选中图

通过pywinauto键盘输入

通过for循环实现多次导入

import win32gui
import win32con
import win32api
import pyautogui
from pynput import keyboard, mouse
from loguru import logger
from threading import Thread
import time
import re
from openpyxl import load_workbook
from openpyxl import Workbook
from openpyxl import styles
from openpyxl.styles import *
import pandas as pd
import string
import re
import os
import datetime
import time
from pywinauto import Application
from pywinauto import findwindows
from pywinauto import keyboard
import pyautogui
from pywinauto import mouse
pyautogui.PAUSE = 1def find_all_window():hd = win32gui.GetDesktopWindow()# 获取所有子窗口hwnd_child_list = []win32gui.EnumChildWindows(hd, lambda hwnd, param: param.append(hwnd), hwnd_child_list)str_list = []for hwnd in hwnd_child_list:print("句柄:", hwnd, "标题:", win32gui.GetWindowText(hwnd))str_list.append("句柄:" + str(hwnd) + "标题:" + win32gui.GetWindowText(hwnd))# f.write("句柄:" + str(hwnd) + " 标题:" + win32gui.GetWindowText(hwnd) + '\n'# 将句柄生成文件list_as_string = '\n'.join(str_list)# 打开文件进行写入with open('output.txt', 'w', encoding='utf-8') as file:file.write(list_as_string)# 将查询的窗口前置,handle是句柄
def preposition_windows(handle):hwnd = win32gui.FindWindow(0, win32gui.GetWindowText(handle))  # 寻找窗口if not hwnd:print("找不到该窗口")else:win32gui.SetForegroundWindow(hwnd)  # 前置窗口def find_control(handle,class_name):result = []# class_name是窗口类名,name是窗口名,可以只写一个,另一个为None,也可以两个都写# handle = wg.FindWindow(class_name, name)def callback(handle, res):if win32gui.GetClassName() == class_name:result.append(str(handle) + ": " + win32gui.GetWindowText(handle))return Truewin32gui.EnumChildWindows(handle, callback, None)return result# result就是控件名if __name__ == '__main__':# 查询所有窗口,当名字查不到句柄时,使用# find_all_window()# 连接app,通过窗口名称handle = win32gui.FindWindow(None, "frm_ImportExcel")# 使用uia模式,访问更多的标签app = Application(backend="uia").connect(handle=handle)# 验证是否找到窗口win32gui.ShowWindow(handle, win32con.SW_SHOW)win32gui.SetForegroundWindow(handle)  # 前置窗口dlg = app["frm_ImportExcel"]# 查找工具栏tool_bar = dlg.child_window(class_name='TToolBar')for i in range(0, 1):# 选取第一个编辑框time.sleep(1.5)tool_bar.child_window(title="新增", control_type="Button").click_input()time.sleep(0.5)channel_code = '000'store_code = '10300'note = '库存清理'file_path = "11212导出格式.xlsx"image_path = './src/aim1.png'# 定位图片location = pyautogui.locateOnScreen(image_path)# 如果找到图片,则计算它的中心并移动鼠标if location is not None:x, y = pyautogui.center(location)pyautogui.moveTo(x, y)pyautogui.click()pyautogui.scroll(600)  # 向上滚动600个单位;else:print('图片未找到')image_path = './src/aim2.png'# 定位图片location = pyautogui.locateOnScreen(image_path)# 如果找到图片,则计算它的中心并移动鼠标if location is not None:x, y = pyautogui.center(location)pyautogui.moveTo(x, y)pyautogui.click()else:print('图片未找到')time.sleep(2)keyboard.send_keys('{DOWN}')time.sleep(0.2)keyboard.send_keys(channel_code)time.sleep(0.2)keyboard.send_keys('{ENTER}')time.sleep(0.2)keyboard.send_keys('{DOWN}')time.sleep(0.2)keyboard.send_keys(store_code)time.sleep(0.2)keyboard.send_keys('{ENTER}')time.sleep(0.2)keyboard.send_keys('{DOWN}')time.sleep(0.2)keyboard.send_keys('{DOWN}')time.sleep(0.2)keyboard.send_keys('{DOWN}')time.sleep(0.2)keyboard.send_keys('{DOWN}')time.sleep(0.2)keyboard.send_keys('{DOWN}')time.sleep(0.2)keyboard.send_keys('{DOWN}')time.sleep(0.2)keyboard.send_keys('{DOWN}')time.sleep(0.2)keyboard.send_keys(note)keyboard.send_keys('{ENTER}')time.sleep(0.2)# 点击导出tool_bar.child_window(title="导入", control_type="Button").click_input()time.sleep(0.5)keyboard.send_keys("1")time.sleep(0.2)keyboard.send_keys("1212导出格式.xlsx")time.sleep(0.2)keyboard.send_keys('{ENTER}')time.sleep(1)# 确认导入keyboard.send_keys('{ENTER}')time.sleep(1)# 点击保存tool_bar.child_window(title="保存", control_type="Button").click_input()time.sleep(0.5)# 点击转入tool_bar.child_window(title="转入", control_type="Button").click_input()time.sleep(0.5)#确认转入keyboard.send_keys('{ENTER}')time.sleep(1)###time.sleep(1)#tool_bar.child_window(title="导入", control_type="Button").click_input()#time.sleep(2)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/10896.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

关于一致性,你该知道的事儿(上)

关于一致性,你该知道的事儿(上) 前言一、缓存一致性二、内存模型一致性三、事务一致性四、分布式事务一致性4.1 分布式系统的一些挑战4.2 关于副本的一些概念4.3 分布式事务之共识问题4. 3.1 PC(two-phase commit, 2PC)4.3.2 Raft 三、后记参…

公有云Linux模拟TCP三次挥手与四次握手(Wireshark抓包验证版)

目录 写在前面环境准备实验步骤1. 安装nc工具2. 使用nc打开一个连接2.1 公有云-安全组放行对应端口(可选) 3. 打开Wireshark抓包工具4. 新开终端,进行连接5. 查看抓包文件,验证TCP三次握手与四次挥手TCP三次握手数据传输TCP四次挥…

交叉编译编译ffmpeg:ERROR: x265 not found using pkg-config(未解决)

具体错误 ERROR: x265 not found using pkg-configIf you think configure made a mistake, make sure you are using the latest version from Git. If the latest version fails, report the problem to the ffmpeg-userffmpeg.org mailing list or IRC #ffmpeg on irc.lib…

gin:01-框架安装

概述 看下 Gin 框架的官方介绍: Gin 是一个用 Go (Golang) 编写的 web 框架。 它是一个类似于 martini 但拥有更好性能的 API 框架, 由于 httprouter,速度提高了近 40 倍。 如果你是性能和高效的追求者, 你会爱上 Gin。 是的,就是用 Gin 来写…

Netty源码分析二NioEventLoop 剖析

剖析方向 NioEventLoop是一个重量级的类,其中涉及到的方法都有很复杂的继承关系,调用链,要想把源码全部过一遍工作量实在是太大了,于是小编就基于下面的这些常见的问题来对NioEventLoop的源码来进行剖析 1.Seletor何时创建 1.1Se…

python删除一个文件夹所有文件

在Python中,可以使用os模块来删除一个文件夹中的所有文件,但保留文件夹本身。以下是一个简单的例子: import osdef delete_files_in_folder(folder_path):for filename in os.listdir(folder_path):file_path os.path.join(folder_path, fi…

2024OD机试卷-密码解密 (java\python\c++)

题目:密码解密 题目描述 给定一段“密文”字符串 s,其中字符都是经过“密码本”映射的,现需要将“密文”解密并输出。 映射的规则(‘a’ ~ ‘i’)分别用(‘1’ ~ ‘9’)表示;(‘j’ ~ ‘z’)分别用(“10*” ~ “26*”)表示。 约束:映射始终唯一。 输入描述 “…

【408真题】2009-08

“接”是针对题目进行必要的分析,比较简略; “化”是对题目中所涉及到的知识点进行详细解释; “发”是对此题型的解题套路总结,并结合历年真题或者典型例题进行运用。 涉及到的知识全部来源于王道各科教材(2025版&…

TMS320F280049 CLB模块--LUT4 OUTLUT(4)

LUT4 示意图如下: OUTLUT 示意图如下: 寄存器 参考文档: TMS320F28004x Real-Time Microcontrollers Technical Reference Manual (Rev. G)

Java spring boot注解@RequestParam

RequestParam 是 Spring MVC 中的一个注解,它用于从 HTTP 请求的参数中提取数据,并绑定到控制器方法的参数上。这个注解通常用在方法的参数上,以表示该参数的值应该从 HTTP 请求的参数中获取。 以下是一些关于 RequestParam 的关键点&#x…

【设计模式】之适配器模式

系列文章目录 (其他设计模式可以到 👉👉👉)设计模式_小杰不秃头的博客 😊😄😛 前言 今天继续给大家介绍23种设计模式中的适配器模式,这个模式相比于其他模式比较好理解…

【数据结构】图的应用---最小生成树(Prim,Kruskal)、最短路径(BFS,Dijkstra,Floyd)、拓扑排序、关键路径、有向无环图表达式

文章目录 5.图的应用5.1 最小生成树5.1.1 Prim算法5.1.2 Kruskal算法5.1.3 最小生成树代码A.邻接矩阵B.邻接表 5.2 最短路径5.2.1 BFS5.2.2 Dijkstra5.2.3 Floyd5.2.4 三种算法的比较 5.3 有向无环图描述表达式5.4 拓扑排序5.5 关键路径 5.图的应用 5.1 最小生成树 定义 对一个…

模型推导:BG/NBD(预测用户生命周期(CLV)模型)

CLV(Customer Lifetime Value)指的是客户生命周期价值,用以衡量客户在一段时间内对企业有多大的价值。企业对每个用户的流失与否、在未来时间是否会再次购买,还会再购买多少次才会流失等问题感兴趣,本文中的BG/NBD模型…

Linux|进程控制

进程创建 fork函数初识 在linux中fork函数时非常重要的函数,它从已存在进程中创建一个新进程。新进程为子进程,而原进程为父进程。 返回值:子进程中返回0,父进程返回子进程id,出错返回-1 进程调用fork,当…

Spring底层入门篇-前言

从2024-04-13至2024-05-12,历时一个月时间,Spring底层入门篇全部完成,共计十一篇。该系列的定位是:主线取材于B站某马的教学视频,再加上个人的理解的学习笔记。 该系列的原标题是Spring高级篇,但是在某一天…

AVL 树的理解和简单实现

目录 1. AVL 树 1.1. AVL 树的概念 1.2. AVL 树的性质 2. AVL 树的框架如下 2. AVL树的 插入 2.1. 平衡因子的更新 2.2.1. 平衡因子更新的第一种情况 2.2.2. 平衡因子更新的第二种情况 2.2.3. 平衡因子更新的第三种情况 2.2.4. 平衡因子更新的代码框架如下 2.2. AV…

《C++学习笔记---初阶篇6》---string类 上

目录 1. 为什么要学习string类 1.1 C语言中的字符串 2. 标准库中的string类 2.1 string类(了解) 2.2 string类的常用接口说明 2.2.1. string类对象的常见构造 2.2.2. string类对象的容量操作 2.2.3.再次探讨reserve与resize 2.2.4.string类对象的访问及遍历操作 2.2.5…

5KVA电力高频逆变器DU5000HD不间断电源DU3000HD

UPS电力高频逆变器DU3000HD不间断电源模块DU5000HD,单机版2KVA逆变电源DU2000HD,并机版2KVA逆变器DU2000H,3KVA逆变装置DU3000H,DU5000H,IV2000HD-2,IV3000HD-2,IV5000HD-2,IV2000H-…

基于51单片机音乐倒计时倒数计数器设计( proteus仿真+程序+设计报告+原理图+讲解视频)

基于51单片机音乐倒计时设计( proteus仿真程序设计报告原理图讲解视频) 仿真图proteus7.8及以上 程序编译器:keil 4/keil 5 编程语言:C语言 设计编号:S0090 1. 主要功能: 基于51单片机的音乐倒计时器设计 设计内…

清醒脑科学,摆脱杂念/拧巴内耗

参考视频:【清醒脑科学】内耗/拧巴/杂念难止?你需要头脑的一键重启_哔哩哔哩_bilibili Part1:思维矛盾的真相 1. 信息量不足:就推测答案,因不定态导致的内耗 大脑觉得这个问题很重要,于是过度的紧张情绪&…