专栏导读

-
🌸 欢迎来到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、核心代码
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)
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)
self.label_sheet = QLabel("选择Sheet:")
self.layout.addWidget(self.label_sheet)
self.sheet_combo = QComboBox(self)
self.sheet_combo.currentIndexChanged.connect(self.update_columns)
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)
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、极致的写入速度同上
-

总结
-
希望对初学者有帮助
-
致力于办公自动化的小小程序员一枚
-
希望能得到大家的【一个免费关注】!感谢
-
求个 🤞 关注 🤞
-
-
求个 ❤️ 喜欢 ❤️
-
-
求个 👍 收藏 👍
-