項目周報匯報的時候要做數據匯總,總是要從不同的excel文件中去獲取數據最后匯總到一個excel表里面,所以決定用python直接寫個自動化腳本來自動執行。
用python來讀寫excel,目前找了2個方法:win32com.client和openpyxl
- win32com.client可以對excel進行各種操作,可以調用VBA的庫,相當於是模擬用戶對excel進行操作,在執行過程中,你可以看到excel被打開,然后數據被寫入,最后excel文件被關閉等等過程。(文檔也可以參看OFFICE自帶的VBA EXCEL 幫助文件(VBAXL.CHM)。這里面講述了EXCEL VBA的編程概念, 另外,《Python Programming on Win32》書中也有很詳細的介紹。這本書中(第九章)給出了一個類來操作EXCEL 文件,可以很容易的加以擴展。)
- openpyxl是處理excel2007/2010及以后的格式,也就是xlsx系列,如果要處理以前的2003的表格(xls),那么則要用另外的庫(xlrd/xlwt等)。
python雖然並不是特別在意大小寫,但是使用win32com.client一定要注意大小寫,很多函數如果不區分大小寫,是無法調用的,比如打開excel表格的Open函數,’O’必須大寫,還有wb.Save(),‘S’也必須大寫,而我們使用openpyxl使用小寫即可。
openpyxl在保存時用save(),很多原有的格式圖表是無法保留下來的,比如對excel進行修改,里邊原有的透視表,用openpyxl的save()是無法保存的,但是使用win32com.client的wb.Save()卻是可以保存這些圖表的,這也是更加方便的地方。
這里簡單分享項目中用到這2個模版的寫數據方式:
- 首先已經把數據都存到字典中:
dict_data = {'ThinkPad_Users': 448177, 'IdeaPad_Users': 109626, 'Desktop_Users': 50605, 'Install_ThinkPad': 903036, 'Install_IdeaPad': 197467, 'Install_Desktop': 91656, 'ThinkPad_Fail': 8495, 'IdeaPad_Fail': 1970, 'Desktop_Fail': 1592}
- 然后需要做的是把字典中的數據寫入到excel表格中:
使用win32com方法來修改Excel
import win32com.client #使用win32com方法來修改Excel def modify_excel_win32com(dict_data, filename, title): #用於修改Excel的配置 xlApp = win32com.client.Dispatch('Excel.Application') #用xlApp打開用於修改和寫入數據 xlBook = xlApp.Workbooks.Open(filename, ReadOnly = False) sheet = xlBook.Worksheets('WeeklyData' col_size = sheet.UsedRange.columns.Count + 1 #判斷該title是否存在;如存在則覆蓋數據;如不存在則新建數據 print(sheet.UsedRange.Value[0]) if title in sheet.UsedRange.Value[0]: # print(sheet.UsedRange.Value[0].index(title)) col_size = sheet.UsedRange.Value[0].index(title) + 1 else: try: col_size = sheet.UsedRange.Value[0].index(None) + 1 except: pass finally: sheet.Cells(1, col_size).Value = title print(col_size) for key, value in dict_data.items(): if key=='Install_A': sheet.Cells(2, col_size).Value = value elif key=='A_Users': sheet.Cells(3, col_size).Value = value elif key=='A_Fail': sheet.Cells(4, col_size).Value = value sheet.Cells(5, col_size).Value = '%.2f%%' % (value / sheet.Cells(2, col_size).Value * 100) # print(sheet.Cells(5, col_size).Value) elif key=='Install_B': sheet.Cells(6, col_size).Value = value elif key=='B_Users': sheet.Cells(7, col_size).Value = value elif key=='B_Fail': sheet.Cells(8, col_size).Value = value sheet.Cells(9, col_size).Value = '%.2f%%' % (value / sheet.Cells(6, col_size).Value * 100) elif key=='Install_C': sheet.Cells(10, col_size).Value = value elif key=='C_Users': sheet.Cells(11, col_size).Value = value elif key=='C_Fail': sheet.Cells(12, col_size).Value = value sheet.Cells(13, col_size).Value = '%.2f%%' % (value / sheet.Cells(10, col_size).Value * 100) sheet.Cells(14, col_size).Value = '%.2f%%' % ((sheet.Cells(4, col_size).Value + sheet.Cells(8, col_size).Value + value) / (sheet.Cells(2, col_size).Value + sheet.Cells(6, col_size).Value + sheet.Cells(10, col_size).Value) * 100) xlBook.Save() #保存 xlApp.quit() #關閉excel操作環境。
使用openpyxl庫來修改Excel
from openpyxl import worksheet from openpyxl import workbook from openpyxl import load_workbook from openpyxl.utils import get_column_letter #使用openpyxl庫來修改Excel def modify_excel_openpyxl(dict_data, filename, title): wb = load_workbook(filename) #打開一個工作簿 sheet = wb['WeeklyData'] #獲取一張表 col_size = sheet.max_column+1 first_row = [] for i in range(1, col_size): first_row.append(sheet.cell(row=1, column=i).value) print(first_row) #判斷該title是否存在;如存在則覆蓋數據;如不存在則新建數據 if title in first_row: col_size = first_row.index(title) + 1 else: try: col_size = first_row.index(None) + 1 except: pass finally: sheet.cell(row=1, column=col_size, value=title) print(get_column_letter(col_size)) col_letter = get_column_letter(col_size) sheet[col_letter+'2'] = 'testtest' for key, value in dict_data.items(): if key=='Install_A': sheet[col_letter+'2'] = value elif key=='A_Users': sheet[col_letter+'3'] = value elif key=='A_Fail': sheet[col_letter+'4'] = value sheet[col_letter+'5'] = '='+col_letter+'4/'+col_letter+'2' elif key=='Install_B': sheet[col_letter+'6'] = value elif key=='B_Users': sheet[col_letter+'7'] = value elif key=='B_Fail': sheet[col_letter+'8'] = value sheet[col_letter+'9'] = '='+col_letter+'8/'+col_letter+'6' elif key=='Install_C': sheet[col_letter+'10'] = value elif key=='C_Users': sheet[col_letter+'11'] = value elif key=='C_Fail': sheet[col_letter+'12'] = value sheet[col_letter+'13'] = '='+col_letter+'12/'+col_letter+'10' sheet[col_letter+'14'] = '=('+col_letter+'4+'+col_letter+'8+'+col_letter+'12)/('+col_letter+'2+'+col_letter+'6+'+col_letter+'10)' wb.save(filename) wb.close()