如何批量结构化分汇多工作表sheet?

如果遇到这样情形,多文件夹多文件,多工作表的分汇场景;可以参考以下方法解决。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

一、如遇合并表格,注意结构化

首先在汇总以前,保证第一列表,合并列结构化为基本单元格。

(一)定义函数,遍历文件

定义函数ycl1(),先遍历B文件夹下C文件夹路径即“1月数据”“2月数据”“3月数据”

def ycl1(): #结构化数据sheet1
    # 设置文件夹路径
    folder_pathss = r"C:\Users\Desktop\A\B"    ## 第一处要改!!!!!!!!!
    folder_paths = [os.path.join(folder_pathss, file) for file in os.listdir(folder_pathss)] # os.listdir(folder_pathss)遍历folder_pathss下所有文件

(二)结构化合并工作表sheet1

接着,再遍历filename的工作表1。其中,filname是以“1月数据”为例下所有.xlsx文件,file_pathfilename的路径,结构化遍历所有文件后,注意自定义一个空文件夹(例如“test”)保存。

 for folder_path in folder_paths:	//遍历例如“1月数据”“2月数据”“3月数据”文件夹
        # 创建一个新的工作簿用于合并数据
        merged_workbook = Workbook()  # Create a new workbook

        # 遍历文件夹中的所有文件
        for filename in os.listdir(folder_path):
            if filename.endswith(".xlsx"):  # 只处理Excel文件!!!!!!!
                file_path = os.path.join(folder_path, filename)
                # 1.加载数据
                work_book = load_workbook(filename=file_path, data_only=True) # 控制带有公式的单元格是否具有公式(默认值)
                sheet = work_book["Sheet1"]  # 假设所有文件的工作表名称相同
                ## 第二处要改!!!!!!可以根据自己表格名字修改 定义Sheet_name = filename[:-5] sheet = work_book[Sheet_name]
取消填充单元格*

1. 获取索引信息

a. 首先,sheet.merged_cells.ranges这个变量是MergedCellRange的集合。
b. merged_cells返回的是一个列表,每一个元素是合并单元格的位置信息的数组,数组包含四个元素(起始行,结束行,起始列,结束列)结束的行和列都加了1
c. 方法示例如下(图中为xlrd读取,适用于xls文件) xlrd库

                # 2. 找出所有的合并单元格的索引信息
                mc_range_list = [str(item) for item in sheet.merged_cells.ranges]
                print(mc_range_list)

[‘A53:A54’, ‘A27:A37’, ‘A55:A58’, ‘A4:A9’, ‘A21:A26’, ‘A2:J2’, ‘A42:A45’, ‘A46:A52’, ‘A10:A20’, ‘A38:A41’, ‘A60:J60’, ‘A1:J1’]
在这里插入图片描述
2. 取消合并
获取合并单元格值cell_value

                # 3. 批量取消合并单元格,填充数据
                for mc_range in mc_range_list:
                    # 取得左上角值、右下角的坐标
                    top_left, bot_right = mc_range.split(":")  # ["A53", "A54"]
                    top_left_col, top_left_row = sheet[top_left].column, sheet[top_left].row  # (1, 53,)
                    bot_right_col, bot_right_row = sheet[bot_right].column, sheet[bot_right].row  # (1, 54,)
                    # 记下该合并单元格的值
                    cell_value = sheet[top_left].value  #A53的值
                    # 取消合并单元格
                    sheet.unmerge_cells(mc_range)

3. 遍历填充
嵌套循环遍历合并单元格范围内的每个单元格。从左上角单元格右侧的一个单元格和其下方的一个单元格开始,这些单元格被视为子单元格。对于这些子单元格中的每一个,将值设置为 ,之前保存的合并单元格的值cell_value

                    # 批量给子单元格赋值
                    # 遍历列
                    for col_idx in range(top_left_col, bot_right_col + 1):
                        # 遍历行
                        for row_idx in range(top_left_row + 1, bot_right_row + 1):
                            sheet[f"{chr(col_idx + 64)}{row_idx}"] = cell_value

