本帖最后由 苏紫方璇 于 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
|