哈嘍大家好,我是鵬哥。
今天要記錄的學習主題是 —— Excel表處理神器:openpyxl庫
~~~上課鈴~~~
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.active
wb2.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_column
ws.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吧!