python自动化:uiautomation、pyautogui操作会计记账系统(5):财务公开

python自动化:uiautomation、pyautogui操作会计记账系统(5):财务公开

#coding=utf-8
#Beijia To Excel accounting disclosure财务公开
import xlrd, xlwt, pyautogui, time, pyperclip, openpyxl,pandas,os, tkinter,\
    datetime, win32gui, uiautomation, subprocess, xlwings,json, easygui

pyautogui.PAUSE = 1
mont_list =['一月', '二月', '三月', '四月', '五月', '六月', '七月', '八月', '九月', '十月', '十一月', '十二月']
mont_input = 12
year_input = 2021

def creat_file(year_input):
    print('开始运行创建文件夹自定义函数……')
    with open('**电脑端账套号生成村委会文件夹用.txt', 'r') as f:
        dic = []
        for line in f.readlines():
            line = line.strip('\n')  # 去掉换行符\n
            b = line.split('\t')  # 将每一行以空格为分隔符转换成列表
            #print(list(b))
            dic.append(b)

        print(dic)
        admin_villi_dict=dict(dic)
        print('账套所在的村委会文件夹列表是:')
        print(admin_villi_dict)#列表转字典
    if not os.path.exists('D:\**会计系统导出数据'):
        os.mkdir('D:\**会计系统导出数据')

    admin_villi_list=['前锋', '西海', '八家', '冲洋', '新围', '竹洛', '竹湖', '新屋', '达材', '朝中', '官窦', '伞塘', '白岗', '稔坪', '西坑', '三和', '居委']

    year = time.strftime("%Y")
    #print("当前年份是:", year)
    if year_input==year:#等于
        time1 = time.strftime("%Y%m%d", time.localtime())  # 加上秒不会出现同名
    else:


        time1= year_input #赋值
    #print('创建第3层文件夹folder3_1')
    folder3_1 = r"D:\**会计系统导出数据" + '\\' + time1 + '财务公开系列表'
    #print('判断文件夹是否存在,不存在则创建,文件保存在:'+folder3_1)
    if not os.path.exists(folder3_1):
        os.mkdir(folder3_1)
    #print('创建第4层文件夹folder4_i')
    for i in range(0,16):
        folder_admin_villi=time1+admin_villi_list[i]+'财务公开系列表'
        folder4_i=r'D:\**会计系统导出数据'+'\\'+ time1 + '财务公开系列表'+'\\' +folder_admin_villi
        if not os.path.exists(folder4_i):
            os.mkdir(folder4_i)
            #print('创建文件夹:'+folder4_i)

    return  admin_villi_dict,folder3_1


def check_file(folder3_1):
    # 打开文件

    path= folder3_1
    dirs = os.listdir(path)
    year = time.strftime("%Y")



    file_accnt_num_list=[]
    for home, dirs, files in os.walk(path):
        for file_name in files:
            #filelist.append(os.path.join(home, file_name))
            if os.path.splitext(file_name)[1] == '.xls':
                #print(file_name)
                file_year = file_name[0:4]  # 截取文件名前4个字符
                #print(file_year)
                # os.rename(file, new)  # 进行重命名

                if file_year == year:
                    # 取整方法是可以去除0,但是遇到字符串不能转化为整型会报错
                    # file_accnt_num=int(file_name[9:12])
                    s = file_name[9:12]
                    file_accnt_num = "".join(s[::1]).lstrip("0")
                    #print(file_accnt_num)
                else:
                    s = file_name[5:8]
                    file_accnt_num = "".join(s[::1]).lstrip("0")
                    #print(file_accnt_num)
                file_accnt_num_list.append((file_accnt_num))

    #print(filelist)
    #print(file_accnt_num_list)
    #print('对列表进行排序,查找时可能减少遍历次数。也便于根据账套号顺序查找')
    #file_accnt_num_list2=file_accnt_num_list.sort()
    #print('sort影响列表本身,sorted不影响列表本身,用sort排序')
    file_exist_list = sorted(file_accnt_num_list)
    print('已导出的文件列表','file_exist_list:')
    print(file_exist_list)
    print('已导出的文件数量',len(file_exist_list))
    return file_exist_list

