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

news2024/11/15 18:45:55

目录

    • 一、如遇合并表格,注意结构化
    • 二、确认主键,合并所有文件数据
    • 三、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()

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Python 机器学习 基础 之 算法链与管道 【算法链与管道/预处理进行参数选择/构建管道/在网格搜索中使用管道】的简单说明

Python 机器学习 基础 之 算法链与管道 【算法链与管道/预处理进行参数选择/构建管道/在网格搜索中使用管道】的简单说明 目录 Python 机器学习 基础 之 算法链与管道 【算法链与管道/预处理进行参数选择/构建管道/在网格搜索中使用管道】的简单说明 一、简单介绍 二、算法链…

「异步魔法:Python数据库交互的革命」(一)

Hi,我是阿佑,今天将和大家一块打开异步魔法的大门,进入Python异步编程的神秘领域,学习如何同时施展多个咒语而不需等待。了解asyncio的魔力,掌握Async SQLAlchemy和Tortoise-ORM的秘密,让你的数据库操作快如…

2024广东省赛 G.Menji 和 gcd

题目 #include <bits/stdc.h> using namespace std; #define int long long #define pb push_back #define fi first #define se second #define lson p << 1 #define rson p << 1 | 1 #define ll long long const int maxn 1e6 5, inf 1e12, maxm 4e4 …

脑机接口:是现代医学的外挂,更是瘫痪病人的豪赌

5 月 17 日&#xff0c;马斯克公开表示&#xff0c;继今年年初首次成功将大脑芯片植入患者大脑后&#xff0c;Neuralink 正在寻找第二位受试者接受这项手术。 5 月 20 日&#xff0c;美国食品药品监督管理局 (FDA) 批准了马斯克的 Neuralink 公司为第二位患者植入脑芯片&#…

超详细介绍基于微调 Faster R-CNN实现海上航拍图像中检测小物体-含源码与数据集免费下载

在航拍图像中检测小物体,尤其是对于海上救援等关键应用而言,是一项独特的挑战。及时检测水中的人可能意味着生死之间的差别。我们的研究重点是微调 Faster R-CNN(一种强大的两阶段物体检测器),以满足这一重要需求。 我们研究的核心是SeaDroneSee 数据集,这是一组重要的图…

Springboot项目搭建 jdk1.8

1.idea创建项目 2.项目配置 maven 编辑项目编码 删除无用文件 修改配置文件后缀&#xff0c;设置数据库 spring:datasource:driver-class-name: com.mysql.cj.jdbc.Driverurl:jdbc:mysql://localhost:3306/honey2024?useSSLfalse&useUnicodetrue&characterEncodingUT…

随手记:多行文本域存数据有换行,回显数据换行展示

1.在新增的时候存储数据 <el-input type"textarea"v-model"XXXX"></el-input> 2.详情页返回的数据&#xff1a; replace一顿操作确实复杂 最快的方法直接写个样式:style"white-space: pre-line" 即可行内或者class样式都可以 …

windows 下载redis (通过redis-server.exe启动服务)

下载链接&#xff1a; https://github.com/MicrosoftArchive/redis/releases 启动&#xff1a; 查看&#xff1a; 人工智能学习网站 https://chat.xutongbao.top

在项目中集成Web端数据库操作:推荐工具一览

在项目中集成Web端数据库操作&#xff1a;推荐工具一览 博主猫头虎的技术世界 &#x1f31f; 欢迎来到猫头虎的博客 — 探索技术的无限可能&#xff01; 专栏链接&#xff1a; &#x1f517; 精选专栏&#xff1a; 《面试题大全》 — 面试准备的宝典&#xff01;《IDEA开发秘籍…

Excel快速判断大量身份证性别,VBS代码

