工作表拆分,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,文件内容如图所示。

专栏
深度讲解Python办公自动化
作者:Python办公自动化
59币
4人已购
查看

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中先通过部门排序,然后逐行判断。

(0)

相关推荐