0x00. 前言
最近工作中有個(gè)處理 Excle 數(shù)據(jù)的需求,正好拿 Python 來練練手。簡(jiǎn)單搜了下,發(fā)現(xiàn)一個(gè)好網(wǎng)站:www.python-excel.org(可能需要爬墻頭,請(qǐng)自理~),網(wǎng)站中介紹了幾種開源的 Excel 處理框架,本文選擇了排在第一位的openpyxl。
0x01. 使用
雖然是一個(gè)開源工具,它卻擁有詳細(xì)的文檔參考,打不開也沒關(guān)系,文章末尾會(huì)給出 PDF 格式下載鏈接。下面就來介紹該工具的基本使用。
使用環(huán)境
- Mac OS X 10.11.2
- Python 2.7.11
安裝
如果你使用 Mac 或者 Linux 系統(tǒng),那么安裝將特別簡(jiǎn)單:
$ pip install openpyxl
有同學(xué)會(huì)問,如果沒有 pip
或 windows 系統(tǒng)咋辦啊?簡(jiǎn)單!可以從這里下載源碼安裝。下載并解壓后,進(jìn)入到解壓目錄,執(zhí)行:
$ python setup.py install
使用
安裝完畢后就可以使用了,先簡(jiǎn)單介紹一下,該工具有幾個(gè)主要的類:
-
Workbook
: 代表一個(gè) Excel 文件(工作簿)。 -
Worksheet
: 代表 Excel 文件中的一個(gè)工作表。 -
Cell
: 代表一個(gè)單元格。
好了,知道了這幾個(gè)類的含義后,使用就比較簡(jiǎn)單了:
a) 創(chuàng)建 Excel
from openpyxl import Workbook
# 創(chuàng)建 Excel 對(duì)象
wb = Workbook()
# 保存成文件
wb.save('test.xlsx')
這樣就創(chuàng)建了一個(gè)空的、名為test.xslx
的工作簿。
b) 加載一個(gè)已存在的 Excel
from openpyxl import load_workbook
wb = load_workbook('test.xlsx')
這樣就加載了一個(gè)名為test.xlsx
的 Excel 文件。
c) 操作工作表
# 獲取 Excel 打開后默認(rèn)的工作表
default_ws = wb.active
# 創(chuàng)建一個(gè)新工作表
new_ws = wb.create_sheet(title='new ws')
# 修改工作表的名稱
new_ws.title = 'modified ws'
# 迭代工作表中所有行
for row in new_ws.iter_rows():
pass
d) 操作單元格
# 給 “F5” 單元格賦值
new_ws['F5'] = 'test'
new_ws['F5'].value = 'hello'
# 取出 “F5” 單元格的值
print(new_ws['F5'].value)
# 得到單元格對(duì)象
from openpyxl.cell import Cell
c = Cell(new_ws)
f5 = new_ws['F5']
以上就是對(duì) Excel對(duì)象的基本操作了,但在使用中,我們總會(huì)有各種需求,比如:在一些行后添加數(shù)據(jù),我們使用new_ws.iter_rows()
返回的是一個(gè) tuple 對(duì)象,這時(shí),我們需要用list()
函數(shù)先將其轉(zhuǎn)化為 list 對(duì)象,添加數(shù)據(jù)后再寫入文件:
from openpyxl.cell import Cell
for row in new_ws.iter_rows():
data = list(row)
c = Cell(new_ws)
c.value = 'hello'
data.append(c)
other_ws.append(data)
0x02. 小結(jié)
openpyxl 的相當(dāng)強(qiáng)大,還支持操作 Excel 中的圖表等高級(jí)功能。由于工作中沒有用到,就沒有去研究,感興趣的同學(xué)可以去看看。
最后分享一點(diǎn)使用 Python 開源工具的小技巧:
由于 Python 中動(dòng)態(tài)語(yǔ)言,有時(shí)候很難判斷一個(gè)方法返回的數(shù)據(jù)類型,我們可以經(jīng)常使用
type()
方法將返回值的類型打印出來,方法我們對(duì)返回值的使用和處理。
0x03. 附:
openpyxl 參考文檔:http://pan.baidu.com/s/1c1w77sk