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

目录

    • 一、如遇合并表格,注意结构化
    • 二、确认主键,合并所有文件数据
    • 三、sheet2同理
    • 四、案例总结

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

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

首先在汇总以前,保证第一列表,合并列结构化为基本单元格。
(一)定义函数,遍历文件
定义函数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]

                # 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)

在这里插入图片描述
我这保存在"~/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()

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/659310.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

汇编原理(四)[BX]和loop指令

loop:循环 误区:在编译器里写代码和在debug里写代码是不一样的,此时,对于编译器来说,就需要用到[bx] [bx]: [bx]同样表示一个内存单元,他的偏移地址在bx中,比如下面的指令 move bx, 0 move ax,…

IAR9.30安装和注册相关

下载解压licpatcher64工具,把licpatcher64.exe拷贝到IAR的安装目录中双击运行。 示例IAR9.30.1默认安装如下如下,一共三个分别拷贝运行,不要遗漏。 C:\Program Files\IAR Systems\Embedded Workbench 9.1\arm\bin C:\Program Files\IAR Syst…

一书读懂Python全栈安全,剑指网络空间安全

写在前面 通过阅读《Python全栈安全/网络空间安全丛书》,您将能够全面而深入地理解Python全栈安全的广阔领域,从基础概念到高级应用无一遗漏。本书不仅详细解析了Python在网络安全、后端开发、数据分析及自动化等全栈领域的安全实践,还紧密贴…

系统与软件工程软件测试过程

系统与软件工程 软件测试 测试过程 ;对应的国标是GB/T 38634.4 2020 ,该标准的范围规定适应用于治理、管理和实施任何组织,项目或较小规模测试活动的软件测试的测试过程,定义了软件测试通用过程,给出了描述过程的支持信息图表。 一 术语和定义 1.1实测…

力扣hot100:23. 合并 K 个升序链表

23. 合并 K 个升序链表 这题非常容易想到归并排序的思路,俩升序序列合并,可以使用归并的方法。 不过这里显然是一个多路归并排序;包含多个子数组的归并算法,这可以让我们拓展归并算法的思路。 假设n是序列个数,ni是…

这么多不同接口的固态硬盘,你选对了嘛!

固态硬盘大家都不陌生,玩游戏、办公存储都会用到。如果自己想要给电脑或笔记本升级下存储,想要存储更多的文件,该怎么选购不同类型的SSD固态盘呐,下面就来认识下日常使用中常见的固态硬盘。 固态硬盘(Solid State Drive, SSD)作为数据存储技术的革新力量,其接口类型的选…

5.25.6 深度学习在放射图像中检测和分类乳腺癌病变

计算机辅助诊断 (CAD) 系统使用数字化乳房 X 线摄影图像并识别乳房中存在的异常情况。深度学习方法从有限数量的专家注释数据中学习图像特征并预测必要的对象。卷积神经网络(CNN)在图像检测、识别和分类等各种图像分析任务中的性能近年来表现出色。本文提…

VSCode连接远程服务器使用jupyter报错问题解决

目录 一. 问题描述二. jupyter环境确认三. 插件安装 一. 问题描述 经常会遇到一种问题就是, VSCode连接远程服务器, 上次jupyter notebook 还用的好好的, 下次打开就显示找不到内核了. 今天提供了全套解决方案, 帮大家迅速解决环境问题. 二. jupyter环境确认 首先进入自己需…

OPPO Reno12系列发布:用它玩游戏比凉茶还要“凉”

在这个智能手机市场日新月异的时代,每一次新品发布都牵动着无数科技爱好者的心。最近,OPPO官微传来好消息,即将推出的OPPO Reno12系列不仅搭载了顶尖的旗舰芯片,还与联发科天玑强强联手,进行了深度的优化调校&#xff…

【408真题】2009-21

“接”是针对题目进行必要的分析,比较简略; “化”是对题目中所涉及到的知识点进行详细解释; “发”是对此题型的解题套路总结,并结合历年真题或者典型例题进行运用。 涉及到的知识全部来源于王道各科教材(2025版&…

Honor of Kings 2024.03.29 Ban for 3 day

我又被举报消极然后禁赛 都说了别选蔡文姬,对面三个肉,非要选个软辅助 吐槽下这游戏策划:游戏体验感越来越差,公正也很差 对说了对面4个法师,就是不出魔抗,把把都是0-N开局,到底谁消极啊&#x…

apexcharts数据可视化之圆环柱状图

apexcharts数据可视化之圆环柱状图 有完整配套的Python后端代码。 本教程主要会介绍如下图形绘制方式: 基础圆环柱状图多组数据圆环柱状图图片背景自定义角度渐变半个圆环图虚线圆环图 基础圆环图 import ApexChart from react-apexcharts;export function Cir…

基于jeecgboot-vue3的Flowable流程-我的任务(一)

因为这个项目license问题无法开源,更多技术支持与服务请加入我的知识星球。 1、首先可以用现成生成代码的前端来做这个,只要做一些调整就可以了,这样利用现有的一些模板可以快速构建我的任务,否则vue2与vue3相差太大,移…

将文件批量重命名001到100?怎么批量修改文件夹名字?这四款工具不要错过!

你们有没有遇到过需要批量修改文件(文件夹)名的情况?从网上下载一些文件都会带有一些后缀名字。大量的文件,一个一个修改重命名的话,这简直是个头疼的事情。市面上虽然有很多批量文件重命名工具,但要么收费…

memblock_free_all释放page到buddy,前后nr_free的情况

https://www.cnblogs.com/tolimit/p/5287801.html 在zone_sizes_init 之后,各个node,zone的page总数已知。但是此时的每个order的空闲链表是空的,也就是无法通过alloc_page这种接口来分配。此时page还在memblock管控,需要memblock…

IT人的拖延——别让“对失败的担忧”吓跑了“幸福感”

除了完美主义情结外,拖延的另一大重要原因是“对于失败的担忧”,当我们尝试没有把握的事,或者是曾经做这件事失败过,再次需要尝试时,因为对自我有“成功”的期望,自然就会担忧失败的可能性。比如&#xff0…

前端Vue自定义个性化导航栏菜单组件的设计与实现

摘要: 随着前端技术的飞速发展和业务场景的日益复杂,组件化开发已成为提升开发效率和降低维护成本的关键手段。本文将以Vue uni-app平台为例,介绍如何通过自定义导航栏菜单组件,实现业务逻辑与界面展示的解耦,以及如何…

基于 Coze 从 0-1 搭建专属 小白的Bot 机器人

基于 Coze 从 0-1 搭建专属 小白的Bot 机器人 ​ 作为一个GIS从业人员,对于AI的使用是必不可少的,在过去的一两年里各种大模型频出,AI技术已经成为GIS领域的一项重要工具,为我们提供了许多强大的功能和解决方案。看到好文章都在介…

在PyCharm中,不希望新建Python文件自动打开Python控制台

很久没更新水一下 第一步编辑配置 第二步编辑配置模板 第三步取消勾选 第四步确定

【贪心算法题记录】376. 摆动序列

题目链接 题目描述 如果连续数字之间的差严格地在正数和负数之间交替,则数字序列称为 摆动序列 。第一个差(如果存在的话)可能是正数或负数。仅有一个元素或者含两个不等元素的序列也视作摆动序列。 例如, [1, 7, 4, 9, 2, 5] …