def accnt_login(account_Num):
    wc1 = uiautomation.WindowControl(searchDepth=1, Name='帐套登陆')

    # 设置为顶层
    #pyautogui.alert(text="按回车键继续程序", title="提示")  # 窗口前置才能用键盘快捷键
    wc1.SetTopmost(True)  # 置顶能用快捷键
    pc2_1= wc1.PaneControl(searchDepth=1, Name='帐套信息')
    ec3_8=pc2_1.EditControl(searchDepth=1, Name='', foundIndex=2)
    ec3_8.SetFocus()
    #print('ec3_8')
    #print('账套号输入框的位置是:')
    #print(ec3_8.BoundingRectangle)
    pyperclip.copy(account_Num) #account_Num是账套号
    pyautogui.hotkey('ctrl', 'v')  # 再粘贴
    pyautogui.press('enter')



def user_login():
    wc1=uiautomation.WindowControl(searchDepth=1, Name='用户注册')
    # 设置为顶层
    wc1.SetTopmost(True)  # 置顶能用快捷键
    pyautogui.press('down')  # 向下选择超级用户
    pyautogui.press('enter')  # 点击确定
    pyautogui.press('enter')  # 点击确定
    #print('超级用户登录成功')

def  select_year(screenWidth, screenHeight, year_input):
    #print('选择年份')
    #print('深度1')
    wc1 = uiautomation.WindowControl(searchDepth=1, Name='**经营管理系统V2007 - [财务公开]')
    # 设置为顶层
    #wc1.SetTopmost(True)
    #print(wc1.Name)

    #print('深度2') #isum自创字母后的数字表示深度
    #sbc2_1= wc1.StatusBarControl(searchDepth=1, ClassName= 'TStatusBar')
    pc2_2= wc1.PaneControl(searchDepth=1,ClassName='MDIClient')
    #print(pc2_2.Name)#工作区

    #print('深度3')
    wc3_1= pc2_2.WindowControl(searchDepth=1,Name='财务公开')
    #print(wc3_1.Name)  # 工作区

    #print('深度4')
    pc4_3= wc3_1.PaneControl(searchDepth=1, ClassName='TPanel',Name= '', foundIndex=3)
    #print(pc4_3.BoundingRectangle)
    #print(pc4_3)
    #print('深度5')
    pc5_2 = pc4_3.PaneControl(searchDepth=1, ClassName='TPanel',Name= '', foundIndex=2)
    #print(pc5_2)
    #print('深度6')
    rbc6_3= pc5_2.RadioButtonControl(searchDepth=1, Name='特定数据')
    #print('点击:'+rbc6_3.Name)
    rbc6_3.Click()



    cbc6_4 = pc5_2.ComboBoxControl(searchDepth=1, ClassName='TComboBox')
    cbc6_4.Click()
    #print(cbc6_4)
    mont_show = cbc6_4.GetValuePattern().Value  # month show会计系统4
    # 显示月份
    #print(mont_show)
    tc7_1 = cbc6_4.TextControl(searchDepth=1, Name='')
    #print(tc7_1)

    for c in range(len(mont_list)):
        if mont_show == mont_list[c]:  # 一月对应的i是0
            # print('c+1')

            # print(c+1)
            #print(mont_list[c])
            if mont_input > c + 1:
                for t in range(abs(mont_input - (c + 1))):
                    pyautogui.press('down')
            else:
                for t in range(abs(mont_input - (c + 1))):
                    pyautogui.press('up')

    year = time.strftime("%Y")
    #print("当前年份是:", year)
    if year_input!=year:
        #pyautogui.press('tab')
        #tc7_1.DoubleClick()
        #tc7_1.Click()
        ec6_5 = pc5_2.EditControl(searchDepth=1, ClassName = 'TEdit')
        ec6_5.SetFocus()
        ec6_5.DoubleClick()
        pyperclip.copy(year_input)
        pyautogui.hotkey('ctrl', 'v')
        # 选项出现较慢,需要等待
        #print('点击生成')
        # #pyautogui.click(screenWidth/8.3478, screenHeight /13.5)  # 系统中等字体显示,点击生成按钮(230,80)
        # pyautogui.click(screenWidth /10.6667, screenHeight / 16.6154)  # 系统小字体显示,点击生成按钮(180,65)
        time.sleep(1)



    #pc5_2 = pc4_3.PaneControl(searchDepth=1, ClassName='TPanel', foundIndex=2)
    #print('深度6')
    pc6_1b= pc5_2.PaneControl(searchDepth=1, Name='')
    #print(pc6_1b)
    rbc7_1b =pc6_1b.RadioButtonControl(searchDepth=1, Name='A4') #选择A4纸
    #print(rbc7_1b)
    rbc7_1b.Click()
    cbc6_4b = pc5_2.ComboBoxControl(searchDepth=1, ClassName = 'TComboBox')
    # tc7_1b = cbc6_4b.TextControl(searchDepth=1, Name='') #月份下拉框
    # # print(tc7_1b)
    # tc7_1b.SetFocus()
    # tc7_1b.Click()
    # for i in range(3):
    #     pyautogui.press('Down')




