上一篇文章我們實現了通過xlrd,xlwt和xlutils對Excel的讀取和寫入,並進行修改。但是xlrd等模塊還存在一定的問題:僅僅支持對舊格式的.xls文件進行讀寫,而且無法修改原始Excel等等。因此我們這次使用openpyxl和pandas庫來對Excel進行操作。
下面我們首先來看一下如何用openpyxl包來讀寫Excel,首先我們需要導入openpyxl包(如果沒有安裝的話,可以使用pip install openpyxl來安裝)
總體上的讀取方法與xlrd類似,不過API更加簡單明了。讀取Excel之前,我們需要先調用load_workbook方法來加載Excel。通過get_sheet_by_name()方法獲取相應的sheet,或者通過get_active_sheet()方法獲取當前活動的sheet。這裡有一個要注意的地方,就是openpyxl的行列都是從1開始的,不像通常從0開始,因此在讀取單元格的時候要+1,其餘的部分就和xlrd類似了,代碼如下:
import openpyxl
def read_excel(fileName='D:/Book1.xlsx'): wb = openpyxl.load_workbook(fileName) sheet = wb.get_sheet_by_name('Sheet1') nrows = sheet.max_row ncols = sheet.max_column for i in range(nrows): for j in range(ncols): print(sheet.cell(i+1,j+1).value, end=' ') print() read_excel()讀取結果如下圖所示:
計算平均分的方法與前文類似
## 計算個人平均分def get_average(fileName='D://Book1.xlsx'): avg_dict = {} wb = openpyxl.load_workbook(fileName) sheet = wb.get_sheet_by_name('Sheet1') nrows = sheet.max_row ncols = sheet.max_column for row in range(1,nrows): avg = 0.0 for col in range(1,ncols): avg += float(sheet.cell(row+1, col+1).value) ## 計算每一個學生的總分 avg /= (ncols-1) ## 總分除以課程數即是平均分 avg_dict[sheet.cell(row+1, 1).value] = avg ## 每行的第一列是學生姓名,用作字典的鍵,平均分作為值 print(avg_dict) return avg_dict
avg_dict = get_average()這裡,我們先將平均分寫入到一個新建的Excel工作表中,實現與上一篇文章類似的功能。新建Excel需要先通過openpyxl.Workbook()方法來獲取一個新的Excel文檔,通過active屬性得到可訪問的工作表sheet。接下來只要在表格中填入數據即可,需要注意的是序列號是從1開始的。
## 將字典寫入到Excel中def write_excel(value_dict, resultName='D://Book2.xlsx'): wb = openpyxl.Workbook() sheet = wb.active #sheet = wb.create_sheet() ## 先在標題欄加入「姓名」和「平均分」列 sheet.cell(1,1).value = '姓名' sheet.cell(1,2).value = '平均分' ## 遍歷字典,寫入姓名和平均分 row = 2 for key in value_dict.keys(): sheet.cell(row,1).value = key sheet.cell(row,2).value = value_dict[key] row+=1 wb.save(resultName) write_excel(avg_dict)以上做法我們是將結果存入到新建的Excel的,如我們想要直接更新原始的Excel,用xlwt是無法做到的,但是openpyxl可以比較方便的實現此功能。我們在創建一個Excel文檔並獲取到sheet後,在表格的第一行和的最後一列之後添加一個新列,標題是「平均分」,然後遍歷每一行,將每一行的第二列的值(也就是學生姓名)與字典表的鍵進行對應,若與鍵相同,則將值作為平均分,並寫入到這一行的最後一列中。
## 修改原有的Exceldef update_excel(value_dict, fileName='D://Book3.xlsx'): wb = openpyxl.load_workbook(fileName) sheet = wb.get_sheet_by_name('Sheet1') nrows = sheet.max_row ncols = sheet.max_column sheet.cell(1, ncols+1).value = '平均分' ## 在標題欄上添加一列平均分 ## 遍歷每一行,得到學生姓名,根據姓名在字典中查詢到平均分,並寫入到Excel中,實現更新Excel for i in range(1,nrows): for key in value_dict.keys(): name = sheet.cell(i+1,1).value if name==key: sheet.cell(i+1, ncols+1).value = value_dict[key] wb.save(fileName)
update_excel(avg_dict)更新後,效果如圖。
接下來,我們看看用pandas如何讀寫Excel,其實用pandas操作Excel數據是最方便的,pandas讀取Excel成一個DataFrame,然後就可以使用pandas的函數對數據進行各種處理了。
導入pandas後,讀取一個Excel只需要一行代碼:
import pandas as pd
## 讀取Exceldf = pd.read_excel('D://Book1.xlsx', sheet_name='Sheet1')在jupyter中可以看到輸出結果:
同樣的,計算平均分也非常簡單,也是只有一行代碼:
df["平均分"] = df.mean(axis=1)這裡其實就是對每一行求平均值,pandas會自動對數字型求和,行中有字符型數據也不會報錯。
可以看到平均分已經計算出來了,並修改了Excel。
將修改後的結果出入到Excel依然只需要一行代碼:
df.to_excel("D:/Book4.xlsx", index=False)可以看到數據已經被寫入到新的Excel中。
pandas確實是最方便的工具包,之前我們用xlrd,xlwt和openpyxl寫了很多行代碼的功能,在pandas中三句話就搞定了,效率之高的確值得肯定。
下一篇文章,我會研究一下怎麼使用一些Python工具包對Excel表格調整格式。