【Python成長之路】快速掌握用python處理Excel

哈嘍大家好,我是鵬哥。

 

今天要記錄的學習主題是 —— Excel表處理神器:openpyxl庫

 

~~~上課鈴~~~

 

SummerMAZZA - 歌曲合輯

1

寫在前面

之前我想過 要不要寫一篇關於如何處理excle表的博客,可是網上一搜都是有太多的文章了。python處理excel表的庫,常見的有:xlrd、xlwt、xlwings、openpyxl、win32com、pandas等。

針對python各類第三方庫,支持情況如下:

介於網上有這麼多精彩的博客,我就一直懶的再去做總結。不過昨天小杰找到我,讓我幫他處理下excel表數據。我說你自己百度下不就行了嗎?他說網 上的看不懂。(雖然我覺得他肯定是沒認真看 

好吧,既然如此,我就爲你寫篇博客,讓你能快速掌握excel表吧!

2

openpyxl庫

這裏我主要介紹openpyxl庫的幾類常見方法。至於爲什麼是openpyxl,主要是我自己平時習慣用openpyxl,其他庫已經不熟悉了。

1、打開/創建excel文件​​​​​​​

from openpyxl import *# 打開已有test.xlsx表wb1 = load_workbook('test.xlsx')# 創建xlsx表,結束後以test.xlsx表保存wb2 = Workbook()ws = wb2.activewb2.save('test.xlsx')

2、選擇/創建sheet表​​​​​​​

、# 創建test1表ws1 = wb1.create_sheet('test1')# 選擇test1表ws2 = wb2['test1']

3、單一單元格訪問​​​​​​​

# 方法一:value1 = ws['A4'].value# 方法二value2 = ws.cell(row=4, column=2).value

這裏一般獲取單元格都是爲了獲取表格中的內容,即cell.value。如果是爲了獲取其他內容,如行、列、座標值,可通過以下命令:

# 行ws.cell(row=4, column=2).row# 列ws.cell(row=4, column=2).column# 座標ws.cell(row=4, column=2).coordinate

4、多個單元格訪問​​​​​​​

# 切片for row in ws['A1':'C3']:    for cell in row:        print(cell.value)# 通過行或者列,下方是行for row in ws[1:3]:    for cell in row:        print(cell.value)# 遍歷for row in ws.iter_rows(min_row=1,max_row=3,min_col=1,max_col=3):    for cell in row:        print(cell.value)# 列表轉化,下方是行for row in list(ws.rows)[0:3]:    for cell in row:        print(cell.value)

初學時,我以爲當只取一列或者一行值時,可以只用 一個for循環,後來發現不行,當只有一個循環會報:AttributeError: 'tuple' object has no attribute 'value'​​​​​​​

for row in ws['A1':'A4']:    print(row.value)報錯:AttributeError: 'tuple' object has no attribute 'value'

另外,在通過行列取值時,ws[1:4]表示第1行開始;但用列表轉化後,[1:4]表示從第2行開始。這個細節,需要關注下。

 

5、單元格數據寫入​​​​​​​

# 單一單元格寫入ws['A1']='test'# 一行數據寫入ws.append([1,2,3,4,5])

 

6、獲取表最大行、最大列​​​​​​​

ws.max_columnws.max_row

7、刪除工作表​​​​​​​

# 方式一wb.remove(sheet)# 方式二del wb[sheet]

8、簡單的單元格設置格式​​​​​​​

from openpyxl.styles import Font, colors, Alignment
# 設置字體、顏色:等線24號,加粗斜體,字體顏色紅色myfont = Font(name='等線', size=24, italic=True, color=colors.RED, bold=True)ws['A1'].font = myfont# 設置對齊:垂直居中和水平居中ws['A1'].alignment = Alignment(horizontal='center', vertical='center')# 設置行高 :第1行行高ws.row_dimensions[1].height = 10# 設置列寬:A列列寬ws.column_dimensions['A'].width = 10# 合併單元格ws.merge_cells('A1:C3')

不過,我覺得單元格格式設置這種,還是直接在excel表上處理來着方便,因爲效果直觀嘛。

3

小杰的實際問題

【背景】:原始表格內的數據是按月分將所有人數據統計的,如1月將A/B/C等人的信息進行彙總。

【訴求】:將所有數據按人名進行統計,即將A的1-12月數據彙總到一張sheet表上;並且要保留原表中1-3行的表頭。

【困難】:由於人名有上百個,總不能手動複製粘貼每人的數據吧?

4

示例代碼​​​​​​​

# coding=utf-8# @公衆號 : "鵬哥賊優秀"# @Date : 2020/4/9# @Software : PyCharm # @Python version: Python 3.7.2
from openpyxl import *
# 將ws1的i-j行數據寫入ws2表def get_value(ws1,ws2,i,j):    for row in list(ws1.rows)[i:j]:        res = []        for cell in row:            res.append(cell.value)        ws2.append(res)
print('start!')wb1 = load_workbook('原始數據.xlsx')wb2 = load_workbook('test.xlsx')sheets = ['1月','2月','3月','4月','5月','6月','7月','8月','9月','10月','11月','12月']ws_first = wb1[sheets[0]]names = []# 獲取所有人名for row in ws_first['C4':'C22']:    for cell in row:        names.append(row.value)
for i,name in enumerate(names):    # 保留每張sheet表1-3行的表頭    ws2 = wb2.create_sheet(name)    get_value(ws_first,ws2,0,3)    # 獲取單人所有月分數據,並寫入ws2    for sheet in sheets:        ws1 = wb1[sheet]        get_value(ws1,ws2,i+3,i+4)
wb2.save('test.xlsx')print('end!')

5

總結

小杰同學,20+行代碼就可以搞定你的要求,還不快跟着鵬哥來學Python?

 

~~~下課鈴~~~

 

【往期熱門文章】:

【Python成長之路】10行代碼教你免費觀看無廣告版的《慶餘年》騰訊視頻

【Python成長之路】如何用python開發自己的iphone應用程序,並添加至siri指令

【Python成長之路】從 零做網站開發 -- 基於Flask和JQuery,實現表格管理平臺

點擊下方詩句,可以留言互動喔  

莫將瓊萼等閒分,留贈意中人。

 

【關注“鵬哥賊優秀”公衆號,回覆“python學習材料”,將會有python基礎學習、機器學習、數據挖掘、高級編程教程等100G視頻資料,及100+份python相關電子書免費贈送!】

 

掃描二維碼

    與鵬哥一起

學python吧!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章