使用Python第三方库xlwings将单个excel工作表快速拆分为多个工作表(附打包好的exe文件)
资源链接
CSDN:https://download.csdn.net/download/qq_55292642/21947229
百度网盘链接:https://pan.baidu.com/s/1ppHsTmHQPViKhnDEwYxwqA
提取码:wzxy
问题背景
使用Excel处理整理数据时,有时需要将一个工作表按某个字段拆分成多个工作表。总表呢处理数据方便,一起就处理了,但展示效果就没有分表好。分表展示效果好,但如果每个表数据量不一致处理起来就很麻烦(如果一致可以使用Excel的工作组,批量操作多个分表),哪有没有什么办法能将总表快速的拆分为分表呢?
上百度搜索多半是使用数据透视表,虽然也能达到效果,但使用数据透视表对后续处理数据不是很方便。
之前一直使用的是筛选+CV大法(复制粘贴),这样效率太慢,处理少量的分表需求可以,但分表多了之后,就很麻烦了。所以之前有一段时间直接使用的是总表,就不想用分表了。
后面发现python可以完美解决这个问题,本文参考了一些其他博主的文章,同时做了一些改进,因为有时Python环境不是很好搭建,或者在其他电脑上临时使用,所以我最后使用pyinstaller将python源代码打包成exe可执行文件,可在没有python的电脑上使用(就是文件大小有些大)。
具体案例
现有下面这种分表
想把它按班级拆成4个分表,如下图
python源代码及环境
本代码参考了下面这篇文章,但对原作者的代码进行了改进,具体python环境见文件environment.yml(但这个环境后面装了一些其他的库,不是所有都是必要的,仅作参考)
参考了博主“hhl931181316”的文章:Python按条件将一个工作表拆分为多个工作表
# Excel拆分.py
'''
使用Python第三方库xlwings按条件将单个excel工作表拆分为多个工作表
具体运行环境见文件environment.yml(但这个环境后面装了一些其他的库,不是所有都是必要的,仅作参考)
'''
import os
import xlwings as xw
import pandas as pd # 引用相关的库
folder = os.getcwd() # 获取当前目录
files = os.listdir(folder) # 获取当前目录所有文件夹
files_xlsx = []
for file in files:
fname,ext = os.path.splitext(file)
if ext in [".xlsx"] and fname[: 2] != "~$":
files_xlsx.append(file) # 筛选出xlsx文件并过滤xlsx隐藏文件
print("已找到如下Excel文件")
for i in files_xlsx:
print(i,end="\n")
print("按任意键继续:")
input()
for xlsx in files_xlsx:
print(f"即将拆分文件:\n{xlsx}\n")
field_name = input("按什么拆分?")
app = xw.App(visible=True, add_book=False)
workbook = app.books.open(xlsx)
worksheet = workbook.sheets[0]
sheet_names = [j.name for j in workbook.sheets]
value = worksheet.range('A1').options(pd.DataFrame,header = 1,
index = False, expand = 'table').value # 读取要拆分的工作表中的所有数据
data = value.groupby(field_name)
for idx, group in data:
if idx not in sheet_names:
new_worksheet = workbook.sheets.add(idx)
new_worksheet.range('A1').options(index = False).value = group
workbook.sheets[idx].range('A1').options(index = False).value = group
workbook.save()
workbook.close()
app.quit()
print(f"\n{xlsx}||拆分完成.")
print("全部拆分完成")
input("按任意键退出")
environment.yml
name: excel
channels:
- https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/
- defaults
dependencies:
- argcomplete=1.12.3=pyhd3eb1b0_0
- backcall=0.2.0=pyhd3eb1b0_0
- ca-certificates=2021.7.5=haa95532_1
- certifi=2021.5.30=py37haa95532_0
- colorama=0.4.4=pyhd3eb1b0_0
- debugpy=1.4.1=py37hd77b12b_0
- decorator=5.0.9=pyhd3eb1b0_0
- importlib_metadata=3.10.0=hd3eb1b0_0
- ipykernel=6.2.0=py37haa95532_1
- ipython=7.26.0=py37hd4e2768_0
- ipython_genutils=0.2.0=pyhd3eb1b0_1
- jedi=0.18.0=py37haa95532_1
- jupyter_client=6.1.12=pyhd3eb1b0_0
- jupyter_core=4.7.1=py37haa95532_0
- matplotlib-inline=0.1.2=pyhd3eb1b0_2
- openssl=1.1.1k=h2bbff1b_0
- parso=0.8.2=pyhd3eb1b0_0
- pickleshare=0.7.5=pyhd3eb1b0_1003
- pip=21.2.2=py37haa95532_0
- prompt-toolkit=3.0.17=pyh06a4308_0
- pygments=2.10.0=pyhd3eb1b0_0
- python=3.7.4=h5263a28_0
- python-dateutil=2.8.2=pyhd3eb1b0_0
- pyzmq=22.2.1=py37hd77b12b_1
- setuptools=52.0.0=py37haa95532_0
- six=1.16.0=pyhd3eb1b0_0
- sqlite=3.36.0=h2bbff1b_0
- tornado=6.1=py37h2bbff1b_0
- traitlets=5.0.5=pyhd3eb1b0_0
- typing_extensions=3.10.0.0=pyh06a4308_0
- vc=14.2=h21ff451_1
- vs2015_runtime=14.27.29016=h5e58377_2
- wcwidth=0.2.5=py_0
- wheel=0.37.0=pyhd3eb1b0_0
- wincertstore=0.2=py37_0
- zipp=3.5.0=pyhd3eb1b0_0
- pip:
- altgraph==0.17
- et-xmlfile==1.1.0
- future==0.18.2
- importlib-metadata==4.6.4
- numpy==1.21.2
- openpyxl==3.0.7
- pandas==1.3.2
- pefile==2021.5.24
- pyinstall==0.1.4
- pyinstaller==4.5.1
- pyinstaller-hooks-contrib==2021.2
- pytz==2021.1
- pywin32==301
- pywin32-ctypes==0.2.0
- xlsxwriter==3.0.1
- xlwings==0.24.7
prefix: D:\InPrg\ProPrg\Prging\Anaconda3\envs\excel
使用方法
以使用exe可执行文件为例:
1.先新建一个文件夹,将要拆分的Excel表复制到这个文件夹:
然后将python源代码或者exe文件也复制到这个文件夹:
3.运行程序
4.根据程序提示完成操作
6.完成效果
待改进的地方
程序能完成上述操作,但有些细节还不完善,后续会对其进行完善。
主要有以下不足:
- 添加的工作表在前面,不符合习惯
- 添加的工作表没有设置格式,还需手动调整
后续
- 增加拆分为多个工作簿的功能
- 增加合并功能
资源链接
CSDN:https://download.csdn.net/download/qq_55292642/21947229
百度网盘链接:https://pan.baidu.com/s/1ppHsTmHQPViKhnDEwYxwqA
提取码:wzxy