# #代替三方鼠标定位软件
# x1,y1,x2,y2=700,27,788,51 #另选账套位置
# x1,y1,x2,y2=316,184,1919,986 #序时簿显示的范围
# x1,y1,x2,y2=259,560,1607,700#空白的区域
# x1,y1,x2,y2=315,183,1920,1013
# # pyautogui.moveTo(x1,y1,duration=2)
# # pyautogui.moveTo(x2,y1,duration=2)
# # pyautogui.moveTo(x2,y2,duration=2)
# # pyautogui.moveTo(x1,y2,duration=2)
# # pyautogui.moveTo(x1,y1,duration=2)
#
#




def to_excel(screenWidth, screenHeight, year_input, accnt_Num_name, i,admin_villi_dict, tabl_type):


    wc1 = uiautomation.WindowControl(searchDepth=1, Name='**经营管理系统V2007 - [财务公开]')
    # time1 =time.strftime("%Y%m%d%H%M%S", time.localtime())#加上秒不会出现同名
    year = time.strftime("%Y")
    # print("当前年份是:", year)
    if year_input == year:  # 等于
        time1 = time.strftime("%Y%m%d", time.localtime())  # 加上秒不会出现同名
    else:
        time1 = year_input  # 赋值
    # file_path= r"D:\**会计系统导出数据"+'\\'+time1+'现金三栏明细账'+'\\'+file_name+'.xls'
    # 字典必须传入字符串,admin_villi_dict[str(i)]
    #fie_path_pare = r"D:\**会计系统导出数据" + '\\' + time1 + '财务公开系列表'

    file_path = r"D:\**会计系统导出数据" + '\\' + time1 + '财务公开系列表' + '\\' + time1 + admin_villi_dict[str(i)] + '财务公开系列表'
    if not os.path.exists(file_path):
        # print('如果没有预先归类到行政村文件夹,就放在上一级文件夹')
        file_path = r"D:\**会计系统导出数据" + '\\' + time1 + '财务公开系列表'



    # print('判断文件夹是否存在,不存在则创建,文件保存在:'+file_path)
    # if not os.path.exists(file_path):
    #     os.mkdir(file_path)
    file_name = time1 + " " + accnt_Num_name + tabl_type #table type表格类型
    #file_title = "序时簿(" + accnt_Num_name + ")"

    print('文件保存路径是:' + file_path)
    file_full_path = file_path + '\\' + file_name + '.xls'
    print("文件名是:", end="")
    print(file_name)
    if os.path.exists(file_full_path):  # 如果文件不存在(即未导出)
        print('{}--文件已经存在,不需导出。'.format(file_full_path))
    else:
        pyautogui.click(screenWidth / 8.5333, screenHeight /15.4286)  # 系统小等字体点击导出(225,70)
        time.sleep(0.5)
        pyautogui.keyDown('backspace')#长摁删除键
        time.sleep(0.5)
        pyautogui.keyUp('backspace')
        #pyautogui.typewrite(file_name) #不能写入中文
        pyperclip.copy(file_full_path)  # 写入文件名
        pyautogui.hotkey('ctrl', 'v')  # 再粘贴
        pyautogui.press('enter')  # 点击确定
        print('导出Excel表会自动打开,所以需要等待较长时间。')
        wc1.Minimize()  # 最小化缩小窗口
        time.sleep(20)#等待自动打开Excel,必须足够长时间,不然会出现文件名出现不了
        pyautogui.click(screenWidth / 3.2, screenHeight / 4.6957)  # 点击标题,使得WPS前置。(600,230),Excel的显示方式必须是全屏
        # pyautogui.typewrite(" ")
        # pyautogui.press('backspace')
        # #yautogui.press('insert')  #
        # #print('修改表格标题:'+file_title)
        # pyperclip.copy(file_title)  # 写入表格标题
        # pyautogui.hotkey('ctrl', 'v')  # 再粘贴
        # time.sleep(0.5)
        pyautogui.hotkey('alt', 'f4')  # 关闭Excel
        time.sleep(0.5)
        pyautogui.press('enter')  # 点击确定,保存更改
        time.sleep(1)
    wc1.Restore()  # 将窗口回复到最大化
    return  file_full_path
    #这里需要加一个,假如保存文件失败之后,**系统错误提示
    #标题是错误,内容是路径不存在或者文件不可写! 确定。
    #pyautogui.press('enter')


