吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 711|回复: 10
收起左侧

[Python 原创] excel拆分工具(按照所属辖区进行拆分)

  [复制链接]
xiaozeze 发表于 2026-1-9 11:52
本帖最后由 苏紫方璇 于 2026-1-13 11:22 编辑

日常工作中,经常需要把上级单位下发的汇总excel文件按照所属辖区进行拆分,汇总excel中有多个sheet页,拆分完后按照辖区名称生成单独的excel文件且每个sheet页的数据都是本辖区的数据,然后发给对应辖区的负责人。

ps:测试了下拆分10万多条的数据大约需要三四分钟,数据量少的几秒钟就完事,工具是扫描所属辖区列进行拆分。

(大家勿喷哈)


工具截图:


功能介绍:可以将一个汇总的excel文件按照属辖区进行拆分

使用说明:
1、有一个汇总表,有三个sheet页


2、拆分完后形成三个所属辖区的单独excel文件



3、每个单独的excel都有三个sheet页,并且数据都是本辖区的



4、关键代码:

[Python] 纯文本查看 复制代码
import sys
import os
import pandas as pd
from pathlib import Path
from PyQt5.QtWidgets import *
from PyQt5.QtCore import Qt, QThread, pyqtSignal
from PyQt5.QtGui import QFont
import traceback


class ExcelSplitterWorker(QThread):
    [i]"""[/i][i]工作线程,用于处理[/i][i]Excel[/i][i]拆分任务[/i][i]"""
[/i][i]    [/i]progress_signal = pyqtSignal(str)
    finished_signal = pyqtSignal(str)
    error_signal = pyqtSignal(str)

    def __init__(self, input_file, output_dir, folder_name="", suffix=""):
        super().__init__()
        self.input_file = input_file
        self.output_dir = output_dir
        self.folder_name = folder_name.strip()
        self.suffix = suffix.strip()
        self.running = True

    def run(self):
        try:
            if not os.path.exists(self.input_file):
                self.error_signal.emit(f"文件不存在: {self.input_file}")
                return

            # 读取所有sheet
            self.progress_signal.emit("正在读取Excel文件...")
            xl = pd.ExcelFile(self.input_file)
            sheet_names = xl.sheet_names

            # 收集所有地区的映射
            self.progress_signal.emit("正在分析数据并收集所属辖区信息...")
            all_regions = set()

            # 先读取所有sheet,确定所有地区
            sheets_data = {}
            for sheet_name in sheet_names:
                df = xl.parse(sheet_name)
                sheets_data[sheet_name] = df

                # 查找管辖地区列
                region_column = self._find_region_column(df)
                if region_column is not None:
                    regions = df[region_column].dropna().unique()
                    all_regions.update(regions)

            if not all_regions:
                self.error_signal.emit("未找到所属辖区列!")
                return

            # 构建最终输出目录
            if self.folder_name:
                # 如果指定了文件夹名称,在输出目录下创建该文件夹
                final_output_dir = os.path.join(self.output_dir, self.folder_name)
            else:
                # 如果没有指定文件夹名称,直接使用输出目录
                final_output_dir = self.output_dir

            # 创建输出目录
            os.makedirs(final_output_dir, exist_ok=True)

            # 为每个地区创建单独的Excel文件
            total_regions = len(all_regions)
            for i, region in enumerate(all_regions, 1):
                if not self.running:
                    break

                self.progress_signal.emit(f"正在处理地区: {region} ({i}/{total_regions})")

                # 构建文件名(添加后缀)
                if self.suffix:
                    # 确保后缀格式正确
                    if self.suffix.startswith("_"):
                        file_suffix = self.suffix
                    else:
                        file_suffix = f"_{self.suffix}"
                    output_filename = f"{region}{file_suffix}.xlsx"
                else:
                    output_filename = f"{region}.xlsx"

                # 完整输出路径
                output_file = os.path.join(final_output_dir, output_filename)

                with pd.ExcelWriter(output_file, engine='openpyxl') as writer:
                    for sheet_name, df in sheets_data.items():
                        region_column = self._find_region_column(df)
                        if region_column is not None:
                            # 筛选该地区的数据
                            region_data = df[df[region_column] == region]
                            # 写入sheet
                            region_data.to_excel(writer, sheet_name=sheet_name, index=False)

                self.progress_signal.emit(f"✓ 已生成: {output_filename}")

            self.finished_signal.emit(f"拆分完成!共处理了 {total_regions} 个地区。\n输出目录: {final_output_dir}")

        except Exception as e:
            self.error_signal.emit(f"错误: {str(e)}\n{traceback.format_exc()}")

    def _find_region_column(self, df):
        [i]"""[/i][i]查找所属辖区列[/i][i]"""
