import os
import threading
import openpyxl

# 获取桌面路径
desktop_path = os.path.join(os.path.expanduser('~'), 'Desktop')

# 定义线程锁
lock = threading.Lock()

# 定义拆分表格函数
def split_excel(filename):
    # 加载工作簿
    wb = openpyxl.load_workbook(filename)
    
    # 获取所有工作表
    sheets = wb.sheetnames
    
    # 冻结第一个工作表窗格A1列的内容
    ws1 = wb[sheets[0]]
    ws1.freeze_panes = 'A2'
    
    # 遍历所有工作表
    for sheet_name in sheets:
        # 获取当前工作表
        ws = wb[sheet_name]
        
        # 获取表头列
        headers = []
        for cell in ws[2]:
            headers.append(cell.value)
        
        # 按照表头列相同的行进行拆分
        for header in set(headers):
            new_wb = openpyxl.Workbook()
            new_ws = new_wb.active
            
            # 复制窗格A1的内容
            new_ws['A1'].value = ws1['A1'].value
            new_ws.freeze_panes = 'A2'
            
            # 复制表头
            for col_num, cell in enumerate(ws[1], 1):
                new_ws.cell(row=1, column=col_num, value=cell.value)
                new_ws.cell(row=1, column=col_num)._style = cell._style
            
            # 复制相同表头的行
            row_num = 2
            for row in ws.iter_rows(min_row=2):
                if row[headers.index(header)].value == header:
                    for col_num, cell in enumerate(row, 1):
                        new_ws.cell(row=row_num, column=col_num, value=cell.value)
                        new_ws.cell(row=row_num, column=col_num)._style = cell._style
                    row_num += 1
            
            # 保存新的工作表
            new_filename = os.path.join(desktop_path, f'{sheet_name}_{header}.xlsx')
            new_wb.save(new_filename)
            
            # 释放线程锁
            with lock:
                print(f'{new_filename} saved.')
    
    # 关闭工作簿
    wb.close()

# 定义多线程拆分表格函数
def split_excel_multithread(filenames):
    threads = []
    for filename in filenames:
        t = threading.Thread(target=split_excel, args=(filename,))
        threads.append(t)
        t.start()
    
    for t in threads:
        t.join()

# 测试代码
if __name__ == '__main__':
    filenames = ['test1.xlsx', 'test2.xlsx', 'test3.xlsx']
    split_excel_multithread(filenames)

代码功能:

  1. 多线程拆分: 使用多线程技术同时处理多个Excel文件,提高拆分效率。
  2. 按表头拆分: 根据指定表头列的内容,将相同内容的行拆分到新的工作表中。
  3. 保留格式: 复制单元格内容的同时,保留原始单元格的格式信息。
  4. 冻结窗格: 保留原始Excel文件冻结窗格的设置。
  5. 批量处理: 支持同时处理多个Excel文件。

使用方法:

  1. 将代码保存为Python文件(例如split_excel.py)。
  2. 将需要拆分的Excel文件放到桌面文件夹中。
  3. 修改代码中filenames变量,指定要处理的文件名列表。
  4. 运行代码:python split_excel.py

运行结果:

代码运行完成后,会在桌面文件夹中生成拆分后的Excel文件,并打印保存的文件名。


原文地址: https://www.cveoy.top/t/topic/fW7b 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录