def excel_modifier(file_full_path):
    # 创建app,打开工作表
    app = xlwings.App(visible=False, add_book=False)
    app.screen_updating = False
    app.display_alerts = False
    load_wb = app.books.open(file_full_path)
    load_ws = load_wb.sheets.active
    print('\t已打开工作表……')
    # 处理列,将指定列从大到小删除(避免先删除小列导致后续列号变动)
    #错误方法:for cell in ['J1', 'M1', 'N1', 'O1', 'P1', 'Q1']:
    for cell in ['Q1', 'P1', 'O1', 'N1', 'M1', 'J1']:
        load_ws.range(str(cell)).api.EntireColumn.Delete()  # 删除 ’J1‘ 单元格所在的列。删除对应出纳单号、制单、审核、过帐、审核标志、过帐标志
        print('删除{}列'.format(cell))
        #load_ws.api.columns('M').delete

    # load_ws.range('P1').api.EntireColumn.Delete()
    # load_ws.range('J1').api.EntireColumn.Delete()
    # load_ws.range('M1').api.EntireColumn.Delete()
    # load_ws.range('N1').api.EntireColumn.Delete()
    # load_ws.range('O1').api.EntireColumn.Delete()
    # load_ws.range('P1').api.EntireColumn.Delete()
    # load_ws.range('Q1').api.EntireColumn.Delete()

    print('\t开始处理表格……需要等待一定时间')
    load_wb.save()
    load_wb.close()
    app.quit()
    print('处理完毕===>>>', file_full_path, '\n\n')


def chage_accnt():
    #print('深度1')
    wc1 = uiautomation.WindowControl(searchDepth=1, Name='**经营管理系统V2007 - [凭证查询]')
    # 设置为顶层
    #wc1.SetTopmost(True)
    #print(wc1.Name)

    #print('深度2') #isum自创字母后的数字表示深度
    #sbc2_1= wc1.StatusBarControl(searchDepth=1, ClassName= 'TStatusBar')
    pc2_2= wc1.PaneControl(searchDepth=1,ClassName='MDIClient')
    #print(pc2_2.Name)#工作区

    mbc2=wc1.MenuBarControl(searchDepth=1, Name= '应用程序')
    #print('mbc2')
    #print(mbc2.Name)

    mic3_9=mbc2.MenuItemControl(searchDepth=1, Name='', foundIndex=9)
    #print('mic3_9')
    #print(mic3_9.BoundingRectangle)#(700,27,788,51)[88x24]
    #print('点击另选账套')
    mic3_9.Click()

    #另选账套的坐标:Rect: (700,27,788,51)
    #这四个 参数 分别代表的意思是: left   top   right   bottom   是 左 上 右 下。


def open_fold():
    # #open folder,打开文件夹,用win+E快捷键
    pyautogui.hotkey('win', 'e')
    pyautogui.press('tab')
    #pyautogui.press('insert')
    pyautogui.press('enter')
    pyperclip.copy('D:\**会计系统导出数据')
    pyautogui.hotkey('ctrl', 'v')
    pyautogui.press('enter')



