Python的一大應(yīng)用就是數(shù)據(jù)分析了,而數(shù)據(jù)分析中,經(jīng)常碰到需要處理Excel數(shù)據(jù)的情況。這里做一個(gè)Python處理Excel數(shù)據(jù)的總結(jié),基本受用大部分情況。相信以后用Python處理Excel數(shù)據(jù)不再是難事兒!
Python處理Excel數(shù)據(jù)需要用到2個(gè)庫(kù):
xlwt和xlrd。xlwt庫(kù)負(fù)責(zé)將數(shù)據(jù)導(dǎo)入生成Excel表格文件,而xlrd庫(kù)則負(fù)責(zé)將Excel表格中的數(shù)據(jù)取出來(lái)。
xlwt庫(kù)將數(shù)據(jù)導(dǎo)入Excel
將數(shù)據(jù)寫入一個(gè)Excel文件
wb = xlwt.Workbook()
# 添加一個(gè)表
ws = wb.add_sheet('test')
# 3個(gè)參數(shù)分別為行號(hào),列號(hào),和內(nèi)容
# 需要注意的是行號(hào)和列號(hào)都是從0開(kāi)始的
ws.write(0, 0, '第1列')
ws.write(0, 1, '第2列')
ws.write(0, 2, '第3列')
# 保存excel文件
wb.save('./test.xls')
可以看到,用xlwt庫(kù)操作非常簡(jiǎn)單,基本就三步走:
- 打開(kāi)一個(gè)
Workbook對(duì)象,并用add_sheet方法添加一個(gè)表 - 然后就是用
write方法寫入數(shù)據(jù) - 最后用
save方法保存
需要注意的是,
xlwt庫(kù)里面所定義的行和列都是從0開(kāi)始計(jì)數(shù)的
定制Excel表格樣式
表格樣式一般主要有這么幾塊內(nèi)容:字體、對(duì)齊方式、邊框、背景色、寬度以及特殊內(nèi)容,比如超鏈接、日期時(shí)間等。下面我們來(lái)分別看看用xlwt庫(kù)怎么定制這些樣式。
字體
xlwt庫(kù)支持的字體屬性也比較多,大概如下:

