最近有一个需要做一个自动化,其中就需要读取表格的数据,亲们都知道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))
...
网友评论