最近有一個需要做一個自動化,其中就需要讀取表格的數據,親們都知道Jmeter讀取表格最常見的方式是使用CSV
文件,但是,CSV的使用范疇有限,必須數據規整,假如表格有合并的,CSV文件就會出現這樣的情況:
如圖所示:
我們的表格是這樣的:
image.png
我們把他另存為csv格式:
image.png
而且,重點來了,對于多個sheet的表格搞不來csv,還需要把表格分割出來,fuck!
只能說Jmeter的CSV組件還有很大的進步空間啊,那我們怎么辦呢???
image.png
這個時候我們就需要使用bearshell來處理表格了
BUT
語言功底很差,怎么辦?
來,我教你!
目前處理表格最簡單的應該是python了!上一篇我們講了Jmter導包,我們可以導入xlrd。
下邊是我編寫的一哥處理表格的python,很簡單,注釋的也很詳細。
# 修改這里勘察表文件名稱
path = u'02 勘察表_AC202019018040_臨沂市鑫鑫機動車檢測有限公司_王超_20201108_李剛_曾懷志.xlsx'
# 1,下載勘察需求表到本機的D:\zenghz_zhuanyong\excell\路徑下,
# 2,請在這里輸入勘察表的全稱,包含后綴,
# 3,需要在引號內
########### !!! 驗證碼識別錯誤導致失敗請重新執行!!! ##########
############導包,打開文件###########別動##############################
import sys
sys.path.append('C:\Python27\Lib')
sys.path.append('C:\Python27\Lib\site-packages')
reload(sys)
sys.setdefaultencoding('utf-8')
import xlrd
if u'曾懷志' in path:
createname = u'曾懷志'
if u'駱文豪' in path:
createname = u'駱文豪'
if u'萬安' in path:
createname = u'萬安'
if u'劉宇浩' in path:
createname = u'劉宇浩'
if u'黃鵬杰' in path:
createname = u'黃鵬杰'
uname = u'曾懷志'
pwd = u'88888888'
vars.put('uname',uname)
vars.put('pwd',pwd)
vars.put('createname',createname)
vars.put('path',path)
# 打開Excel文件讀取數據
workbook = xlrd.open_workbook('D:\\zenghz_zhuanyong\\excell\\' + path)
###############################################獲取第一頁的檢測站基本信息####################################################################
# 根據sheet索引或者名稱獲取sheet內容
#Data_sheet_0 = workbook.sheet_by_index(0);
#Data_sheet_0 = workbook.sheet_by_name('檢測站基本信息')
#Data_sheet_0 =workbook.sheets()[0];
Data_sheet_0 = workbook.sheets()[0];
#檢測站名稱
jczmc=Data_sheet_0.cell(0, 2)
vars.put('jczmc_python',jczmc.value)
#檢測站地址
jczdz=Data_sheet_0.cell(1, 2)
vars.put('jczdz_python',u'勘察表地址不詳')
if jczdz.value != u'':
vars.put('jczdz_python',jczdz.value)
#電話
vars.put('jczdh_python',u'18888888888')
jczdh=Data_sheet_0.cell(2, 2)
###這里拿到的結果會自動變為浮點數,尾部加了.0 所以要轉化成int類型,但是固定電話中帶-,不能轉化,所以要判斷。
#if jczdh.value.find('-') != -1 or jczdh.value is NULL: #如果是固定電話
# vars.put('jczdh_python',jczdh.value)
if jczdh.value !='': #如果不是固定電話,轉換成int類型
if '-' not in str(jczdh.value):
vars.put('jczdh_python',str(int(jczdh.value)))
if '-' in str(jczdh.value) :
vars.put('jczdh_python',jczdh.value)
#車牌前綴
cpqz=Data_sheet_0.cell(3, 2)
vars.put('cpqz_python',cpqz.value)
#檢測站類別,這里經常會有‘安檢,綜檢,環檢’這樣的,我們需要顯示為‘綜安環’
jczlb=Data_sheet_0.cell(4, 2)
vars.put('jczlb_python',jczlb.value.replace("、","").replace(",","").replace(" ","").replace("/","").replace(",","").replace("檢",""))
#授權簽字人
sqqzr=Data_sheet_0.cell(5, 2)
vars.put('sqqzr_python',sqqzr.value)
#省
sheng=Data_sheet_0.cell(6, 2)
if u'廣西' in sheng.value:
sheng.value = u'廣西壯族自治區'
print(sheng.value)
if u'內蒙' in sheng.value:
sheng.value = u'內蒙古自治區'
if u'寧夏' in sheng.value:
sheng.value = u'寧夏回族自治區'
if u'新疆' in sheng.value:
sheng.value = u'新疆維吾爾自治區'
if u'西藏' in sheng.value:
sheng.value = u'西藏自治區'
vars.put('sheng',sheng.value)
#市
shi=Data_sheet_0.cell(7, 2)
vars.put('shi',shi.value)
table = workbook.sheet_by_index(1)
name = table.name
#這個sheet的總行數
rowNum = table.nrows
print(rowNum)
print('*********************************')
#這個sheet的總列數
colNum = table.ncols
#table.row_values(第幾行) #可以獲取整行的數據
#table.row_values(第幾行)[第幾列] #可以獲取具體的那一列的數據
#print("這個表總共有%s行"%rowNum,"%s列"%colNum)
#讀取每一行的數據并進行處理
lines=[]
xiangmus=[]
for i in range(0,rowNum): #遍歷每一行
if table.row_values(i)[4] !='' and table.row_values(i)[4] !=u'檢測項目' : #對列4判斷 # u就可以轉義中文
xiangmus.append(table.row_values(i)[4]) #將第5列的值插入到這個數組中,其實就是檢測項目的數組
lines.append(table.row_values(i)[1]) #將第2列的值插入到這個數組中,其實就是線名稱的數組
line=[] #這個數組里面是不重復的檢測線
lx=len(lines) #項目的數量
print(lx)
for i in lines: #去重
if i not in line:
line.append(i)
line_xs=str(len(line))
#print(type(line_xs)) ###這個站檢測線的數量
vars.put('line_xs_python',line_xs)
#vars.put('line_python',line_xs)
#print(u"這個站有%s"%line)
#將有幾條線傳給Jmeter
#list.count(A) 可以統計出A數據在數組line出現的次數
line_list=[] #檢測線的數組
gongweiNum=[] #檢測線對應的工位數
HH = 1
for i in line:
# print(u"%s有%s個工位"%(i,lines.count(i)))
print(i)
print(type(i))
a=str(lines.count(i)) #int類型轉換為str,這里的a就是指檢測項目同一個檢測線出現了幾次,出現了幾次就代表這個線有幾個工位
# print(type(a))
# vars.put('gongweiNum_python' + str(i+1),a) #必須要把按轉換為str,int類型會報錯 發現這種賦值不行,只能取到最后一次i對應的值,
#檢測線下有幾個工位
line_list.append(i)
gongweiNum.append(a) #[2,3,5]
G = 1 #定義一個變量G,G表示第幾條線
for i in gongweiNum:
print(i)
print(type(i))
vars.put('gongweiNum_python_' + str(G),i) #@@#這里每條線下有幾個工位的值傳給Jmeter
G = G + 1
#pringt(type(line_list))
# print(type(a)) #檢查類型
#vars.put('linemc_python',line_list)
#現在使用的方式是提前寫好線的變量和檢測項目的變量
for i in range(0,int(line_xs)): #有幾條線就遍歷幾次,然后把每條線下有幾個工位賦值為變量
i=int(i)
print(i)
# b='gongwei' +str(i)
# print(b)
# print(u'hahaha'+ gongweiNum[i])
vars.put('gongwei' +str(i+1),gongweiNum[i]) #這個是對應項目的數量
j = gongweiNum[i]
j=int(j)
bb=xiangmus[0:j]
A=1
for n in bb: ########遍歷每條線的數組,把每個項目拿出來交給變量
print(n)
print(type(n))
vars.put('xiangmu' + str(i+1) + str(A),n.replace("、","").replace(",","").replace(" ","").replace("/","").replace(",",""))
A = A + 1
del xiangmus[0:j]
# d = str(i+1)
#vars.put('xiangmu' +d + str(A),n)
# print(u"第%s次執行"%i)
#print(str(i+1))
HH = 1
for i in line:
vars.put('linename_' + str(HH),i)
HH = HH + 1
#################################################################
############################################對工位參數進行讀取##########################
chesu_bkxh = [] #車速板卡型號
chesu_sfgc = [] #車速是否過車
zhouz_bkxh = [] #軸重板卡型號
zhouz_sfgc = [] #軸重是否過車
guntzd_sfecyb = [] #滾筒是否二次儀表
guntzd_ttlx = [] #滾筒臺體類型
guntzd_czfs = [] #滾筒稱重方式
jingt_sblx = [] ##底檢設備類型
dadeng_sfecyb = [] #大燈是否二次儀表
dadeng_sbxh = [] #大燈型號
dadeng_kaow = [] #大燈靠位
dadeng_chuizpsfpj = [] #大燈垂直偏是否評價
cehua_sfecyb = [] #側滑是否二次儀表
cehua_sfsgd = [] #側滑是雙光電
shengji_sblx = [] #聲級設備類型
pingban_ttlx = [] #平板設備類型
zbzl_sblx = [] #整備質量設備類型
for i in range(0,int(rowNum)): #遍歷每一行
###車速
#車速板卡型號
if u'二次' in str(table.row_values(i)[6]):
chesu_bkxh.append(u'安車三代二次儀表')
if u'511' in str(table.row_values(i)[6]):
chesu_bkxh.append(u'安車編碼器')
if u'812' in str(table.row_values(i)[6]):
chesu_bkxh.append(u'數字量車速臺')
#車速參數:項目完成后過車
if str(table.row_values(i)[7]) == u'判斷過車':
chesu_sfgc.append(u'1')
if str(table.row_values(i)[7]) == u'不判斷過車':
chesu_sfgc.append(u'0')
#軸重(單獨輪重稱重用) #設備類型
if str(table.row_values(i)[9]) == u'二次儀表':
zhouz_bkxh.append(u'安車三代二次儀表')
if str(table.row_values(i)[9]) != u'二次儀表' and (str(table.row_values(i)[9]) == u'不判斷過車' or str(table.row_values(i)[9]) == u'判斷過車') :
zhouz_bkxh.append(u'模擬量臺體')
if str(table.row_values(i)[11]) == u'是' and (table.row_values(i)[12] ==u'普通滾筒' or table.row_values(i)[12] ==u'加載臺'):
guntzd_sfecyb.append(u'安車三代儀表') #制動臺設備類型
if str(table.row_values(i)[11]) != u'是' and (table.row_values(i)[12] ==u'普通滾筒' or table.row_values(i)[12] ==u'加載臺'):
guntzd_sfecyb.append(u'模擬量臺體')
if u'軸重制動分離臺' in str(table.row_values(i)[13]):
guntzd_ttlx.append(u'軸重制動分離臺')
if u'軸重制動復合臺' in str(table.row_values(i)[13]): #臺體類型
guntzd_ttlx.append(u'軸重制動復合臺')
if table.row_values(i)[12] ==u'普通滾筒' or table.row_values(i)[12] ==u'加載臺':
guntzd_czfs.append(table.row_values(i)[14])
#過車式(后臺模擬量軸重)
#先稱重定位式
#駐車式稱重(軸重制動輪換)
#后稱重
#駐車式(溫州江興串口軸重)
#不稱重
#過車式稱重(軸重制動輪換)
#先稱重過車式(模擬量軸重有提示) str()
#底檢設備類型
if table.row_values(i)[16] !='' and str(table.row_values(i)[16]) != u'底檢設備類型':
if u'UDP' or u'udp' not in str(table.row_values(i)[16]): # or u'udp' not in str(table.row_values(i)[16])) :
jingt_sblx.append(table.row_values(i)[16])
else:
jingt_sblx.append(u'UDP廣播接收端')
# if table.row_values(i)[16] !='' and str(table.row_values(i)[16]) != u'底檢設備類型' and u'UDP' in str(table.row_values(i)[16]) :
# jingt_sblx.append(u'UDP廣播接收端')
# if table.row_values(i)[16] !='' and str(table.row_values(i)[16]) != u'底檢設備類型' and u'udp' in str(table.row_values(i)[16]) :
# jingt_sblx.append(u'UDP廣播接收端')
if u'人工手動輸入' in str(table.row_values(i)[16]):
jingt_sblx.append(u'人工手動輸入(21861-2014)')
#大燈
if table.row_values(i)[18] !='' and str(table.row_values(i)[18]) != u'大燈' and str(table.row_values(i)[18]) != u'型號' :
dadeng_sbxh.append(table.row_values(i)[18])
if u'左靠位' in str( table.row_values(i)[19]):
dadeng_kaow.append('1')
if u'右靠位' in str( table.row_values(i)[19]):
dadeng_kaow.append('0')
if u'垂直偏計入總評' in str(table.row_values(i)[20]):
dadeng_chuizpsfpj.append('3')
if u'垂直偏不計入總評' in str(table.row_values(i)[20]):
dadeng_chuizpsfpj.append('0')
#側滑
if str(table.row_values(i)[21]) == u'是' and (table.row_values(i)[22] == u'否' or table.row_values(i)[22] == u'是'):
cehua_sfecyb.append(u'安車三代二次儀表')
if table.row_values(i)[21] != '是' and (table.row_values(i)[22] == u'否' or table.row_values(i)[22] == u'是'):
cehua_sfecyb.append(u'模擬量')
if str(table.row_values(i)[22]) == u'是' and table.row_values(i)[23] != '': #側滑是否雙光電 #是否是單個光電控制設備
cehua_sfsgd.append(u'0')
if str(table.row_values(i)[22]) == u'否' and table.row_values(i)[23] != '':
cehua_sfsgd.append(u'1')
#聲級
if table.row_values(i)[25] !='' and str(table.row_values(i)[25]) != u'聲級設備' and str(table.row_values(i)[25]) != u'類型' :
shengji_sblx.append(table.row_values(i)[25])
#整備質量
if table.row_values(i)[31] !='' and str(table.row_values(i)[31]) !=u'整備質量設備類型' and u'DS3' in str(table.row_values(i)[31]):
zbzl_sblx.append(u'XK3190-DS3讀庫')
if table.row_values(i)[31] !='' and str(table.row_values(i)[31]) !=u'整備質量設備類型' and u'DS10' in str(table.row_values(i)[31]):
zbzl_sblx.append(u'XK3190-DS10')
if table.row_values(i)[31] !='' and str(table.row_values(i)[31]) !=u'整備質量設備類型' and u'多軸輪重臺' in str(table.row_values(i)[31]):
zbzl_sblx.append(u'多軸輪重臺')
if table.row_values(i)[31] !='' and str(table.row_values(i)[31]) !=u'整備質量設備類型' :
zbzl_sblx.append(u'多軸輪重臺')
#判斷是否有外廓前后
if str(table.row_values(i)[30]) !=u'設備類型' and table.row_values(i)[30]!=u'' :
if u'是' in str(table.row_values(i)[29]) :
vars.put('wkqh' ,u'有外廓先后之分')
#平板
if u'平板臺' in str(table.row_values(i)[12]) :
if u'是' in str(table.row_values(i)[11]) :
pingban_ttlx.append(u'安車三代二次儀表')
else:
pingban_ttlx.append(u'模擬量臺體')
#####################################################################
A = 1
for i in chesu_bkxh:
vars.put("chesu_bkxh"+ str(A),i)
A = A + 1
B = 1
for i in chesu_sfgc:
vars.put("chesu_sfgc"+ str(B),i)
B = B + 1
C = 1
for i in zhouz_bkxh:
vars.put("zhouz_bkxh"+ str(C),i)
C = C + 1
D = 1
for i in zhouz_sfgc:
vars.put("zhouz_sfgc"+ str(D),i)
D = D + 1
E = 1
for i in guntzd_sfecyb:
#print(i)
vars.put("guntzd_sfecyb"+ str(E),i)
E = E + 1
F = 1
for i in guntzd_ttlx:
#print(i)
vars.put("guntzd_ttlx"+ str(F),i)
F = F + 1
G = 1
for i in guntzd_czfs:
#print(i)
vars.put("guntzd_czfs"+ str(G),i)
G = G + 1
H = 1
for i in jingt_sblx:
#print(i)
vars.put("jingt_sblx"+ str(H),i)
H = H + 1
I = 1
for i in dadeng_sfecyb:
#print(i)
vars.put("dadeng_sfecyb"+ str(I),i)
I = I + 1
J = 1
for i in dadeng_sbxh:
#print(i)
vars.put("dadeng_sbxh"+ str(J),i)
J = J + 1
K = 1
for i in dadeng_kaow:
#print(i)
vars.put("dadeng_kaow"+ str(K),i)
K = K + 1
L = 1
for i in dadeng_chuizpsfpj:
#print(i)
vars.put("dadeng_chuizpsfpj"+ str(L),i)
L = L + 1
M = 1
for i in cehua_sfecyb:
#print(i)
vars.put("cehua_sfecyb"+ str(M),i)
M = M + 1
N = 1
for i in cehua_sfsgd:
vars.put("cehua_sfsgd"+ str(N),i)
N = N + 1
O = 1
for i in shengji_sblx:
#print(i)
vars.put("shengji_sblx"+ str(O),i)
O = O + 1
Q = 1
for i in zbzl_sblx:
#print(i)
vars.put("zbzl_sblx"+ str(Q),i)
Q = Q + 1
R = 1
for i in pingban_ttlx:
#print(i)
vars.put("pingban_ttlx"+ str(R),i)
R = R + 1
####################################讀取第3頁的環保檢測線內容###################################
#1,先搞清楚有幾條線,直接使用環保批量添加
table2 = workbook.sheet_by_index(2)
#讀取第2行的數據并進行處理
HBlines=[] #將環保線都裝進來
xiangmus=[]
#這個sheet的總行數
#rowNum = table.nrows
#這個sheet的總列數
colNum = table2.ncols
for i in range(1,colNum): #遍歷每一行
if table2.row_values(1)[i] !='': #對列4判斷 # u就可以轉義中文
HBlines.append(table2.row_values(1)[i]) #將第2列的值插入到這個數組中,其實就是線名稱的數組
# xiangmus.append(table.row_values(i)[4]) #將第5列的值插入到這個數組中,其實就是檢測項目的數組
qyx = 0
cyx = 0
qchhx = 0
for i in HBlines:
print(i)
if i==u'汽油':
qyx = qyx + 1
if i == u'柴油':
cyx = cyx + 1
if i == u'汽柴混合':
qchhx = qchhx + 1
vars.put('qyx',str(qyx))
vars.put('cyx',str(cyx))
vars.put('qchhx',str(qchhx))
...