def func(year_input):
    #print('当前屏幕分辨率宽 X 高:')
    screenWidth, screenHeight = pyautogui.size()
    #print(screenWidth, screenHeight)  # 屏幕分辨率1920 1080,导出的按钮595,80
    msg = '浏览需要导出的村委会Excel表格文件并打开'
    title = '打开文件'
    filePath = easygui.fileopenbox(msg, title)
    #print(filePath)
    df = pandas.read_excel(filePath)

    #df=pandas.read_excel('**电脑端账套号pandas.xlsx')
    #df = pd.read_excel(src_file, header=1, usecols='B:F')
    #header参数为一个整数,从0开始索引,其为选择的行,比如1表示Excel中的第2行。
    #usecols参数设定选择的Excel列范围范围(A-…),例如,B:F表示读取B到F列。

    accnt_dict=dict(zip(df['账套号'],df['账套号加单位简称']))

    #print('获取字典的键,要转化为列表。第一个键是:',end='')

    account_Num= list(accnt_dict)[0]
    print(account_Num)





    year = time.strftime("%Y")
    #print("当前年份是:", year)
    #year_input = pyautogui.prompt('请输入账套查询的年份:')
    #print('弹窗输入年份:' + year_input)
    #print('不要把创建文件夹自定义函数放在循环内,先创建文件夹……')
    admin_villi_dict,folder3_1 = creat_file(year_input)
    #print('遍历3级文件夹下所有文件,检查表格上账套号对应的Excel表是否已导出')
    file_exist_list=check_file(folder3_1)

    #print('Excel文件上要导出的文件数量及文件列表是:','list_accnt_dict(要先将字典的键转化为字符串格式,两个列表的元素都是字符串才能做减法)')
    list_accnt_dict= [str(t) for t in list(accnt_dict)]
    #print(len(list_accnt_dict),list_accnt_dict)

    print('已导出的数量及文件列表', 'file_exist_list:')
    print(len(file_exist_list),file_exist_list)
    print('删除两个列表重复值,一个列表减去另一个列表,用set(集合)操作')
    accnt_list2=list(set(list_accnt_dict)-set(file_exist_list))
    print('sort影响列表本身,sorted不影响列表本身,用sort排序')
    accnt_list2 = sorted(accnt_list2)
    print('未导出的文件数量及文件列表是:')

    print(len(accnt_list2),accnt_list2)
    list_tabl_accn_disc =['资产负债表', '收益分配表', '财务收支情况公布表', '应收款', '应付款', '现金收支明细表', '银行收支明细表', '固定资产明细表', '在建工程明细表']
    list_tabl_accn_disc = ['资产负债表', '收益分配表', '应收款', '应付款', '固定资产明细表', '在建工程明细表']
    #list_tabl_accn_disc = ['在建工程明细表']

    file_numb = 0
    for i in accnt_list2:
        #print('i在之前转化为字符串,要重新转化为数值格式')
        i=int(i)
        #print('直接用遍历字典的键值循环,i就是账套号')
        accnt_Num_name=accnt_dict[i]
        print('账套号是:' + str(i)+',账套' '名称是:'+accnt_Num_name)
        time.sleep(1)



        #账套号登录自定义函数
        accnt_login(i)
        time.sleep(1)
        #用户登录自定义函数
        user_login()

        time.sleep(1)

        # 选项出现较慢,需要等待
        #print('点击财务公开')
        pyautogui.click(screenWidth / 2.8235, screenHeight / 1.08)  # 系统小字体显示,点击财务公开(680, 100)
        time.sleep(1)

        select_year(screenWidth, screenHeight,year_input)
        #print('等待2秒,数据生成需要时间')
        time.sleep(3)
        #print('导出Excel表涉及到创建文件夹,创建文件,需要输入屏幕长宽、年份、账套号、账套名称、账套所在村委会字典')
        # 导出财务公开系列表
        wc1 = uiautomation.WindowControl(searchDepth=1, Name='**经营管理系统V2007 - [财务公开]')
        # 设置为顶层
        # wc1.SetTopmost(True)
        # print(wc1.Name)

        # sbc2_1= wc1.StatusBarControl(searchDepth=1, ClassName= 'TStatusBar')
        pc2_2 = wc1.PaneControl(searchDepth=1, ClassName='MDIClient')
        # print(pc2_2.Name)#工作区
        wc3_1 = pc2_2.WindowControl(searchDepth=1, Name='财务公开')
        # print(wc3_1.Name)  # 工作区
        pc4_3 = wc3_1.PaneControl(searchDepth=1, ClassName='TPanel', Name='', foundIndex=3)
        # print(pc4_3.BoundingRectangle)
        print(pc4_3)
        # print('深度5')

        pc5_1 = pc4_3.PaneControl(searchDepth=1, ClassName='TPanel', Name='')
        # print(pc5_1)
        lc6_3c = pc5_1.ListControl(searchDepth=1, ClassName='TListView')
        # print(lc6_3c)
        # lc7_3 = lc6_3c.ListItemControl(searchDepth=1, Name ='收益分配表')
        # print(lc7_3)
        # lc7_3.Click()
        #先点击一个类型表(如资产负债表)再点击生成按钮才不会报错。才能生成系列表格。
        time.sleep(1)
        tabl_type = '资产负债表'
        lc7_tabl_type = lc6_3c.ListItemControl(searchDepth=1, Name=tabl_type)
        lc7_tabl_type.Click()
        time.sleep(2)

        pyautogui.click(screenWidth / 27.4286, screenHeight / 15.4286)  # 点击生成按钮(70, 70)




        # pc2_5c = wc1_c.PaneControl(searchDepth=1, ClassName='TPanel', foundIndex=2)
        # #print(pc2_5c)
        # ec3_2c = pc2_5c.EditControl(searchDepth=1, ClassName='TSpinEdit')#年份
        # #print(ec3_2c)
        # #ec3_2c.Click()
        # cbc3_1c = pc2_5c.ComboBoxControl(searchDepth=1, ClassName='TComboBox')#月份父级
        # #cbc3_1c.SetFocus()
        # tc4_1_c = cbc3_1c.TextControl(searchDepth=1, ClassName='') #月份
        # #tc4_1_c.SetFocus()
        #
        #
        # #不是区间段?
        # ec3_4c = pc2_5c.EditControl(searchDepth=1, ClassName='TSpinEdit',foundIndex=2),#年份
        # print(ec3_4c)
        # ec3_2c.Click()
        # cbc3_5c = pc2_5c.ComboBoxControl(searchDepth=1, ClassName='TComboBox', foundIndex=2)#月份父级
        # cbc3_5c.SetFocus()
        # tc4_1_c2 = cbc3_1c.TextControl(searchDepth=1, ClassName='') #月份
        # tc4_1_c2.SetFocus()
        # tc4_1_c2.Click()


        # pyautogui.press('Tab')
        # pyautogui.press('Tab')
        # pyautogui.press('Tab')
        time.sleep(1)

        # pyperclip.copy(mont_input)
        # pyautogui.hotkey('ctrl', 'v')  # 再粘贴月份
        # pyautogui.press('Tab')

        wc1_c = uiautomation.WindowControl(searchDepth=1, Name='报表生成')
        #print(wc1_c.BoundingRectangle)
        pc2_5c = wc1_c.PaneControl(searchDepth=1, ClassName = 'TPanel', foundIndex=2)
        print(pc2_5c)
        cbc3_5c = pc2_5c.ComboBoxControl(searchDepth=1, ClassName = 'TComboBox', foundIndex=2)
        cbc3_5c.Click()
        print(cbc3_5c)
        mont_show = int(cbc3_5c.GetValuePattern().Value)  # month show会计系统4
        # 显示月份
        # print(mont_show)

        if mont_show < mont_input:  # 一月对应的i是0
            for t in range(abs(mont_show - mont_input)):
                pyautogui.press('down')
        elif mont_show > mont_input:
            for t in range(abs(mont_show - mont_input)):
                pyautogui.press('up')
        else:
            pass
        pyautogui.press('enter')
        time.sleep(1)
        pyautogui.press('tab')
        pyperclip.copy(year_input)
        pyautogui.hotkey('ctrl', 'v')  # 再粘贴年份
        #pyautogui.press('Down')
        # 点击生成按钮
        pyautogui.click(screenWidth / 1.9592, screenHeight / 1.7143)  # (980,630)
        time.sleep(2)
        pyautogui.hotkey('Y') #弹出对话框:报表已经建立,是否重新建立报表?是(),否(N)
        #ControlType: TextControl    ClassName: Static    AutomationId: 65535    Rect: (880,518,1074,537)[194x19]    Name: '不能建立当前财务月度以后的报表!' 的上一级是wc2_1c
        time.sleep(9)
        if wc1_c.WindowControl(searchDepth=1, Name = '**软件').Exists():  #wc2_1c
            pyautogui.press('enter')
            time.sleep(1)




            # 点击取消按钮按钮
            pyautogui.click(screenWidth / 1.8113, screenHeight / 1.7143)  # (1060,630)
            time.sleep(1)
        else:

            for t in range(len(list_tabl_accn_disc)): #第一级循环用i,第二季循环用t
                time.sleep(1)
                tabl_type = list_tabl_accn_disc[t]
                if tabl_type == '在建工程明细表': #在建工程必须向下翻页,显示出来才能定位。
                    sbc7_1c =lc6_3c.ScrollBarControl(searchDepth=1, Name = '垂直滚动条')
                    bc8_3_c = sbc7_1c.ButtonControl(searchDepth=1, Name='向下翻页')
                    bc8_3_c.Click()
                    bc8_3_c.Click()
                    bc8_4_c = sbc7_1c.ButtonControl(searchDepth=1, Name='下一行')
                    bc8_4_c.Click()
                    bc8_4_c.Click()
                    time.sleep(1)
                lc7_tabl_type = lc6_3c.ListItemControl(searchDepth=1, Name=tabl_type)
                lc7_tabl_type.Click()
                time.sleep(1)
                file_full_path= to_excel(screenWidth, screenHeight, year_input, accnt_Num_name, i,admin_villi_dict, tabl_type=tabl_type)
                time.sleep(2)






        #pyautogui.click(722,37)  #另选账套
        #account_Num+=1
        #print('系统小字体显示点击另选账套坐标135,36')
        pyautogui.click(screenWidth/3.2,screenHeight/30)  #另选账套
        time.sleep(3)#另选账套必须足够长时间,因为窗口切换幅度大
        file_numb+=1
        print('导出第{}个文件'.format(file_numb))
    #pyautogui.alert(text=r"文件保存在D:\**会计系统导出数据", title="提示")  #