根据文件结构化情况修剪不必要的数据行、保存

                # 4. 删除前三行和最后一行  根据表格情况修剪行!!!!!
                sheet.delete_rows(1, 2)
                sheet.delete_rows(sheet.max_row)

                # 保存更改
                file_paths = file_path[:22] + '\\test\\' + filename  ## 第三处要改 自定义保存路径!!!!!!
                work_book.save(file_paths)

                #将数据合并到新的工作簿中
                for row in sheet.iter_rows(values_only=True):
                    merged_workbook.active.append(row)

我这保存在"~/A/test"路径下
在这里插入图片描述

二、确认主键,合并所有文件数据

新起一列“时间”作为主键区分,这里的时间直接应用文件名
定义函数merge_excel(folder_paths,output_file),合并test路径下所有文件
这里 folder_paths = "/A/test"main()定义

def merge_excel(folder_paths, output_file): #合并数据
    # 创建一个空的 DataFrame 用于存储合并后的数据
    merged_data = pd.DataFrame()

    # 遍历每个Excel
    for excel_files in os.listdir(folder_paths):
        # # 遍历每个 Excel 文件并处理
        file_path = os.path.join(folder_paths, excel_files)
        # 打开 Excel 文件
        df = pd.read_excel(file_path,sheet_name='Sheet1')
        # 添加文件名作为新列
        file_name = os.path.splitext(excel_files)[0]
        df.insert(0,'时间',file_name)
        # 将数据添加到 merged_data 中
        merged_data = pd.concat([merged_data, df], ignore_index=True)
    merged_data.to_excel(output_file,index=False)

三、sheet2同理

(一)结构化
定义函数ycl2(), 注意修改工作表名,根据表情况修剪非结构化行。

def ycl2(): #结构化sheet2
    # 设置文件夹路径
    folder_pathss = r"C:\Users\Desktop\A\B"
    folder_paths = [os.path.join(folder_pathss, file) for file in os.listdir(folder_pathss)]

    for folder_path in folder_paths:
        # 创建一个新的工作簿用于合并数据
        merged_workbook = Workbook()  # Create a new workbook

        # 遍历文件夹中的所有文件
        for filename in os.listdir(folder_path):
            if filename.endswith(".xlsx"):  # 只处理Excel文件
                file_path = os.path.join(folder_path, filename)
                # 1.加载数据
                work_book = load_workbook(filename=file_path, data_only=True)
                sheet = work_book["Sheet2"]  # 假设所有文件的工作表名称相同

                # 2. 找出所有的合并单元格的索引信息
                mc_range_list = [str(item) for item in sheet.merged_cells.ranges]

                # 3. 批量取消合并单元格,填充数据
                for mc_range in mc_range_list:
                    # 取得左上角值的坐标
                    top_left, bot_right = mc_range.split(":")  # ["A1", "A12"]
                    top_left_col, top_left_row = sheet[top_left].column, sheet[top_left].row  # (1, 1,)
                    bot_right_col, bot_right_row = sheet[bot_right].column, sheet[bot_right].row  # (1, 12,)
                    # 记下该合并单元格的值
                    cell_value = sheet[top_left].value 
                    # 取消合并单元格
                    sheet.unmerge_cells(mc_range)
                    # 批量给子单元格赋值
                    # 遍历列
                    for col_idx in range(top_left_col, bot_right_col + 1):
                        # 遍历行
                        for row_idx in range(top_left_row + 1, bot_right_row + 1):
                            sheet[f"{chr(col_idx + 64)}{row_idx}"] = cell_value
                # 4. 删除前三行和最后一行
                sheet.delete_rows(1, 3)

                # 保存更改
                file_paths = file_path[:22] + '\\test\\' + filename
                work_book.save(file_paths)

                # 将数据合并到新的工作簿中
                for row in sheet.iter_rows(values_only=True):
                    merged_workbook.active.append(row)

