一、背景
python自動(dòng)化測試中鸵熟,有時(shí)候也需要使用到Excel文件副编,而此時(shí)要借用第三方庫才能進(jìn)行操作。在執(zhí)行讀execl文件時(shí)要用到xlrd庫流强,要寫入數(shù)據(jù)至excel文件時(shí)痹届,要用到xlwt庫,它們需要單獨(dú)安裝打月,安裝方式也非常簡單队腐。當(dāng)然也可以用其他的第三方庫,比如openpyxl和xlutils庫奏篙。最后柴淘,選擇什么模塊要根據(jù)實(shí)際情況而定。
二秘通、各模塊之間的區(qū)別
xlrd为严,xlwt和xlutils是用Python處理Excel文檔(*.xls)的高效率工具。其中肺稀,xlrd只能讀取xls第股,xlwt只能新建xls(不可以修改),xlutils能將xlrd.Book轉(zhuǎn)為xlwt.Workbook话原,從而得以在現(xiàn)有xls的基礎(chǔ)上修改數(shù)據(jù)夕吻,并創(chuàng)建一個(gè)新的xls,實(shí)現(xiàn)修改繁仁。openpyxl(可讀寫excel表)專門處理Excel2007及以上版本產(chǎn)生的xlsx文件涉馅,xls和xlsx之間轉(zhuǎn)換容易。另外黄虱,還有以下特點(diǎn)控漠。
- 讀取文件速度,xlrd比openpyxl較快
- xlwt寫入文件效率較高
- xlwt寫入數(shù)據(jù)會(huì)有局限性,不能寫入超過65535行盐捷、256列的數(shù)據(jù)(因?yàn)樗恢С諩xcel 2003及之前的版本偶翅,在這些版本的Excel中行數(shù)和列數(shù)有此限制)
- xlrd,xlwt和xlutils是用Python處理Excel文檔(*.xls)的高效率工具碉渡。其中聚谁,xlrd只能讀取xls,xlwt只能新建xls(不可以修改)滞诺,xlutils能將xlrd.Book轉(zhuǎn)為xlwt.Workbook形导,從而得以在現(xiàn)有xls的基礎(chǔ)上修改數(shù)據(jù)
- xlwt不支持07版以后的excel并創(chuàng)建一個(gè)新的xlsx(可以創(chuàng)建xls格式的excel文件),openpyxl支持07+的excel习霹,一直有人在維護(hù)朵耕,文檔清晰易讀。
三淋叶、安裝第三方庫
這里選擇xlrd阎曹,xlwt模塊進(jìn)行簡單介紹。
安裝xlrd庫:
pip install xlrd
安裝xlwt庫:
pip install xlwt
也可以直接在pycharm編輯器中安裝煞檩,方法也非常的簡單:先打開settings处嫌,然后找到project interpreter,最后再添加想要安裝的模塊即可斟湃。
四熏迹、讀取excel文件數(shù)據(jù)
這里準(zhǔn)備了一個(gè)招聘人員信息表,名字叫zhaopin.xlsx的工作簿凝赛,其中有兩個(gè)表注暗,名字叫招聘人員和數(shù)據(jù)分析。如圖:
下面我們用python第三方庫xlrd來讀取工作簿中的信息墓猎。
1友存、 sheet_names
:獲取所有的sheet
的名字。
import xlrd
workbook = xlrd.open_workbook('zhaopin.xlsx') # 打開名字叫'zhaopin.xlsx'的工作簿
sheet_names = workbook.sheet_names() # 獲得工作簿中的所有表明
print(sheet_names)
結(jié)果:
['招聘人員', '數(shù)據(jù)分析']
2陶衅、 sheet_by_index
:根據(jù)索引獲取sheet
對象。
import xlrd
workbook = xlrd.open_workbook('zhaopin.xlsx') # 打開名字叫'zhaopin.xlsx'的工作簿
sheet0 = workbook.sheet_by_index(0) # 獲取索引為0的表對象直晨,0對應(yīng)的是excel工作簿中的第一張表
sheet1 = workbook.sheet_by_index(1) # 獲取索引為1的表對象搀军,1對應(yīng)的是excel工作簿中的第二張表
print(sheet0.name)
print(sheet1.name)
結(jié)果:
招聘人員
數(shù)據(jù)分析
3、 sheet_by_name
:根據(jù)名字獲取sheet
對象勇皇。
import xlrd
workbook = xlrd.open_workbook('zhaopin.xlsx') # 打開名字叫'zhaopin.xlsx'的工作簿
sheet = workbook.sheet_by_name('數(shù)據(jù)分析')
print(sheet.name)
結(jié)果:
數(shù)據(jù)分析
注意:sheet_by_name('數(shù)據(jù)分析')括號中的表名稱一定要填寫正確罩句,否則無法找到對象,會(huì)報(bào)錯(cuò)敛摘。
4门烂、sheets
:獲取所有的sheet
對象。
import xlrd
workbook = xlrd.open_workbook('zhaopin.xlsx') # 打開名字叫'zhaopin.xlsx'的工作簿
sheets = workbook.sheets() # 獲取所有的`sheet`對象
for sheet in sheets:
print(sheet.name)
結(jié)果:
招聘人員
數(shù)據(jù)分析
5、sheet.nrows
:這個(gè)sheet
中的行數(shù)屯远。
6蔓姚、sheet.ncols
:這個(gè)sheet
中的列數(shù)。
import xlrd
workbook = xlrd.open_workbook('zhaopin.xlsx') # 打開名字叫'zhaopin.xlsx'的工作簿
sheet = workbook.sheet_by_index(0) # 獲取索引為0的表對象慨丐,0對應(yīng)的是excel工作簿中的第一張表
sheet_nrows = sheet.nrows # 這個(gè)`sheet`中的行數(shù)
sheet_ncols = sheet.ncols # 這個(gè)`sheet`中的列數(shù)
print('行數(shù)為:{}'.format(sheet_nrows))
print('列數(shù)為:{}'.format(sheet_ncols))
結(jié)果:
行數(shù)為:78
列數(shù)為:7
7坡脐、sheet.cell(row,col):獲取指定行和列的cell對象。
import xlrd
workbook = xlrd.open_workbook('zhaopin.xlsx') # 打開名字叫'zhaopin.xlsx'的工作簿
sheet = workbook.sheet_by_name('招聘人員')
cells = sheet.cell(0,1) # 獲取指定0行和1列的cell對象房揭。
print(cells.value) # 打印這個(gè)cell里面的值备闲。
結(jié)果:
姓名
8、sheet.row_slice(row,start_col,end_col):獲取指定行的某幾列的cell對象捅暴。
import xlrd
workbook = xlrd.open_workbook('zhaopin.xlsx') # 打開名字叫'zhaopin.xlsx'的工作簿
sheet = workbook.sheet_by_name('招聘人員')
cells = sheet.row_slice(0,0,6) # 獲取指定0行的0列到5列的cell對象恬砂。
print(cells)
結(jié)果:
[text:'序號', text:'姓名', text:'性別', text:'專業(yè)', text:'學(xué)歷', text:'畢業(yè)院校']
9、sheet.col_slice(col,start_row,end_row):獲取指定列的某幾行的cell對象蓬痒。
import xlrd
workbook = xlrd.open_workbook('zhaopin.xlsx') # 打開名字叫'zhaopin.xlsx'的工作簿
sheet = workbook.sheet_by_index(0) # 獲取索引為0的表對象呐舔,0對應(yīng)的是excel工作簿中的第一張表
cells = sheet.col_slice(1,0,5)#獲取1列0行到4行的cell對象,返回一個(gè)列表
for cell in cells:
print(cell.value) # 打印這個(gè)cell里面的值鸣皂。
結(jié)果:
姓名
馮濤
李佳楠
羅旭
張自航
10瞻坝、sheet.cell_value(row,col):獲取指定行和列的值。
import xlrd
workbook = xlrd.open_workbook('zhaopin.xlsx') # 打開名字叫'zhaopin.xlsx'的工作簿
sheet = workbook.sheet_by_index(0)
cells = sheet.cell_value(0,5)
print(cells)
結(jié)果:
畢業(yè)院校
11粹断、sheet.row_values(row,start_col,end_col):獲取指定行的某幾列的值符欠。
import xlrd
workbook = xlrd.open_workbook('zhaopin.xlsx') # 打開名字叫'zhaopin.xlsx'的工作簿
sheet = workbook.sheet_by_index(0)
cells = sheet.row_values(0,0,6) # 獲取0行從0列到5列的值。
print(cells)
結(jié)果:
['序號', '姓名', '性別', '專業(yè)', '學(xué)歷', '畢業(yè)院校']
注意:它與sheet.row_slice(row,start_col,end_col)的區(qū)別瓶埋,一個(gè)是獲取對象希柿,一個(gè)是獲取值。
12养筒、sheet.col_values(col,start_row,end_row):獲取指定列的某幾行的值曾撤。
import xlrd
workbook = xlrd.open_workbook('zhaopin.xlsx') # 打開名字叫'zhaopin.xlsx'的工作簿
sheet = workbook.sheet_by_index(0)
cells = sheet.col_values(1,0,5)
print(cells)
結(jié)果:
['姓名', '馮濤', '李佳楠', '羅旭', '張自航']
注意:它與sheet.col_slice(col,start_row,end_row)的區(qū)別,一個(gè)是獲取對象晕粪,一個(gè)是獲取值挤悉。
五、寫入數(shù)據(jù)至excel文件
1巫湘、cell的數(shù)據(jù)類型
-
xlrd.XL_CELL_TEXT(Text)
:文本類型装悲。 -
xlrd.XL_CELL_NUMBER(Number)
:數(shù)值類型。 -
xlrd.XL_CELL_DATE(Date)
:日期時(shí)間類型尚氛。 -
xlrd.XL_CELL_BOOLEAN(Bool)
:布爾類型诀诊。 -
xlrd.XL_CELL_BLANK
:空白數(shù)據(jù)類型。
2阅嘶、寫入數(shù)據(jù)至excel文件步驟
- 首先属瓣,導(dǎo)入
xlwt
模塊载迄。 - 然后,創(chuàng)建一個(gè)
Workbook
對象抡蛙。 - 然后护昧,創(chuàng)建一個(gè)
Sheet
對象。 - 接著溜畅,使用
sheet.write(row,col,data)
方法把數(shù)據(jù)寫入到Sheet
下指定行和列中捏卓。如果想要在原來workbook
對象上添加新的cell
,那么需要調(diào)用put_cell
來添加慈格。 - 最后怠晴,保存成
Excel
文件。
3浴捆、實(shí)例
比如蒜田,我想在原來的‘zhaopin.xlsx’表中添加"總分"一列,并在其中隨機(jī)填充面試得分选泻。需要注意冲粤,如果想要在原來已經(jīng)存在的Excel
文件中添加新的行或者新的列,那么需要采put_cell(row,col,type,value,xf_index)
來添加進(jìn)去页眯,最后再放到xlwt
創(chuàng)建的workbook
中梯捕,然后再保存進(jìn)去。示例代碼如下:
import xlwt
import xlrd
import random
workbook = xlrd.open_workbook('zhaopin.xlsx') # 打開名字叫'zhaopin.xlsx'的工作簿
rsheet = workbook.sheet_by_index(0)
rsheet.put_cell(0, 6, xlrd.XL_CELL_TEXT, '總分', None) # 在0行6列處添加“總分”列窝撵,列屬性為文本
for row in range(1, rsheet.nrows):
rsheet.put_cell(
row,
6,
xlrd.XL_CELL_TEXT,
random.randint(
70,
99),
None) # 隨機(jī)向每行6列添加70~99之間的數(shù)
write_workbook = xlwt.Workbook(encoding='utf8') # 重新創(chuàng)建一個(gè)工作簿
wsheet = write_workbook.add_sheet('招聘人員') # 工作簿中創(chuàng)建一個(gè)名字為“招聘人員”的表
for row in range(rsheet.nrows):
for col in range(rsheet.ncols):
wsheet.write(row, col, rsheet.cell_value(row, col)) # 將原表中的數(shù)據(jù)寫入新創(chuàng)建的表中
write_workbook.save('zhaopin_new.xls') # 保存
結(jié)果: