一、背景
存儲數據為.xlsb類型的文件時,用python讀取為dataframe數據格式時,非常麻煩,目前沒有發現python友好的處理庫。因此通過在excel上用vba對.xlsb文件讀取轉換為.xlsx后,再用python的pandas庫讀取.xlsx文件為dataframe數據格式。另外python也可以同時調用vba宏,然后直接運行,減少了再excel上手動運行操作,解決了跨軟件運行。
二、excel上vba編寫
- 將"D:\vba\data\拉美"路徑下的.xlsb文件轉換為.xlsx文件
Dim sTemp As String Sub conv_chatfields() Application.ScreenUpdating = False Application.DisplayAlerts = False Application.Visible = False '文件需要轉換的路徑:D:\vba\data\拉美 all_path = Array("D:\vba\data\拉美") country_name = Array("拉美") For i = LBound(all_path) To UBound(all_path) For j = LBound(country_name) To UBound(country_name) Path = all_path(i) & country_name(j) & "\" Filename = Dir(Path & "*.xlsb") Do While Filename <> "": If Filename = "" Then Exit Do End If '判斷后綴名分隔符.的位置 sTemp = Filename iPos = Len(sTemp) - VBA.InStr(1, VBA.StrReverse(sTemp), ".") If iPos <> 0 Then sTemp = Mid(sTemp, 1, iPos) Workbooks.Open Filename:=Path & Filename ActiveWorkbook.SaveAs Filename:=Path & sTemp & ".xlsx", FileFormat:=xlOpenXMLWorkbook, CreateBackup:=False ActiveWindow.Close End If Filename = Dir Loop Next Next Application.ScreenUpdating = True End Sub
三、python調用vba運行
- 調用vba程序。需要安裝win32com庫
import win32com.client print('轉換開始'
#####調用vba程序。需要安裝win32com庫 xls = win32com.client.Dispatch("Excel.Application") xls.workbooks.Open(r"D:\李耀瑞\vba\三大渠道自動化腳本\四大渠道運行\demo\文件格式轉換.xlsm") ##存儲vba代碼的文件 try: xls.Application.Run('conv_chatfield.conv_chatfield') ##開始調用vba宏
except Exception as e: print(e) xls.Application.Quit() print('轉換完成!')