[/i][i]        [/i]# 可能的列名
        possible_names = ['所属辖区', '管辖地区', '地区', '管辖地', 'region', '管辖']
        for col in df.columns:
            # 检查列名是否包含关键字
            col_str = str(col).strip()
            for name in possible_names:
                if name in col_str:
                    return col
        return None

    def stop(self):
        self.running = False



工具下载地址:https://pan.baidu.com/s/1G532omu7Z3VvgYWgvuHxAg?pwd=ndsu 提取码: ndsu


5.png
6.png
555.png
7.png
软件.png
1.png
2.png
3.png
4.png

免费评分

参与人数 6吾爱币 +11 热心值 +5 收起 理由
苏紫方璇 + 7 + 1 欢迎分析讨论交流,吾爱破解论坛有你更精彩!
yanglinman + 1 谢谢@Thanks!
waynewange + 1 + 1 谢谢@Thanks!
hdjkksj3366 + 1 + 1 谢谢@Thanks!正好需要
naixubao + 1 + 1 非常实用的小工具,收藏了。
wuloveyou + 1 这个特殊小工具值得保存~~~

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

sizhan19861117 发表于 2026-1-9 16:57
我记得wps筛选可以导出 就有这个功能 只不过需要  会员。  你看看是不是。
devSteven 发表于 2026-1-9 17:04
[Visual Basic .NET] 纯文本查看 复制代码
        # 可能的列名
        possible_names = ['所属辖区', '管辖地区', '地区', '管辖地', 'region', '管辖']

如果把这个代码改成让用户选择或者去能够自定义,这个工具灵活性就更好了。
fengyunyao 发表于 2026-1-9 17:35
可以读取表格的列,让用户能自由选择按哪一列拆分,并不一定按地区拆分
jellycici 发表于 2026-1-9 23:38
想法不错,建议拆分依据可以由用户根据表格内容自主选择
jack3255 发表于 2026-1-10 09:23
这个好,便捷了很多,谢谢分享
Lyc88888888 发表于 2026-1-10 09:41
这个工具也是实用的,谢谢分享!
炫迈 发表于 2026-1-10 14:24
你那个所属辖区列名是写死的,实际工作中有些表格列名千奇百怪,有时候叫责任区域,有时候叫归属地,我之前就遇到过表格里用片区名称代替辖区的情况,搞得很头疼,建议加个功能让使用者自己选择哪一列作为拆分依据,这样适用性更广,另外大文件处理时内存占用有点高,我试过拆分20万行的数据,8G内存的电脑差点卡死,最好加个进度条和取消按钮,这样处理大文件时心里有底,最后提醒下用这个工具的兄弟们,拆分完记得检查下数据完整性,特别是那些空值和特殊字符
 楼主| xiaozeze 发表于 2026-1-12 10:49
sizhan19861117 发表于 2026-1-9 16:57
我记得wps筛选可以导出 就有这个功能 只不过需要  会员。  你看看是不是。

是了 wps会员可以筛选后导出,数据量少的话还行手动导出,太多的话一个一个的导出手动太累了, 哈哈
 楼主| xiaozeze 发表于 2026-1-12 10:52
炫迈 发表于 2026-1-10 14:24
你那个所属辖区列名是写死的,实际工作中有些表格列名千奇百怪,有时候叫责任区域,有时候叫归属地,我之前 ...

好的,下一版修改,谢谢老哥,我这8G电脑用wps打开20多万行的数据,电脑直接卡死了 哈哈
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - 52pojie.cn ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2026-1-13 17:27

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表