設(shè)置字體需要用到xlwt庫(kù)的XFStyle類和Font類,代碼模版如下:
style = xlwt.XFStyle()
# 設(shè)置字體
font = xlwt.Font()
# 比如設(shè)置字體加粗和下劃線
font.bold = True
font.underline = True
style.font = font
# 然后應(yīng)用
ws.write(2, 1, 'test', style)
后續(xù)幾個(gè)屬性的設(shè)置都是類似的,都是4步走:
- 拿到
XFStyle - 拿到對(duì)應(yīng)需要的屬性,比如這里的
Font對(duì)象 - 設(shè)置具體的屬性值
- 最后就是在
write方法寫入數(shù)據(jù)的時(shí)候應(yīng)用就行
單元格對(duì)齊
先來(lái)看單元格對(duì)齊怎么設(shè)置
# 單元格對(duì)齊
alignment = xlwt.Alignment()
# 水平對(duì)齊方式和垂直對(duì)齊方式
alignment.horz = xlwt.Alignment.HORZ_CENTER
alignment.vert = xlwt.Alignment.VERT_CENTER
# 自動(dòng)換行
alignment.wrap = 1
style.alignment = alignment
# 然后應(yīng)用
ws.write(2, 1, 'test', style)
上面這個(gè)自動(dòng)換行的屬性還是蠻有用的,因?yàn)槲覀兒芏鄷r(shí)候數(shù)據(jù)會(huì)比較長(zhǎng),最好再加上單元格的寬度屬性一起使用,這樣整體樣式會(huì)好很多
單元格寬度設(shè)置:
# 設(shè)置單元格寬度,也就是某一列的寬度
ws.col(0).width = 6666
單元格的背景色
背景色對(duì)應(yīng)的屬性是 Pattern
# 背景色
pattern = xlwt.Pattern()
pattern.pattern = xlwt.Pattern.SOLID_PATTERN
# 背景色為黃色
# 0 = Black, 1 = White, 2 = Red, 3 = Green, 4 = Blue, 5 = Yellow, 6 = Magenta,
# 7 = Cyan, 16 = Maroon, 17 = Dark Green, 18 = Dark Blue, 19 = Dark Yellow ,
# almost brown), 20 = Dark Magenta, 21 = Teal, 22 = Light Gray, 23 = Dark Gray
# ...
pattern.pattern_fore_colour = 5
style.pattern = pattern
# 然后應(yīng)用
ws.write(2, 1, 'test', style)
單元格邊框
邊框?qū)傩允?code>Borders
單元格邊框就2類:顏色和邊框線樣式
可以分別設(shè)置上下左右邊框的顏色和樣式
# 邊框
borders = xlwt.Borders()
# 邊框可以分別設(shè)置top、bottom、left、right
# 每個(gè)邊框又可以分別設(shè)置顏色和線樣式:實(shí)線、虛線、無(wú)
# 顏色設(shè)置,其他類似
borders.left_colour = 0x40
# 設(shè)置虛線,其他類似
borders.bottom = xlwt.Borders.DASHED
style.borders = borders
# 然后應(yīng)用
ws.write(2, 1, 'test', style)
特殊內(nèi)容,比如超鏈接和公式
特殊內(nèi)容一般主要會(huì)碰到這幾類:超鏈接、公式和時(shí)間日期
處理這些特殊內(nèi)容需要用到Formula
# 超鏈接
link = 'HYPERLINK("http://www.baidu.com";"Baidu")'
formula = xlwt.Formula(link)
ws.write(2, 0, formula)
# 公式也是類似
ws.write(1, 1, xlwt.Formula('SUM(A1,B1)'))
# 時(shí)間
style.num_format_str = 'M/D/YY'
ws.write(2, 1, datetime.datetime.now(), style)
以上就是用Python將數(shù)據(jù)寫入到Excel的全部?jī)?nèi)容了,下面我們?cè)賮?lái)看看怎么讀取Excel中的數(shù)據(jù)做處理。
xlrd庫(kù)讀取Excel中的數(shù)據(jù)
讀取Excel文件
同樣的用xlrd庫(kù)讀取Excel的數(shù)據(jù)也是輕輕松松,先來(lái)看下實(shí)現(xiàn)代碼
# 先打開(kāi)一個(gè)文件
wb = xlrd.open_workbook(file_path)
# 獲取第一個(gè)表
sheet1 = wb.sheet_by_index(0)
# 總行數(shù)
nrows = sheet1.nrows
# 總列數(shù)
ncols = sheet1.ncols
# 后面就通過(guò)循環(huán)即可遍歷數(shù)據(jù)了
# 取數(shù)據(jù)
for i in range(nrows):
for j in range(ncols):
# cell_value方法取出第i行j列的數(shù)據(jù)
value = sheet1.cell_value(i, j)
print(value)
總結(jié)一下,分為一下幾步:
- 首先通過(guò)
xlrd庫(kù)的open_workbook方法打開(kāi)Excel文件 - 然后通過(guò)
sheet_by_index方法獲取表 - 然后分別獲取表的行數(shù)和列數(shù),便于后面循環(huán)遍歷
- 根據(jù)列數(shù)和行數(shù),循環(huán)遍歷,通過(guò)
cell_value方法獲取每個(gè)單元格中的數(shù)據(jù)
工作表的相關(guān)操作
獲取一個(gè)工作表,有多種方式
# 通過(guò)索引
sheet1 = wb.sheets()[0]
sheet1 = wb.sheet_by_index(0)
# 通過(guò)名字
sheet1 = wb.sheet_by_name('test')
# 獲取所有表名
# sheet_names = wb.sheet_names()
獲取某一行或某一列的所有數(shù)據(jù)
# 獲取行中所有數(shù)據(jù),返回結(jié)果是一個(gè)列表
tabs = sheet1.row_values(rowx=0, start_colx=0, end_colx=None)
# 返回一行一共有多少數(shù)據(jù)
len_value = sheet1.row_len(rowx=0)
row_values的三個(gè)參數(shù)分別是:行號(hào)、開(kāi)始的列和結(jié)束的列,其中結(jié)束的列為None表示獲取從開(kāi)始列到最后的所有數(shù)據(jù)
類似的還有獲取某一列的數(shù)據(jù)
cols = sheet1.col_values(colx=0, start_rowx=0, end_rowx=None)
處理時(shí)間數(shù)據(jù)
時(shí)間數(shù)據(jù)比較特殊,沒(méi)發(fā)直接通過(guò)上面的cell_value方法獲取。需要先轉(zhuǎn)換為時(shí)間戳,然后再格式化成我們想要的格式。
比如要獲取Excel表格中,格式為2019/8/13 20:46:35的時(shí)間數(shù)據(jù)
# 獲取時(shí)間
time_value = sheet1.cell_value(3, 0)
# 獲取時(shí)間戳
time_stamp = int(xlrd.xldate.xldate_as_datetime(time_value, 0).timestamp())
print(time_stamp)
# 格式化日期
time_rel = time.strftime("%Y/%m/%d", time.localtime(time_stamp))
print(time_rel)
基本也是三步走:
- 通過(guò)
cell_value方法獲取時(shí)間值 - 然后通過(guò)
xldate_as_datetime方法獲取時(shí)間戳 - 然后格式化一下
總結(jié)
Excel文件是用Python處理數(shù)據(jù)時(shí)常會(huì)碰到的一類場(chǎng)景,有了xlwt 和 xlrd的幫助可以非??焖俚膶?dǎo)入和導(dǎo)出Excel數(shù)據(jù)。大家可以把這篇文章收藏起來(lái),以后碰到處理Excel文件的時(shí)候可以參考一下。