(二)汇总
修正sheet_name = Sheet2,合并数据

def merge_excel(folder_paths, output_file): #合并数据
    # 创建一个空的 DataFrame 用于存储合并后的数据
    merged_data = pd.DataFrame()

    # 遍历每个Excel
    for excel_files in os.listdir(folder_paths):
        # # 遍历每个 Excel 文件并处理
        file_path = os.path.join(folder_paths, excel_files)
        # 打开 Excel 文件
        df = pd.read_excel(file_path,sheet_name='Sheet2')
        # 添加文件名作为新列
        file_name = os.path.splitext(excel_files)[0]
        df.insert(0,'时间',file_name)
        # 将数据添加到 merged_data 中
        merged_data = pd.concat([merged_data, df], ignore_index=True)
    merged_data.to_excel(output_file,index=False)

四、案例总结

总体,分为两步骤,一是结构化遍历保存,二是汇总。整理的代码放在末尾了!!!

import pandas as pd
import os
from openpyxl import load_workbook, Workbook
import openpyxl

# def change(): #xls转化为xlsx

def ycl1(): #结构化数据sheet1
    # 设置文件夹路径
    folder_pathss = r"C:\Users\Desktop\A\B"
    folder_paths = [os.path.join(folder_pathss, file) for file in os.listdir(folder_pathss)]

    for folder_path in folder_paths:
        # 创建一个新的工作簿用于合并数据
        merged_workbook = Workbook()  # Create a new workbook

        # 遍历文件夹中的所有文件
        for filename in os.listdir(folder_path):
            if filename.endswith(".xlsx"):  # 只处理Excel文件
                file_path = os.path.join(folder_path, filename)
                # 1.加载数据
                work_book = load_workbook(filename=file_path, data_only=True) #控制带有公式的单元格是否具有公式(默认值)
                sheet = work_book["Sheet1"]  # 假设所有文件的工作表名称相同

                # 2. 找出所有的合并单元格的索引信息
                mc_range_list = [str(item) for item in sheet.merged_cells.ranges]

                # 3. 批量取消合并单元格,填充数据
                for mc_range in mc_range_list:
                    # 取得左上角值的坐标
                    top_left, bot_right = mc_range.split(":")  # ["A1", "A12"]
                    top_left_col, top_left_row = sheet[top_left].column, sheet[top_left].row  # (1, 1,)
                    bot_right_col, bot_right_row = sheet[bot_right].column, sheet[bot_right].row  # (1, 12,)
                    # 记下该合并单元格的值
                    cell_value = sheet[top_left].value  
                    # 取消合并单元格
                    sheet.unmerge_cells(mc_range)
                    # 批量给子单元格赋值
                    # 遍历列
                    for col_idx in range(top_left_col, bot_right_col + 1):
                        # 遍历行
                        for row_idx in range(top_left_row + 1, bot_right_row + 1):
                            sheet[f"{chr(col_idx + 64)}{row_idx}"] = cell_value
                # 4. 删除前三行和最后一行
                sheet.delete_rows(1, 2)
                sheet.delete_rows(sheet.max_row)

                # 保存更改
                file_paths = file_path[:22] + '\\test\\' + filename
                print(file_paths)
                work_book.save(file_paths)

                #将数据合并到新的工作簿中
                for row in sheet.iter_rows(values_only=True):
                    merged_workbook.active.append(row)

