工作表拆分,VBA用了30行,Python只有8行
工作中,很多小伙伴都会遇到一些需求,将一份Excel文档按照部门进行拆分,每个部门是一个单独的工作表。读者需要注意的是,多个工作表的拆分,始终在一个工作簿内操作。让我们一起通过Python来实现。
本例目标:根据指定的Excel文件按照部门拆分成多个工作表。
最终效果:按照部门生成工作表。
技术点:groupby()方法的使用,Excel的追加模式等。
代码编写方式:采用函数、面向过程方式编写。
接下来我们一起进行代码编写,通过3步搞定这个程序。
(1)按照部门进行分组DataFrame。
我们直接使用groupby()方法对部门列做分组,分组后的数据包含部门名称和分部门的DataFrame,避免了之前章节中的循环获取数据的办法。
groupby()方法使用如下所示。
#数据按部门划分为DataFrame.
grouped = df.groupby('department')
print(grouped.get_group('技术部'))
for name,group in df.groupby('department'):
print(name,group)
代码执行结果后,name值为人事部、技术部等,group为人事部、技术部对应的DataFrame。请读者自行测试验证。
(2)工作表的拆分。
通过下段代码演示工作表的拆分,源代码见example_split.py。
import pandas as pd
import os
curpath = os.path.dirname(__file__)
filename = os.path.join(curpath, 'example_merge.xlsx')
savefilename = os.path.join(curpath, 'example_merge_1.xlsx')
df=pd.read_excel(filename)
writer = pd.ExcelWriter(savefilename,engine='openpyxl', mode='a')
for name,group in df.groupby('department'):
group.to_excel(writer,name)
writer.save()
代码执行后生成example_merge_1.xlsx,文件内容如图所示。
VBA的实现
首先将工作表按照部门列进行排序,然后每一行判断是否是同一部门,如果不是同一部门则进行标题和内容的copy操作。源代码见example_split_vba.xlsm。
Option Explicit
Sub 拆分工作表()
Application.DisplayAlerts = False '不显示错误信息
Application.ScreenUpdating = False '不闪屏
Dim i As Integer
Dim sh As Worksheet
'删除汇总表之外的工作表
If Sheets.Count > 1 Then
For i = Worksheets.Count To 2 Step -1
Worksheets(i).Delete
Next i
End If
'对表中数据按照部门排序,然后按照部门拆分进新的工作表
Dim row As Integer
Dim n As Integer
row = Range('A' & Rows.Count).End(xlUp).row '计算一共需要处理的行号
If row > 1 Then
Range('a2:p' & row).Sort Range('m2'), xlAscending '对数据区域进行排序,不含标题
n = 2
For i = 2 To row
With Worksheets('汇总表') '指定活动工作表
If .Range('m' & i).Value <> .Range('m' & i 1).Value Then '判断是否为同一部门
Worksheets.Add after:=Worksheets(Sheets.Count) '新建工作表
Set sh = Worksheets(Worksheets.Count) '指定工作表给变量
sh.Name = .Range('m' & i).Value '以部门命名工作表
.Range('a1:p1').Copy sh.Range('a1:p1') '复制标题到新建工作表中
.Range('a' & n & ':p' & i).Copy sh.Range('a2') '复制内容到工作表中
sh.Columns.AutoFit '设置自动列宽
n = i 1
End If
End With
Next i
End If
Application.ScreenUpdating = True '恢复闪屏默认设置
Application.DisplayAlerts = True '恢复提示框默认设置
End Sub
代码执行结果如图所示,请读者自行测试验证。
两者对比,之所以Python代码少,是因为自身提供了强大的分组功能。
VBA中先通过部门排序,然后逐行判断。