一、背景
python自動化測試中,有時候也需要使用到Excel文件,而此時要借用第三方庫才能進(jìn)行操作。在執(zhí)行讀execl文件時要用到xlrd庫,要寫入數(shù)據(jù)至excel文件時,要用到xlwt庫,它們需要單獨安裝,安裝方式也非常簡單。當(dāng)然也可以用其他的第三方庫,比如openpyxl和xlutils庫。最后,選擇什么模塊要根據(jù)實際情況而定。
二、各模塊之間的區(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)建一個新的xls,實現(xiàn)修改。openpyxl(可讀寫excel表)專門處理Excel2007及以上版本產(chǎn)生的xlsx文件,xls和xlsx之間轉(zhuǎn)換容易。另外,還有以下特點。
- 讀取文件速度,xlrd比openpyxl較快
- xlwt寫入文件效率較高
- xlwt寫入數(shù)據(jù)會有局限性,不能寫入超過65535行、256列的數(shù)據(jù)(因為它只支持Excel 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)建一個新的xlsx(可以創(chuàng)建xls格式的excel文件),openpyxl支持07+的excel,一直有人在維護,文檔清晰易讀。
三、安裝第三方庫
這里選擇xlrd,xlwt模塊進(jìn)行簡單介紹。
安裝xlrd庫:
pip install xlrd
安裝xlwt庫:
pip install xlwt
也可以直接在pycharm編輯器中安裝,方法也非常的簡單:先打開settings,然后找到project interpreter,最后再添加想要安裝的模塊即可。

四、讀取excel文件數(shù)據(jù)
這里準(zhǔn)備了一個招聘人員信息表,名字叫zhaopin.xlsx的工作簿,其中有兩個表,名字叫招聘人員和數(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ù)分析')括號中的表名稱一定要填寫正確,否則無法找到對象,會報錯。
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:這個sheet中的行數(shù)。
6、sheet.ncols:這個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 # 這個`sheet`中的行數(shù)
sheet_ncols = sheet.ncols # 這個`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) # 打印這個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對象,返回一個列表
for cell in cells:
print(cell.value) # 打印這個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ū)別,一個是獲取對象,一個是獲取值。
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ū)別,一個是獲取對象,一個是獲取值。
五、寫入數(shù)據(jù)至excel文件
1、cell的數(shù)據(jù)類型
-
xlrd.XL_CELL_TEXT(Text):文本類型。 -
xlrd.XL_CELL_NUMBER(Number):數(shù)值類型。 -
xlrd.XL_CELL_DATE(Date):日期時間類型。 -
xlrd.XL_CELL_BOOLEAN(Bool):布爾類型。 -
xlrd.XL_CELL_BLANK:空白數(shù)據(jù)類型。
2、寫入數(shù)據(jù)至excel文件步驟
- 首先,導(dǎo)入
xlwt模塊。 - 然后,創(chuàng)建一個
Workbook對象。 - 然后,創(chuàng)建一個
Sheet對象。 - 接著,使用
sheet.write(row,col,data)方法把數(shù)據(jù)寫入到Sheet下指定行和列中。如果想要在原來workbook對象上添加新的cell,那么需要調(diào)用put_cell來添加。 - 最后,保存成
Excel文件。
3、實例
比如,我想在原來的‘zhaopin.xlsx’表中添加"總分"一列,并在其中隨機填充面試得分。需要注意,如果想要在原來已經(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) # 隨機向每行6列添加70~99之間的數(shù)
write_workbook = xlwt.Workbook(encoding='utf8') # 重新創(chuàng)建一個工作簿
wsheet = write_workbook.add_sheet('招聘人員') # 工作簿中創(chuàng)建一個名字為“招聘人員”的表
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é)果:
