當你需要每天對 Excel 做大量重復的操作,如果只靠人工來做既浪費時間,又十分枯燥,好在 Python/ target=_blank class=infotextkey>Python 為我們提供了許多操作 Excel 的模塊,能夠讓我們從繁瑣的工作中騰出雙手。
今天就和大家分享一個快速處理 Excel 的模塊 openpyxl,它的功能相對與其他模塊更為齊全,足夠應對日常出現(xiàn)的問題。
如果僅用Python來處理數(shù)據(jù)、爬蟲、數(shù)據(jù)分析或者自動化腳本、機器學習等,我建議使用Python基礎環(huán)境+jupyter即可,安裝使用參考windows/mac 安裝、使用Python環(huán)境+jupyter notebook
如果想利用Python進行web項目開發(fā)等,建議使用Python基礎環(huán)境+Pycharm,安裝使用參考:Windows下安裝、使用Pycharm教程,這下全了 和 Mac下玩轉(zhuǎn)Python-安裝&使用Python/PyCharm 。openpyxl 安裝
直接在命令提示符中輸入。
pip install openpyxl
或使用豆瓣鏡像安裝。
pip install -i https://pypi.douban.com/simple openpyxl
安裝成功后,下面就看看如何使用
打開/創(chuàng)建工作簿
「示例工作簿」
工作表【一等獎】
工作表【二等獎】
(1)打開本地工作簿
>>> from openpyxl import load_workbook
>>> wb = load_workbook('獲獎名單.xlsx')
(2)創(chuàng)建空的工作薄
>>> from openpyxl import Workbook
>>> wb1 = Workbook()
訪問工作表
創(chuàng)建新工作表,可指定插入的位置(0:首位,-1:末尾)。
>>> wb.create_sheet('new_sheet', 0)
<Worksheet "new_sheet">
獲取工作簿中所有工作表。
>>> wb.sheetnames
['new_sheet', '一等獎', '二等獎']
使用列表推導式遍歷獲取所有工作表名稱。
>>> [sheet.title for sheet in wb]
['new_sheet', '一等獎', '二等獎']
使用 wb[sheetname] 來獲取一個工作表對象
>>> wb['二等獎']
<Worksheet "二等獎">
獲取活動表(即打開工作簿首先出現(xiàn)的工作表)。
>>> wb.active
<Worksheet "一等獎">
獲取工作表行列信息。
>>> sheet1 = wb['一等獎']
>>> sheet1.max_column
7
>>> sheet1.max_row
6
獲取單元格信息
訪問某個單元格
>>> sheet1['D3']
<Cell '一等獎'.D3>
>>> sheet1.cell(row=3, column=4)
<Cell '一等獎'.D3>
如果訪問單元格式添加 value 參數(shù)則會修改當前單元格的值。
>>> sheet1.cell(3, 4).value
'基于Spark、Python的醫(yī)護人員信息抽取與管理'
>>> sheet1.cell(3, 4, value='Python')
<Cell '一等獎'.D3>
>>> sheet1.cell(3, 4).value
'Python'
獲取單元格的值、坐標、行索引、列索引。
>>> sheet1['D3'].value
'Python'
>>> sheet1['D3'].coordinate
'D3'
>>> sheet1['D3'].row
3
>>> sheet1['D3'].column
4
訪問多個單元格
使用切片來訪問多個單元格,這里的切片與列表切片有區(qū)別,列表切片是「前閉后開」,Excel 中的切片是「前閉后閉」。
(1)選取 A1:B2 區(qū)域的單元格。
>>> sheet1['A1':'B2']
((<Cell '一等獎'.A1>,
<Cell '一等獎'.B1>),
(<Cell '一等獎'.A2>,
<Cell '一等獎'.B2>))
選取單列數(shù)據(jù)。
>>> sheet1['D']
(<Cell '一等獎'.D1>,
...
<Cell '一等獎'.D6>)
選取B,C列數(shù)據(jù)。
>>> sheet1['B:C']
((<Cell '一等獎'.B1>,
...
<Cell '一等獎'.B6>),
(<Cell '一等獎'.C1>,
...
<Cell '一等獎'.C6>))
選取單行數(shù)據(jù)。
>>> sheet1[3]
(<Cell '一等獎'.A3>,
<Cell '一等獎'.B3>,
...
<Cell '一等獎'.F3>,
<Cell '一等獎'.G3>)
選取第2,3行數(shù)據(jù)。
>>> sheet1[2:3]
((<Cell '一等獎'.A2>,
...
<Cell '一等獎'.G2>),
(<Cell '一等獎'.A3>,
...
<Cell '一等獎'.G3>))
遍歷獲取數(shù)據(jù)
按行遍歷指定范圍(B2:C3)數(shù)據(jù)。
>>> for row in sheet1.iter_rows(min_row=2, max_row=3, min_col=2, max_col=3):
for cell in row:
print(cell.coordinate)
B2
C2
B3
C3
按列遍歷指定范圍(B2:C3)數(shù)據(jù)。
>>> for col in sheet1.iter_cols(min_row=2, max_row=3, min_col=2, max_col=3):
for cell in col:
print(cell.coordinate)
B2
B3
C2
C3
如果 iter_rows()/iter_cols() 中指定參數(shù) values_only=True,那么將只返回單元格的值
按行遍歷所有數(shù)據(jù)。
>>> tuple(sheet1.rows)
((<Cell '一等獎'.A1>,
...
<Cell '一等獎'.G1>),
...
...
(<Cell '一等獎'.A6>,
...
<Cell '一等獎'.G6>))
按列遍歷所有數(shù)據(jù)。
>>> tuple(sheet1.columns)
((<Cell '一等獎'.A1>,
...
<Cell '一等獎'.A6>),
...
...
(<Cell '一等獎'.G1>,
...
<Cell '一等獎'.G6>))
修改工作表
單元格賦值
新增一列計算 作者 人數(shù)。
>>> for row_index in range(2, sheet1.max_row + 1):
sheet1.cell(row_index, 8).value = len(sheet1.cell(row_index, 6).value.split(','))
使用公式給單元格賦值,H7 統(tǒng)計作者總?cè)藬?shù)。
>>> sheet1['H7'] = '=SUM(H1:H6)'
追加一行數(shù)據(jù)
使用列表按序傳入值。
>>> sheet1.Append([str(n) for n in range(6)])
使用字典指定 列索引:列值 。
>>> sheet1.append({'A':'1','C':'3'})
插入空白行
在指定位置插入空白行, idx 行索引,插入的位置;amount 插入空白行的數(shù)量
>>> sheet1.insert_rows(idx=2, amount=2)
刪除工作表
>>> wb.remove(wb['new_sheet'])
保存工作簿
>>> wb.save('獲獎名單V1.xlsx')
修改樣式
字體
設置 B2 單元格字體格式為,顏色可以用十六進制顏色代碼。
>>> from openpyxl.styles import Font
>>> new_font = Font(name='微軟雅黑', size=20, color='3333CC', bold=True)
>>> sheet1['B2'].font = new_font
單元格背景顏色
>>> from openpyxl.styles import PatternFill, colors
>>> sheet1["A2"].fill = PatternFill("solid", fgColor=colors.BLUE)
>>> sheet1["A3"].fill = PatternFill("solid", fgColor='FF66CC')
對齊方式
設置 D2 中的數(shù)據(jù) 垂直居中 和 水平居中 。
>>> from openpyxl.styles import Alignment
>>> sheet1['D2'].alignment = Alignment(horizontal='center', vertical='center')
行高/列寬
設置第2行行高為40,C列列寬為20。
>>> sheet1.row_dimensions[2].height = 40
>>> sheet1.column_dimensions['C'].width = 20
合并/拆分單元格
合并單元格只需要指定左上角和右下角的單元格坐標。
>>> sheet.merge_cells('A1:C3')
拆分單元格后,合并區(qū)域的值會賦給左上角單元格A1。
>>> sheet.unmerge_cells('A1:C3')
萬水千山總是情,點個 行不行。