本文实现了批量给excel加密的办法 ,参考的网上的部分代码。运行时候第一个对话框是原始文件所在的位置选择,第二次对话框选择输出文件的位置,同时对加密函数添加一句代码,解决了批量运行报错的问题,pwd_xlsx里面加了wb.Close()这一句,有效解决问题。
本文第二个特点,引用了之前见过一位大侠,用汉语写的一个获取文件路径的函数。
import os, sys
import win32com.client
import time
import hashlib
import tkinter as tk #调用GUI图形模块
from tkinter import filedialog
def pwd_xlsx(old_filename,new_filename,pwd_str,pw_str=''):
xcl = win32com.client.Dispatch("Excel.Application")
# pw_str为打开密码, 若无 访问密码, 则设为 ''
wb = xcl.Workbooks.Open(old_filename, False, False, None, pw_str)
xcl.DisplayAlerts = False
# 保存时可设置访问密码.
wb.SaveAs(new_filename, None, pwd_str, '')
time.sleep(0)
wb.Close()
xcl.Quit()
def read_path(path):
dirs = os.listdir(path)
return dirs
def 方法_获取文件路径(data_dir):
文件集 = os.listdir(data_dir)
filename=[]
#return 文件集
for 文件名 in 文件集:
文件名分解 = 文件名.split('.')
#print(文件名分解)
if 文件名分解[-1] == 'xlsx' or 文件名分解[-1] == 'xls':
excel文件路径 = (data_dir + 文件名)
filename.append(excel文件路径)
#print(excel文件路径)
#print(filename)
return filename
def main():
root = tk.Tk()
root.withdraw()
data_dir = filedialog.askdirectory(title='请选择excel所在文件夹')+'/'
# 将源文件路径里面的文件转换成列表file_list
file_list = 方法_获取文件路径(data_dir)
dirs='临时文件'
if not os.path.exists(dirs):
os.makedirs(dirs) #输出文件夹
#global result_dir
result_dir =dirs+'/'
# 源文件路径
source = data_dir
# 目标文件路径
ob =filedialog.askdirectory(title='请选择输出另存的文件夹')+'/'
a = 0 # 列表索引csv文件名称放进j_list列表中,索引0即为第一个csv文件名称
j_list = read_path(source) # 文件夹中所有的csv文件名称提取出来按顺序放进j_list列表中
#print("---->", read_path(source)) # read_path(source) 本身就是列表
#print("read_path(source)类型:", type(read_path(source)))
# 建立循环对于每个文件调用excel_to_csv()
for it in file_list:
print(it+'开始加密')
j = j_list[a] # 按照索引逐条将csv文件名称赋值给变量j
#print(j)
# 给目标文件新建一些名字列表
new_filename=ob + '\\' + str(j)
pwd_str = '654321'#新密码自定义
aa = it
#print(aa.replace("/", "\\"))
bb =ob+str(j)
#print(bb.replace("/", "\\"))
path1=aa.replace("/", "\\")
path2=bb.replace("/", "\\")
#Remove_password_xlsx(aa.replace("/", "\\"), pw_str)
try:
pwd_xlsx(path1, path2,pwd_str)
print(it+'加密完成')
time.sleep(1)
except Exception as e:
print(it+'加密失败,请手动设置')
pass
a = a+1
if __name__ == '__main__':
main()