身份证判断性别的原理就是,身份证倒数第二位是单数表示是男的,单数是女的 可以用IF公式来判断,但是需要下拉,如果几百上千条数据还好,要是上万就不好拉取了,如果数据太多,可以用VBA代码判断 IF(MOD(VALUE(MID(A1,17,1)),2)0,"女","男") 原理:MID(A1,17,1…

【408真题】2009-24

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

TokenInsight: Covalent SDK、网络及数据可用性解决方案评估报告

摘要 Covalent 是一个区块链长期数据可用性解决方案&#xff0c;提供结构化的链上数据 API&#xff0c;允许开发者访问超过 225 个区块链的全面结构化链上数据。TokenInsight 根据标准化评级方法&#xff0c;从六个维度对 Covalent 进行了评估。 技术和安全 Covalent 自 201…

【学习Day1】计算机基础

✍&#x1f3fb;记录学习过程中的输出&#xff0c;坚持每天学习一点点~ ❤️希望能给大家提供帮助~欢迎点赞&#x1f44d;&#x1f3fb;收藏⭐评论✍&#x1f3fb;指点&#x1f64f; 1.1 中央处理单元CPU 中央处理器&#xff08;CPU&#xff0c;central processing unit&…

著名开源软件Greenplum突然关闭GitHub源码,数据仓库选型带来新变数

今天一早看见新闻&#xff0c;著名的开源数据仓库Greenplum不能访问了&#xff0c;非常吃惊&#xff0c;因为小编昨天晚上还可以从github下载编译Greenplum7.1的源码。早上登录到Greenplum的github主页&#xff0c;已经是"人去楼空"的404了。 目前Greenplum官网和Twi…

Ant Design 动态增减form表单,第二三项根据第一项选中内容动态展示内容

效果图&#xff1a; 选中第一项下拉框&#xff0c;第二第三项展示 点击添加条件&#xff0c;第二条仍然只展示第一项select框 后端返回数据格式&#xff1a; ruleList:[{name:通话时长,key:TALK_TIME,type&#xff1a;’INT‘,unitName:秒,operaObj:[{name:>,value:>…

多输入多输出 | MATLAB实现BiTCN(双向时间卷积神经网络)多输入多输出预测

多输入多输出 | MATLAB实现BiTCN(双向时间卷积神经网络)多输入多输出预测 目录 多输入多输出 | MATLAB实现BiTCN(双向时间卷积神经网络)多输入多输出预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 Matlab实现BiTCN双向时间卷积神经网络多输入多输出预测 1.data为数据…

HNU-计算机体系结构-实验1-RISC-V流水线

计算机体系结构 实验1 计科210X 甘晴void 202108010XXX 1 实验目的 参考提供为了更好的理解RISC-V&#xff0c;通过学习RV32I Core的设计图&#xff0c;理解每条指令的数据流和控制信号&#xff0c;为之后指令流水线及乱序发射实验打下基础。 参考资料&#xff1a; RISC-…

13种即插即用涨点模块分享!含注意力机制、卷积变体、Transformer变体

朋友们&#xff0c;你们想发paper的时候有没有被创新点、改模型、改代码折磨过&#xff1f;今天我想分享一个前期又快又省事的方法&#x1f606; 就是用即插即用的模块“缝合”&#xff0c;加入自己的想法快速搭积木炼丹。 这种方法可以简化模型设计&#xff0c;减少冗余工作…

MySQL 数据表的基本操作

文章目录 【 1. MySQL 创建数据表 】【 2. MySQL 查看表 】2.1 DESCRIBE/DESC 以表格的形式展示表2.2 SHOW CREATE TABLE 以SQL语句的形式展示表 【 3. 修改数据表 】3.1 修改表名3.2 修改表字符集3.3 添加字段在末尾添加字段在开头添加字段在中间添加字段 3.3 修改/删除字段修…

【java-数据结构19-队列的模拟实现】

上篇文章&#xff0c;小编已经带大家一起认识了队列&#xff0c;并且对队列的方法进行调用测试&#xff0c;下面我们将模拟实现一个队列&#xff0c;话不多说&#xff0c;上正文~ 1.队列的模拟实现 队列的实现方法和链表的实现方式一模一样&#xff0c;这里我们首选双链表&…