Python选择并打开已加密的Excel文件(一)

1.随着“池子事件”的影响,银行业对客户数据信息保密工作被提到极其重要和位置。银行软件大凡涉及到客户数据的保存也变得小心谨慎。为了保护自己不至于被“甩锅”。软件开发中涉及要保存在操作人员电脑中的数据全部用EXCEL密码加密后保存。
2.使用者操作软件,打开EXCEL表时,自动将数据库中的加密码取出,配合自动打开相关excel表。如果操作员脱离我的软件,想打开保存的excel表,必须输入密码,这样至少数据被流出体系内,也不至于被轻松打开。
3.当然对付暴力猜密码者,想打开被加密的Excel表,自然不是我这个开发人员要背的“锅”。
4.下面的代码是软件自动打开加密excel表的办法,我花了一周时间,读了pywin32.chm相关文档,测试了完全用模拟键盘输入所有可能的密码,不现实也走不通的;测试了win32ui.sendmessage()函数,那个位置没有句柄的,走不通的。 走通的代码,我不解释了。看到这个代码的人,肯定是在苦苦思考,一定豁然开朗。

下面给个视频

python程序自动填入密码打开Excel加密文件

import os
import time
import win32ui
from win32.lib import win32con
from win32api import ( keybd_event , ShellExecute )
from win32gui import (IsWindow, IsWindowEnabled , IsWindowVisible,
    SetForegroundWindow, PostMessage , EnumWindows , GetWindowText)
import win32clipboard

def find_win_title_handle(title_name):
    """
    title_name,窗口标题名(字符串)
    hwnd_title=dict()   #定义字典在顶层定义 
    """
    hwnd_title=dict()   #定义字典 
    def get_all_hwnd(hwnd,mouse):
        """ EnumWindows(callback,0)中的callback函数 """
        if IsWindow(hwnd) and IsWindowEnabled(hwnd) and IsWindowVisible(hwnd):
            hwnd_title.update({hwnd:GetWindowText(hwnd)})
    EnumWindows(get_all_hwnd,0)   #从顶层开始找,可以随便传个小于60000以内的数字
    for h,t in hwnd_title.items(): 
        if t == title_name :
            return(hex(h),h)  #返回16进制,int十进制
    return(0,0)  #for 完了还没有就返回0

def press_hold_release(*args):
    """
    组合建按下与释放
    调用:press_hold_release("ctrl", "v") 该方法更通用,但要定义VK_CODE表
    press_hold_release(0x11,0x53) 按下ctrl+s = 0x11 + 0x53
    """
    for arg in args:    #顺序按下动作
        keybd_event(arg, 0, 0, 0)
        time.sleep(.05)
    for arg in args:    #顺序释放动作
        keybd_event(arg, 0, win32con.KEYEVENTF_KEYUP, 0)
        time.sleep(.05)

def set_clipboard(text,pyHand):
    """ 为粘贴板设置内容 """
    win32clipboard.OpenClipboard(pyHand)
    win32clipboard.EmptyClipboard()
    win32clipboard.SetClipboardText(text, win32con.CF_TEXT)
    win32clipboard.SetClipboardText(text, win32con.CF_UNICODETEXT)
    win32clipboard.CloseClipboard()

def open_excel_by_psw(psw,pyHand):
    """
    输入密码打开excel表,20200706增加符合客户信息安全保护功能
    通常将应用软件生成的excel表加入密码保存在某个确定的目录
    1.为了方便操作人员使用本系统时,程序自动输入密码并打开excel文件
    2.当脱离本系统时,必须输入保密。这样符合客户信息保密原则
    psw: 某一阶段的用户登录系统的密码
    """
    set_clipboard(psw,pyHand)
    press_hold_release(0x11,0x53) # 按下ctrl+s = 0x11 + 0x53
    press_hold_release(0x11,0x41) # 按下ctrl+a
    press_hold_release(0x11,0x56) # 按下ctrl+v
    press_hold_release(0x0D)  # 按下回车

def open_excel_in_pivot():
    """
     浏览.\pivot\下面的excel文件,然后选择一个excel文件,并自动根据密码打开的过程。20200707 yuce added, gl_pass:是操作员进入的密码
    """
    red_config(os.getcwd()+"\\src\\safeconfig.xlsx") #获取数据库的操作员相应加密Excel文件密码,存入gl_pass。看官不用在意
    EnumWindows(close_man_open,0)   #关闭不该打开的excel表
    dlg=win32ui.CreateFileDialog(1)  #1表示打开文件对话框
    dlg.SetOFNInitialDir(os.getcwd()+"\pivot")  #设置打开文件目录的起始目录
    dlg.DoModal()
    fname=dlg.GetPathName() #选某个文件 fname="d:\amlui\provt\aa.xlsx"
    if fname !="":   # 有文件被选中
        ShellExecute(0,'open',fname,'','',1)  #找开选择的文件 win32api.
        time.sleep(3) #等3秒中,让系统找到有没有密码窗口出现
        (hwnd,h)=find_win_title_handle("密码") #  hwnd 是16进制,h 是10十制的密码窗口句柄
        if hwnd != 0 : #  就是有密码窗口,该excely文件是加密过的。
            SetForegroundWindow(h)  #获取密码输入窗口焦点,win32gui. 
            open_excel_by_psw(gl_pass,h)  #gl_pass中存有密码
        else:
            pass
    else:  #无文件选中,什么也不做
        pass

你可能感兴趣的:(excel加密文件,pywin32)