if __name__ == "__main__":
    #creat_file('2019')
    print('桌面不能打开其他程序,程序在左下角运行。程序运行时不能操作鼠标和键盘,不能打开word和WPS。文件保存在D:\**会计系统导出数据.')
    #pyautogui.alert(text="桌面不能打开其他程序,程序在左下角运行。程序运行时不能操作鼠标和键盘。文件保存在D:\**会计系统导出数据",title="提示")
    time.sleep(1)

    #time.sleep(20)
    # 打开程序
    proc_list = ['D:\**经营管理系统2007版\BJACCOUNT.EXE', 'E:\**经营管理系统2007版\BJACCOUNT.EXE', 'C:\**经营管理系统2007版\BJACCOUNT.EXE',
                 'F:\**经营管理系统2007版\BJACCOUNT.EXE', 'G:\**经营管理系统2007版\BJACCOUNT.EXE','H:\**经营管理系统2007版\BJACCOUNT.EXE',
                 'I:\**经营管理系统2007版\BJACCOUNT.EXE', 'J:\**经营管理系统2007版\BJACCOUNT.EXE', 'K:\**经营管理系统2007版\BJACCOUNT.EXE',
                 'D:\Program Files\**经营管理系统2007版\BJACCOUNT.EXE', 'E:\Program Files\**经营管理系统2007版\BJACCOUNT.EXE',
                 'C:\Program Files\**经营管理系统2007版\BJACCOUNT.EXE', 'F:\Program Files\**经营管理系统2007版\BJACCOUNT.EXE',
                 'G:\Program Files\**经营管理系统2007版\BJACCOUNT.EXE', 'H:\Program Files\**经营管理系统2007版\BJACCOUNT.EXE',
                 'I:\Program Files\**经营管理系统2007版\BJACCOUNT.EXE', 'J:\Program Files\**经营管理系统2007版\BJACCOUNT.EXE',
                 'K:\Program Files\**经营管理系统2007版\BJACCOUNT.EXE',
                 'D:\Program Files (x86)\**经营管理系统2007版\BJACCOUNT.EXE', 'E:\Program Files (x86)\**经营管理系统2007版\BJACCOUNT.EXE',
                 'C:\Program Files (x86)\**经营管理系统2007版\BJACCOUNT.EXE', 'F:\Program Files (x86)\**经营管理系统2007版\BJACCOUNT.EXE',
                 'G:\Program Files (x86)\**经营管理系统2007版\BJACCOUNT.EXE', 'H:\Program Files (x86)\**经营管理系统2007版\BJACCOUNT.EXE',
                 'I:\Program Files (x86)\**经营管理系统2007版\BJACCOUNT.EXE', 'J:\Program Files (x86)\**经营管理系统2007版\BJACCOUNT.EXE',
                 'K:\Program Files (x86)\**经营管理系统2007版\BJACCOUNT.EXE',
                 ]
    for i in range(len(proc_list)):
        try:
            subprocess.Popen(proc_list[i])
            #print('程序在:{}'.format(proc_list[i]))
            break
        except:
            #print('程序不在:{}'.format(proc_list[i]))
            pass

    time.sleep(3)
    wc = uiautomation.WindowControl(searchDepth=1, Name='帐套登陆')
    # 设置为顶层
    # pyautogui.alert(text="按回车键继续程序", title="提示")  # 窗口前置才能用键盘快捷键
    #print('窗口前置才能用键盘快捷键')
    wc.SetTopmost(True)  # 置顶能用快捷键
    # accnt_Num_txt = wc.EditControl()
    # print('accnt_Num_txt',accnt_Num_txt)
    for year_input in range(2021, 2020, -1):
        year_input=str(year_input)
        print(year_input)
        func(year_input)

    open_fold()











