Python批量打开多个不同密码的加密excel并且合并成为一个excel

某电商的订单进行整理,然后发现其实订单详情因为含有个人信息,所以下载的文件都带密码的(密码已知)。但是每个月的密码都不一样。

img

img

从2021年8月到2022年8月,刚好一年的订单,我想要进行全部合并。

img

其实没有密码的话,合并不难,或者是有密码,但是密码是固定的话,感觉也不难,大家觉得倒不如自己新建excel进行复制粘贴成为无密码保护的话,其实比密码操作更快捷呢? 我想做一个密码区文件,把每个文件的上的密码都写在一起。以后的话,就可以不需要操作源文件,可以比较《方便》

img

然后python上读取的时候,先读取文件,然后再读取文件帮变的所属密码,进行打开后,批量将所有的文件进行合并成文一个整的文件。

执行的难度会很大吗?

无密码的话,我会继续进行重命名,然后将Unlock为开头的文件名继续合并,这样子还是挺方便的,但是就是每个文件都要进行另外才做才可以。

for file in os.listdir('source/'):
    if file.startswith('Unlock_'):
        TMG_df = TMG_df.append(pd.read_excel('source/'+file, converters={"订单编号": str,"支付单号": str}))

可以用msoffcrypto和pandas库来打开加密excel,亲测有效,详见下面这个文章
https://blog.csdn.net/kuntagang/article/details/125024921

来两个测试文件,tao.ke.dao@qq.com

二、python代码
由于工作需要,将多个模板的excel整合成一个excel用于自动化数据导入,由于人工整合excel太麻烦,而且容易出错,所以决定通过python来处理这些繁杂的事务,5096.xls这个是新的模型,模型要先放进对应的文件夹才能生成,代码如下:

#!/usr/bin/env python
# coding=utf-8
import xlrd
import shutil
from xlutils.copy import copy
import datetime
 
 
class excel_cp:
    def __init__(self, ):
        day = datetime.date.today()
        self.str_day = str(day).replace('-', '')
 
    # 处理excel合并
    def excel_merge(self, old_name, new_name):
        if old_name == '你的文件名.xls':
            lead_source = 'r510'
        elif old_name == '你的文件名.xls':
            lead_source = 'r953'
        elif old_name == '你的文件名.xls':
            lead_source = 'r880'
        elif old_name == '你的文件名.xls':
            lead_source = 'r722'
        else:
            lead_source = 'r520'
        old_dir = 'E:\\load_bi\\' + self.str_day + '\\' + old_name
        new_dir = 'E:\\load_bi\\' + self.str_day + '\\' + new_name
        # 打开要使用的excel,获取要需要写入的行数
        bk = xlrd.open_workbook(old_dir)
        sh = bk.sheet_by_name("Page 1")
        nrows = sh.nrows
        # 打开要插入的excel,获取sheet页面的行数,再获取输入的sheet
        oldWb = xlrd.open_workbook(new_dir, formatting_info=True)
        in_sheet = oldWb.sheet_by_name("Sheet1")
        in_nrows = in_sheet.nrows
        newWb = copy(oldWb)
        sheet = newWb.get_sheet(0)
        for i in range(1, nrows):
            row_data = sh.row_values(i)
            print(row_data)
            for j in (in_nrows-1+i, i+in_nrows-1):
            # ---------写出文件到excel--------
                print("-----正在往j写入 " + str(j) + " 行")
                sheet.write(j, 0, label=sh.cell_value(i, 4))   # 将old_dir的第i行第5列数据写入到new_dir第j行第1列
                sheet.write(j, 1, label=sh.cell_value(i, 1))   # 将old_dir的第i行第2列数据写入到new_dir第j行第2列
                sheet.write(j, 3, lead_source)                 # 将指定数据写入到new_dir第2行第4列
                sheet.write(j, 14, label=sh.cell_value(i, 2))  # 将old_dir的第i行第3列数据写入到new_dir第j行第15列
                sheet.write(j, 15, label=sh.cell_value(i, 3))  # 将old_dir的第i行第4列数据写入到new_dir第j行第16列
                sheet.write(j, 28, label=sh.cell_value(i, 7))  # 将old_dir的第i行第8列数据写入到new_dir第j行第29列
                sheet.write(j, 29, label=sh.cell_value(i, 8))  # 将old_dir的第i行第9列数据写入到new_dir第j行第30列
                sheet.write(j, 30, label=sh.cell_value(i, 9))  # 将old_dir的第i行第10列数据写入到new_dir第j行第31列
        newWb.save(new_dir)
 
    # 复制文件到指定路径
    def file_copy(self, rm_file):
        rm_file_dir = 'E:\\load_bi\\' + self.str_day + '\\' + rm_file
        new_file_dir = 'C:\\fakepath\\' + rm_file
        shutil.copyfile(rm_file_dir, new_file_dir)
 
 
if __name__ == '__main__':
    # @version : 3.4
    # @Author  : robot_lei
    # @Software: PyCharm Community Edition
    # 将这多个excel合并成一张
    old_file_name_s = ('降价通知.xls', 'BI5096.xls', '车库线索.xls', '400溢出.xls', '潜客推荐.xls')
    leads_source_str = ('r510', 'r953', 'r520', 'r880', 'r722')
    new_file_name = '5096.xls'
    for old_file_name in old_file_name_s:
        excel_cp().excel_merge(old_file_name, new_file_name)
    # 复制文件到指定路径
    excel_cp().file_copy(new_file_name)