用Python按条件拆分Excel或CSV等文件
数据和办公小能手
2021年10月25日 11:56
收录于文集
共39篇

    Python进行批量拆分Excel文件处理操作仅需要使用Pandas模块。需要拆分的Excel文件截图示例如下:

我们想将Excel文件按照部门字段进行拆分,一个部门一个Excel文件。

代码:

代码块
Python
自动换行
复制代码

#导入需要使用的模块
import pandas as pd
#导入Excel数据
data = pd.read_excel(r"C:\Users\QDM\Desktop\chaifen\打折.xlsx")

#创建一个用于存储多个sheet数据的空集
data_excel = []

#创建一个用于存储需要导出sheet名称的空集
sheetname = []

#创建循环,分别按指定的拆分字段取出数据与sheet名称
#根据部门字段进行分组
for x in data.groupby("部门"): 
    #将拆分的sheet数据存储到data_excle里面    
    data_excel.append(x[1])
#将拆分的sheet名称存储到sheetname里面
    sheetname.append(x[0])
#循环创建多个路径,路径中加入变量工作表名称,并导出Excel数据
for i in range(len(sheetname)): 
    data_excel[i].to_excel(r"C:\Users\QDM\Desktop\拆分\" + str(sheetname[i]) + ".xlsx",index = False)
复制成功

        注:如果报错 EOL while scanning string literal ,那是因为字符串引号没有成对出现,把 r"C:\Users\QDM\Desktop\&#​34; 最后面的斜杠去掉或者随便新增一些字符即可。

另一种Python拆分法:

数据源:

代码块
Python
自动换行
复制代码
import pandas as pd
filepath = r"C:\Users\QDM\Desktop\待拆分.xlsx"
df = pd.read_excel(filepath)
复制成功

1. 预览数据源:

代码块
Python
自动换行
复制代码

df
复制成功

2. 清洗得出去重之后的一个字段列表

代码块
Python
自动换行
复制代码

class_list = list(df["省份"].unique())
class_list
复制成功

3. 循环遍历得出拆分出来的每个字段所对应的新文件

代码块
Python
自动换行
复制代码
for i in class_list:
    df_cut = df[df["省份"]==i]
#     输出到jupyter 中
#     df_cut.to_excel(r".\%s.xlsx"%(i),encoding = "utf-8")
# 输出到桌面
    df_cut.to_excel(r"C:\Users\QDM\Desktop\%s.xlsx"%(i),encoding = "utf-8", index = False)
复制成功

结果:

运行结果:

以下是VBA方法:

        假如在某一个Excel工作簿中,有一张叫“总表”的工作表,我们想以某一列的字段属性,将该表拆分成若干张只包含某一相同类别的分表,这时,我们可用下面的VBA代码来玩一下:

注:同一种类别要连续在一起(可以先排一个序)

代码块
Python
自动换行
复制代码
Sub split1()
Dim sw As Worksheet, answer, arr, t1%, t2$, t3$, rng As Range, arr1, dic As Object, i%, arr2, i1%, h1%, h2%
Application.DisplayAlerts = False
For Each sw In Worksheets
If sw.Name <> "总表" Then sw.Delete
Next
answer = InputBox("请输入标题所占行数,拆分列列标,数据区域最后一列的列标,中间用英文逗号隔开,如:2,a,e")
arr = VBA.split(answer, ",")
t1 = arr(0) * 1
t2 = arr(1)
t3 = arr(2)
Set rng = Range("a1", t3 & t1)
arr1 = Range(t2 & (t1 + 1), Cells(Rows.Count, t2).End(3))
Set dic = CreateObject("scripting.dictionary")
For i = 1 To UBound(arr1)
    dic(arr1(i, 1)) = ""
Next
arr2 = dic.keys
For i1 = 0 To dic.Count - 1
    h1 = Range(t2 & ":" & t2).Find(arr2(i1)).Row
    h2 = h1 + Application.CountIf(Range(t2 & ":" & t2), arr2(i1)) - 1
    Set rng1 = Range("a" & h1, t3 & h2)
    Worksheets.Add.Name = arr2(i1)
    rng.Copy ActiveSheet.[a1]
    rng1.Copy ActiveSheet.Range("a" & (t1 + 1))
    Sheet1.Activate
Next
MsgBox "已经拆分完毕"
Application.DisplayAlerts = True
End Sub
复制成功

拆分前:

拆分后:

带有注释的代码如下:

代码块
Python
自动换行
复制代码
Sub split()

'根据需要,声明变量
Dim sw As Worksheet, answer, arr, t1%, t2$, t3$, rng As Range, arr1, dic As Object, i%, arr2, i1%, h1%, h2%

'拆分之前先把工作簿中除了总表以外的表全部删除
Application.DisplayAlerts = False
For Each sw In Worksheets
If sw.Name <> "总表" Then sw.Delete
Next

'1、确定标题区域和拆分列的列标
answer = InputBox("请输入标题所占行数,拆分列列标,数据区域最后一列的列标,中间用英文逗号隔开,如:2,a,e")
arr = VBA.split(answer, ",")
t1 = arr(0) * 1
t2 = arr(1)
t3 = arr(2)

'第一步,确定标题区域,确定拆分标记所处的区域并把其装入数组arr中
Set rng = Range("a1", t3 & t1)
arr1 = Range(t2 & (t1 + 1), Cells(Rows.Count, t2).End(3))

'第二步,新建一个字典,把拆分标记写入字典,比如本例中为部门
Set dic = CreateObject("scripting.dictionary")
For i = 1 To UBound(arr1)
    dic(arr1(i, 1)) = ""
Next

'第三步:拆分并生成新的sheet

'循环出拆分标记
arr2 = dic.keys
For i1 = 0 To dic.Count - 1

    '在总表拆分列查找第一个拆分标记所在的首行和尾行行号
    h1 = Range(t2 & ":" & t2).Find(arr2(i1)).Row
    h2 = h1 + Application.CountIf(Range(t2 & ":" & t2), arr2(i1)) - 1
    
    '确定待复制区域,e列为最后一列,可根据实际情况修改
    Set rng1 = Range("a" & h1, t3 & h2)
    '以arr2(i1)为名新建sheet
    Worksheets.Add.Name = arr2(i1)
    '把标题和要复制的内容复制到新建的表里
    rng.Copy ActiveSheet.[a1]
    rng1.Copy ActiveSheet.Range("a" & (t1 + 1))
    '返回总表
    Sheet1.Activate
Next

'提示拆分完成
MsgBox "已经拆分完毕"
Application.DisplayAlerts = True

End Sub
复制成功

使用此代码注意事项:

1. 打开需要拆分的工作簿的VBE窗口,

2. 新建一个模块,把上面的代码复制进去,

3. 需要拆分的工作表名称改为总表,

4. 对需要拆分的数据按照拆分列进行排序,升序降序无所谓,

5. 运行代码,

6. 在弹出的窗口中按要求输入

当然第四步排序用代码也可以完成,或者不用排序,把需要复制的数据直接写入到数组里也可以,以上纯属个人习惯。

注:VBA代码参考并修改自网络,Python代码则是自己所写。