Python办公—Excel按某列列拆分—自由选择sheet以及表头(通用版)

专栏导读

在这里插入图片描述

  • 🌸 欢迎来到Python办公自动化专栏—Python处理办公问题,解放您的双手

  • 🏳️‍🌈 博客主页:请点击——> 一晌小贪欢的博客主页求关注

  • 👍 该系列文章专栏:请点击——>Python办公自动化专栏求订阅

  • 🕷 此外还有爬虫专栏:请点击——>Python爬虫基础专栏求订阅

  • 📕 此外还有python基础专栏:请点击——>Python基础学习专栏求订阅

  • 文章作者技术和水平有限,如果文中出现错误,希望大家能指正🙏

  • ❤️ 欢迎各位佬关注! ❤️

1、背景介绍

  • 将Excel数据源进行某一列拆分,如下图,将数据源按照【表头10】这一列,进行拆分

在这里插入图片描述

 <>

2、库的安装

用途安装
openpyxl读写Excel文件pip install openpyxl -i https://pypi.tuna.tsinghua.edu.cn/simple/
pandas读写Excel文件pip install pandas -i https://pypi.tuna.tsinghua.edu.cn/simple/
PyQt5界面设计pip install PyQt5 -i https://pypi.tuna.tsinghua.edu.cn/simple/
os获取绝对路径内置库无需安装

3、核心代码

  • pandas函数:group_by()

df = pd.read_excel(filepath, sheet_name=sheet_name, dtype=str, header=header_row - 1, keep_default_na='')
colname = df.columns[selected_indices[0].row()]
grouped = df.groupby(colname)
  • openpyxl写入

wb = openpyxl.Workbook()
ws = wb.active
ws.append(df.columns.tolist())
for row in group.values.tolist():
	ws.append(row)
save_file = os.path.join(savepath, f"{key}.xlsx")
wb.save(save_file)

4、完整代码

import os
import openpyxl
import pandas as pd
from PyQt5 import QtWidgets
from PyQt5.QtWidgets import QMessageBox, QFileDialog, QVBoxLayout, QLabel, QPushButton, QListWidget, QLineEdit, QComboBox

class SplitterGUI(QtWidgets.QWidget):
    def __init__(self):
        super().__init__()
        self.setWindowTitle("Excel拆分小工具")
        self.setGeometry(500, 500, 600, 400)

        self.setStyleSheet("""
            QWidget {
                font-family: Arial;
                font-size: 14px;
                font-weight: bold;
            }
        """)

        self.layout = QVBoxLayout()

        # 文件路径输入
        self.label1 = QLabel("选择文件:")
        self.layout.addWidget(self.label1)

        self.filepath_entry = QLineEdit(self)
        self.layout.addWidget(self.filepath_entry)

        self.browse_button = QPushButton("浏览", self)
        self.browse_button.clicked.connect(self.browse_files)
        self.layout.addWidget(self.browse_button)

        # 选择Sheet
        self.label_sheet = QLabel("选择Sheet:")
        self.layout.addWidget(self.label_sheet)

        self.sheet_combo = QComboBox(self)
        self.sheet_combo.currentIndexChanged.connect(self.update_columns)  # 选择Sheet时更新列
        self.layout.addWidget(self.sheet_combo)

        # 自定义表头行
        self.label_header_row = QLabel("输入表头行(默认为1):")
        self.layout.addWidget(self.label_header_row)

        self.header_row_entry = QLineEdit(self)
        self.header_row_entry.setPlaceholderText("例如:1")
        self.layout.addWidget(self.header_row_entry)

        # 列表框
        self.label2 = QLabel("表头名称:")
        self.layout.addWidget(self.label2)

        self.cols_listbox = QListWidget(self)
        self.layout.addWidget(self.cols_listbox)

        # 保存路径输入
        self.savepath_entry = QLineEdit(self)
        self.savepath_entry.setPlaceholderText("选择保存路径...")
        self.layout.addWidget(self.savepath_entry)

        self.save_button = QPushButton("选择保存路径", self)
        self.save_button.clicked.connect(self.browse_save_folder)
        self.layout.addWidget(self.save_button)

        self.split_button = QPushButton("开始拆分", self)
        self.split_button.clicked.connect(self.split_files)
        self.layout.addWidget(self.split_button)

        self.setLayout(self.layout)

    def browse_files(self):
        filepath, _ = QFileDialog.getOpenFileName(self, "选择Excel文件", "", "Excel Files (*.xlsx *.xls)")
        if filepath:
            self.filepath_entry.setText(filepath)
            self.load_sheets(filepath)

    def load_sheets(self, filepath):
        wb = openpyxl.load_workbook(filepath, data_only=True)
        self.sheet_combo.clear()
        self.sheet_combo.addItems(wb.sheetnames)

        # 默认选择第一个Sheet
        if self.sheet_combo.count() > 0:
            self.sheet_combo.setCurrentIndex(0)
            self.update_columns()

    def update_columns(self):
        filepath = self.filepath_entry.text()
        sheet_name = self.sheet_combo.currentText()
        header_row = int(self.header_row_entry.text() or 1)
        self.load_columns(filepath, sheet_name, header_row)

    def browse_save_folder(self):
        save_folder = QFileDialog.getExistingDirectory(self, "选择保存文件夹")
        if save_folder:
            self.savepath_entry.setText(save_folder)

    def load_columns(self, filepath, sheet_name, header_row):
        df = pd.read_excel(filepath, sheet_name=sheet_name, header=header_row - 1)
        self.cols_listbox.clear()
        for col in df.columns:
            self.cols_listbox.addItem(col)

    def split_files(self):
        filepath = self.filepath_entry.text()
        savepath = self.savepath_entry.text()
        selected_indices = self.cols_listbox.selectedIndexes()
        header_row = int(self.header_row_entry.text() or 1)

        if not filepath or not selected_indices or not savepath:
            QMessageBox.warning(self, "警告", "请确保已选择文件、表头和保存路径!")
            return

        sheet_name = self.sheet_combo.currentText()
        df = pd.read_excel(filepath, sheet_name=sheet_name, dtype=str, header=header_row - 1, keep_default_na='')
        colname = df.columns[selected_indices[0].row()]
        grouped = df.groupby(colname)

        for key, group in grouped:
            wb = openpyxl.Workbook()
            ws = wb.active
            ws.append(df.columns.tolist())
            for row in group.values.tolist():
                ws.append(row)
            save_file = os.path.join(savepath, f"{key}.xlsx")
            wb.save(save_file)

        QMessageBox.information(self, "成功", "拆分完成!请查看生成的文件。")

# 创建主窗口并运行应用
app = QtWidgets.QApplication([])
window = SplitterGUI()
window.show()
app.exec_()

5、进阶版

  • 优点

  • 1、单个文件 \ 多个文件拆分

  • 2、自由选择表头所在行数

  • 3、自由选择sheet

  • 4、极致的拆分速度(90万)行只要10秒

  • 5、极致的写入速度同上

  • 订阅连接: 欢迎点我订阅专栏

在这里插入图片描述

总结

  • 希望对初学者有帮助

  • 致力于办公自动化的小小程序员一枚

  • 希望能得到大家的【一个免费关注】!感谢

  • 求个 🤞 关注 🤞

  • 此外还有办公自动化专栏,欢迎大家订阅:Python办公自动化专栏

  • 求个 ❤️ 喜欢 ❤️

  • 此外还有爬虫专栏,欢迎大家订阅:Python爬虫基础专栏

  • 求个 👍 收藏 👍

  • 此外还有Python基础专栏,欢迎大家订阅:Python基础学习专栏

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一晌小贪欢

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值
>