用Python批量拆分Excel文本信息只需要使用pandas模塊。比如,我們想將Excel文件按照"部門"欄位的不同關鍵詞進行拆分,一個部門拆分到一個Excel文件中。需要拆分的Excel部分數據截圖如下:
import pandas as pddata = pd.read_excel(r"C:\Users\QDM\Desktop\chaifen打折.xlsx")
data_excel = []
sheetname = []
for x in data.groupby("部門"): data_excel.append(x[1]) sheetname.append(x[0])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\" 最後面的斜槓去掉或者隨便新增一些字符即可。
import pandas as pdfilepath = r"C:\Users\QDM\Desktop\待拆分.xlsx"df = pd.read_excel(filepath)class_list = list(df["省份"].unique())class_listfor i in class_list: df_cut = df[df["省份"]==i] df_cut.to_excel(r"C:\Users\QDM\Desktop\%s.xlsx"%(i),encoding = "utf-8", index = False)運行結果:
假如在某一個Excel工作簿中,有一張叫「總表」的工作表,我們想以某一列的欄位屬性,將該表拆分成若干張只包含某一相同類別的分表,這時,我們可用下面的VBA代碼來玩一下:
註:同一種類別要連續在一起(可以先排一個序)
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 = FalseFor Each sw In WorksheetsIf sw.Name <> "總表" Then sw.DeleteNextanswer = InputBox("請輸入標題所佔行數,拆分列列標,數據區域最後一列的列標,中間用英文逗號隔開,如:2,a,e")arr = VBA.split(answer, ",")t1 = arr(0) * 1t2 = 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)) = ""Nextarr2 = dic.keysFor 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.ActivateNextMsgBox "已經拆分完畢"Application.DisplayAlerts = TrueEnd Sub拆分前:
拆分後:
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 = FalseFor Each sw In WorksheetsIf sw.Name <> "總表" Then sw.DeleteNext
'1、確定標題區域和拆分列的列標answer = InputBox("請輸入標題所佔行數,拆分列列標,數據區域最後一列的列標,中間用英文逗號隔開,如:2,a,e")arr = VBA.split(answer, ",")t1 = arr(0) * 1t2 = 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.keysFor 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.ActivateNext
'提示拆分完成MsgBox "已經拆分完畢"Application.DisplayAlerts = True
End Sub使用此代碼注意事項:
1. 打開需要拆分的工作簿的VBE窗口,
2. 新建一個模塊,把上面的代碼複製進去,
3. 需要拆分的工作表名稱改為總表,
4. 對需要拆分的數據按照拆分列進行排序,升序降序無所謂,
5. 運行代碼,
6. 在彈出的窗口中按要求輸入
當然第四步排序用代碼也可以完成,或者不用排序,把需要複製的數據直接寫入到數組裡也可以,以上純屬個人習慣。
註:VBA代碼參考並修改自網絡(最後一段代碼貌似是來自公眾號"米宏office"),Python代碼則是自己所寫。