背景:
公司运营部门需要将系统导出的数据(所有门店数据都在一个Sheet里)按门店(机构代码或机构名称)拆分到不同的Workbook(工作簿)文件里发给每个门店。
思路:
之前写过合并不同Workbook(工作簿)到一个Sheet(工作表)里,用python+pandas或python+xlwings,前者更好用,这次拆分就是它的逆向过程,所以在之前的基础上修改就好了。
先创建两个空文件夹一个存需拆分的源文件,一个存拆分好的结果文件,用pandas读取源文件,根据条件筛选出符合条件的数据,按门店(机构代码或机构名称)创建结果文件并保存,为方便没有编程知识的人使用,所有要借助pyside2加上操作界面,并打包成exe可执行程序。
代码:
split_excel.py 拆分excel的功能代码
import numpy as np
import pandas as pd
import xlrd
import os
import xlwings as xw
def split_sheet(source_file,result_file,condition):
# 需拆分文件存放的文件夹
root_path = source_file
# 拆分结果文件存放的文件夹
save_path = result_file
#显示所有列
# pd.set_option('display.max_columns', None)
# #显示所有行
# pd.set_option('display.max_rows', None)
# #设置value的显示长度为100,默认为50
# pd.set_option('max_colwidth',100)
cont = os.listdir(root_path)
print(cont)
for i in range(0,len(cont)):
# 获取需拆分文件夹路径
root = root_path
filename = os.path.join(root,cont[i])
print(filename)
df = pd.read_excel(filename,header = 0) # 读取 ,index_col = 0
# 获取拆分依据
df1 = df[condition]
md = list(dict.fromkeys(list(df1)))
# writer = pd.ExcelWriter(save_path)
for x in md :
# 创建保存文件路径
save_file = os.path.join(save_path,str(x)+".xlsx")
writer = pd.ExcelWriter(save_file)
# 筛选
df2 = df[df[condition]==str(x)]
# 写入文件
df2.to_excel(index = False , excel_writer=writer,sheet_name=str(x),startcol=0,startrow=0)
# 保存结果
writer.save()
# writer.close()
# 关闭
writer.close()
easy.ui 用pyside2 的designer设计的操作界面文件
MainWindow 0 0 662 516 MainWindow 240 300 151 81 开始处理 160 60 331 20 160 100 331 20 160 180 141 31 70 50 191 41 源文件夹路径: 60 90 161 31 结果文件夹路径: 530 60 75 23 选择 530 100 75 23 选择 70 160 91 71 筛选条件标题: 0 0 662 23
pyside2_split_excel.py 将功能代码与操作界面关联起来
# # -*- coding: utf-8 -*-
from PySide2.QtWidgets import QApplication, QMessageBox,QFileDialog
from PySide2.QtUiTools import QUiLoader
import split_excel
from time import sleep
from threading import Thread
class Stats:
def __init__(self):
# 从文件中加载UI定义
# 从 UI 定义中动态 创建一个相应的窗口对象
# 注意:里面的控件对象也成为窗口对象的属性了
# 比如 self.ui.button , self.ui.textEdit
self.ui = QUiLoader().load('./easy.ui')
self.filePath = self.ui.pushButton_2.clicked.connect(self.send_signal1)
self.filePath2 = self.ui.pushButton_3.clicked.connect(self.send_signal2)
self.ui.pushButton.clicked.connect(self.satrt_split)
def send_signal1(self):
filePath = QFileDialog.getExistingDirectory(self.ui, "选择【源文件】存储路径")
self.ui.lineEdit.setText(filePath)
def send_signal2(self):
filePath2 = QFileDialog.getExistingDirectory(self.ui, "选择【结果文件】存储路径")
self.ui.lineEdit_2.setText(filePath2)
def satrt_split(self):
self.ui.pushButton.setEnabled(False)
def workerThreadFunc():
source_file = self.ui.lineEdit.text()
result_file = self.ui.lineEdit_2.text()
condition = self.ui.lineEdit_3.text()
split_excel.split_sheet(source_file,result_file,condition)
self.ui.pushButton.setEnabled(True)
worker = Thread(target=workerThreadFunc)
worker.start()
app = QApplication([])
stats = Stats()
stats.ui.show()
app.exec_()
拆分excel演示视频
打包好的程序已上传CSDN:
https://download.csdn.net/download/CSDN1120628290/84109186https://download.csdn.net/download/CSDN1120628290/84109186