# '''首先,找到xlwings安装目录下的文件:你的python安装位置\Python39\Lib\site-packages\xlwings\_xlwindows.py,
#  然后,找到代码313行 self._xl=COMRetryObjectWrapper(DispatchEx('Excel.Application'))
#  默认使用的是win32com模块下面的DispatchEx方法,此方法会启动一个新进程,把DispatchEx修改为Dispatch就可以啦
#   self._xl = COMRetryObjectWrapper(Dispatch('Excel.Application'))
# 如果你用的是WPS,修改代码为: self._xl = COMRetryObjectWrapper(Dispatch('ket.Application'))
# '''
#
# def del_datas(file_full_path):
#     print('delete column datas from Excel')
#     df = pandas.read_excel(file_full_path,header=1)
#     print(df)
#     df1 = df.drop(['制单','审核','过帐'],axis=1) #删除列
#     print(df1)
#     # 其实问题理解axis有问题,也许简单的来记就是axis=0代表往跨行(down),而axis=1代表跨列(across),作为方法动作的副词。换句话说:
#     # 使用0值表示沿着每一列或行标签\索引值向下执行方法;使用1值表示沿着每一行或者列标签模向执行对应的方法。
#     # 轴axis用来为超过一维的数组定义的属性,二维数据拥有两个轴:第0轴沿着行的垂直往下,第1轴沿着列的方向水平延伸。
#     # 所以问题当中df.drop(‘列名’, axis=1)代表将‘列名’对应的列标签(们)沿着水平的方向依次删掉。
#     # header = None准们针对没有表头的表,这也是默认值;
#     # header = 1指定第一行作为表头;
#     for i in accnt_dict.keys():
#         print(i)
#     #nrows = df.shape[0]  # 行数

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
根据UIAutomation封装了很多自定义方法 现在只需要实例化之后 直接调用方法即可完成。比如单击某个按钮,现在只需要直接调用ClickElement,非常实用。 ClickElement 单击指定的自动化元素 DisselectAllDataGridRow 不选中所有行 DisselectDataGridRow 不选中特定的某一行 FocusWindow 获取窗口焦点 GetAllElement 获取指定父自动化元素下的所有激活的控件 GetAllElementDetails 获取指定自动化元素下的详细信息包括AutomationID,ControlType以及Name GetAllMenus 获取所有菜单项 GetAllSubMenus 获取某个菜单下的所有子菜单项 GetColumnsFromGridLine 获取指定行的所有列 GetColumnValuesFromGridLine 获取行的每一列数据 GetControlType(AutomationElement) 获取制动自动化元素的控件类型 GetControlType(TypeOfControl) 获取UIAutomation的控件类型 GetDocumentText 获取document控件的值 GetElementByID 获取父自动化元素下指定元素控件ID的引用 GetElementByName 获取父自动化元素下的指定子元素的引用 GetElementsByControlType 获取父自动化元素下的特定类型的所有自动化元素 GetGridLinesFromDataGrid 获取网格控件的全部行元素的引用 GetHeaderFromDataGrid 获取指定网格控件的标题栏引用 GetMenuBar 获取菜单栏控件 GetMenuByName 通过特定的名称去获取菜单UI自动化元素 GetName 获取指定自动化元素的名称 GetSubMenuByName 获取主菜单下的指定子菜单项的引用 GetValue 获取指定自动化元素的值 GetWindowByName(String) 获取desktop下的指定窗口名称的子UI自动化元素 GetWindowByName(String, AutomationElement) 获取特定父UI自动化元素下的制定窗口名称的子UI自动化元素 GetWindowList() 获取当前桌面根下所有的UI自动化元素下 GetWindowList(AutomationElement) 获取特定父UI自动化元素下的所有窗口的名称 RefindMainApplication 重新获取desktop下的指定窗口的自动化元素引用 SelectAllDataGridRow 选中所有行 SelectDataGridRow(AutomationElement) 选中特定的某一行 SelectDataGridRow(AutomationElement, Boolean) 将特定的DateGridRow加入选中项中 SelectValueInComboBox 从下拉框中选中指定值的项 SelectValueInListBox 从列表中选中指定值的项 SetValue 给予指定自动化元素赋值 以上的方法还不是很完善 正在完善中。如果有什么意见和建议,请发送邮件获取 chenxu7601257@qq.com 如果你看了这个帮助文件之后觉得有用的,请发邮件获取,我将把dll文件给你。谢谢。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值