def ycl2(): #结构化sheet2
    # 设置文件夹路径
    folder_pathss = r"C:\Users\Desktop\A\B"
    folder_paths = [os.path.join(folder_pathss, file) for file in os.listdir(folder_pathss)]

    for folder_path in folder_paths:
        # 创建一个新的工作簿用于合并数据
        merged_workbook = Workbook()  # Create a new workbook

        # 遍历文件夹中的所有文件
        for filename in os.listdir(folder_path):
            if filename.endswith(".xlsx"):  # 只处理Excel文件
                file_path = os.path.join(folder_path, filename)
                # 1.加载数据
                work_book = load_workbook(filename=file_path, data_only=True)
                sheet = work_book["Sheet2"]  # 假设所有文件的工作表名称相同

                # 2. 找出所有的合并单元格的索引信息
                mc_range_list = [str(item) for item in sheet.merged_cells.ranges]

                # 3. 批量取消合并单元格,填充数据
                for mc_range in mc_range_list:
                    # 取得左上角值的坐标
                    top_left, bot_right = mc_range.split(":")  # ["A1", "A12"]
                    top_left_col, top_left_row = sheet[top_left].column, sheet[top_left].row  # (1, 1,)
                    bot_right_col, bot_right_row = sheet[bot_right].column, sheet[bot_right].row  # (1, 12,)
                    # 记下该合并单元格的值
                    cell_value = sheet[top_left].value  
                    # 取消合并单元格
                    sheet.unmerge_cells(mc_range)
                    # 批量给子单元格赋值
                    # 遍历列
                    for col_idx in range(top_left_col, bot_right_col + 1):
                        # 遍历行
                        for row_idx in range(top_left_row + 1, bot_right_row + 1):
                            sheet[f"{chr(col_idx + 64)}{row_idx}"] = cell_value
                # 4. 删除前三行和最后一行
                sheet.delete_rows(1, 3)

                # 保存更改
                file_paths = file_path[:22] + '\\test\\' + filename
                work_book.save(file_paths)

                # 将数据合并到新的工作簿中
                for row in sheet.iter_rows(values_only=True):
                    merged_workbook.active.append(row)


def merge_excel(folder_paths, output_file): #合并数据
    # 创建一个空的 DataFrame 用于存储合并后的数据
    merged_data = pd.DataFrame()

    # 遍历每个Excel
    for excel_files in os.listdir(folder_paths):
        # # 遍历每个 Excel 文件并处理
        file_path = os.path.join(folder_paths, excel_files)
        # 打开 Excel 文件
        df = pd.read_excel(file_path,sheet_name='Sheet1')
        # 添加文件名作为新列
        file_name = os.path.splitext(excel_files)[0]
        df.insert(0,'时间',file_name)
        # 将数据添加到 merged_data 中
        merged_data = pd.concat([merged_data, df], ignore_index=True)
    merged_data.to_excel(output_file,index=False)

def merge_excel_sheets(folder_paths, output_file): #合并数据
    # 创建一个空的 DataFrame 用于存储合并后的数据
    merged_data = pd.DataFrame()

    # 遍历每个Excel
    for excel_files in os.listdir(folder_paths):
        # # 遍历每个 Excel 文件并处理
        file_path = os.path.join(folder_paths, excel_files)
        df = pd.read_excel(file_path,sheet_name='Sheet2')
        # 添加文件名作为新列
        file_name = os.path.splitext(excel_files)[0]
        df.insert(0,'时间',file_name)
        # 将数据添加到 merged_data 中
        merged_data = pd.concat([merged_data, df], ignore_index=True)
    merged_data.to_excel(output_file,index=False)

def main1():
    # 输入多个文件夹的路径和输出文件的路径
    # folder_pathss = [r"C:\Users\Desktop\A\B\1月数据", r"C:\Users\Desktop\A\B\2月数据"]  # 修改为实际的文件夹路径
    ycl1()
    folder_paths = r"C:\Users\Desktop\A\test"
    output_file = r"C:\Users\Desktop\A\XXX1.xlsx"  # 输出文件路径
    # 调用函数进行合并
    merge_excel(folder_paths, output_file)

def main2():
    ycl2()
    folder_paths = r"C:\Users\Desktop\A\test"
    output_file = r"C:\Users\Desktop\A\XXX2.xlsx"  # 输出文件路径
    # 调用函数进行合并
    merge_excel_sheets(folder_paths, output_file)

if __name__ == '__main__':
	main1()

if __name__ == '__main__':
    main2()
  • 5
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值