平时在做自动化测试的时候,一直都是要求数据与业务逻辑分离。把测试数据都写在业务里面的话,比较混杂。为了方便管理测试数据,所以引入了python的一个扩展库–xlrd。该库使用简单,能满足自动化测试的数据分离的需求。

闲语少聊,我们直接来看,xlrd是如何完成数据读取的。

安装很简单,方式①:直接命令pip install xlrd;方式②:在Pycharm中直接安装即可。

  1. excel_object = xlrd.open_workbook(excel_path)
  1. sheet_object = excel_object.sheet_by_name(\'Sheet1\')
  1. print(excel_object.sheet_names())
  1. row_nrows = sheet_object.nrows
  1. col_ncols = sheet_object.ncols
  1. row_length = sheet_object.row_len(1)
  1. rows_cell_value = sheet_object.row_values(0)
  1. row_cell_value1 = sheet_object.cell_value(0, 0)# 坐标起始位从0开始
  2. 或者
  3. row_cell_value1 = sheet_object.cell(0, 0).value
  4. 或者
  5. row_cell_value1 = sheet_object.row(0)[0].value
  1. row_cell_value2 = sheet_object.cell_value(1, 3)
  1. cols_cell_value = sheet_object.col_values(3)

单元格类型区分为六类,读取单元格类型如下所示:

  1. 0 empty,1 string, 2 number, 3 date, 4 boolean, 5 error
  2. cell_value_type1 = sheet_object.cell_type(2, 0)
  3. 或者
  4. cell_value_type1 = sheet_object.cell(2, 0).value

我们来写个例子验证下这些命令,示例代码如下:

  1. \'\'\'
  2. @author: wenyihuqingjiu
  3. @project: Pytest_Auto_Test
  4. @file: demo
  5. @time: 2020-07-23 21:40
  6. @desc:
  7. \'\'\'
  8.  
  9. import xlrd
  10. import os
  11. current_path = os.path.dirname(__file__)
  12. excel_path = os.path.join(current_path, \'..\', \'file/excel/testcase.xlsx\')
  13. excel_object = xlrd.open_workbook(excel_path)
  14. sheet_object = excel_object.sheet_by_name(\'Sheet1\')
  15. # 获取第一行数据
  16. rows_cell_value = sheet_object.row_values(0)
  17. print(\'获取到的第一行数据为:\' + str(rows_cell_value))
  18. # 获取第一行、第一列单元格数据
  19. row_cell_value1 = sheet_object.cell_value(0, 0)
  20. print(\'获取坐标为第一行、第一列单元格的数据为:\' + row_cell_value1)
  21. # 获取第二行、第四列单元格数据
  22. row_cell_value2 = sheet_object.cell_value(1, 3)
  23. print(\'获取坐标为第二行、第四列单元格的数据为:\' + row_cell_value2)
  24. # 获取第四列数据
  25. cols_cell_value = sheet_object.col_values(3)
  26. print(\'获取第四列的数据为:\' + str(cols_cell_value))
  27. # 获取单元格类型
  28. # 0 empty,1 string, 2 number, 3 date, 4 boolean, 5 error
  29. cell_value_type1 = sheet_object.cell_type(2, 0)
  30. print(\'单元格类型为:\' + str(cell_value_type1))
  31. cell_value_type2 = sheet_object.cell_type(1, 0)
  32. print(\'单元格类型为:\' + str(cell_value_type2))
  33. cell_value_type3 = sheet_object.cell_type(1, 7)
  34. print(\'单元格类型为:\' + str(cell_value_type3))
  35. cell_value_type4 = sheet_object.cell_type(1, 8)
  36. print(\'单元格类型为:\' + str(cell_value_type4))
  37. cell_value_type5 = sheet_object.cell_type(2, 8)
  38. print(\'单元格类型为:\' + str(cell_value_type5))
  39. # 获取有效行数
  40. row_nrows = sheet_object.nrows
  41. print(\'当前sheet页中有效行数为:\' + str(row_nrows))
  42. # 获取有效列数
  43. col_ncols = sheet_object.ncols
  44. print(\'当前sheet页中有效列数为:\' + str(col_ncols))
  45. # 获取当前行的单元格长度
  46. row_length = sheet_object.row_len(0)
  47. print(\'第一行的有效单元格长度为:\' + str(row_length))
  48. # 获取所有工作表名称
  49. print(\'当前excel中的工作表名称为:\'+ str(excel_object.sheet_names()))

excel文档内容如下所示:

 执行代码,我们结合excel文档内容来对比看下输出结果,如下所示:

我们从上述简单的命令了解到,读取数据的方式其实很简单,代码中加上逻辑便可获取整个sheet页的数据,如下所示,获取当前sheet页的数据代码:

  1. # 获取有效行数
  2. row_index = sheet_object.nrows
  3. # 获取有效列数
  4. col_index = sheet_object.ncols
  5. # 定义空数组
  6. all_data_list = []
  7. # 获取首行数据
  8. first_row = sheet_object.row_values(0)
  9. for row in range(1, row_index):
  10. # 定义空列表
  11. row_dict = {}
  12. for col in range(col_index):
  13. c_cell = sheet_object.cell_value(row, col)
  14. # 循环每一个有效的单元格,将字段与值对应存储到字典中
  15. row_dict[first_row[col]] = c_cell
  16. # 再将字典追加到列表中
  17. all_data_list.append(row_dict)
  18. print(str(row_dict))

查看控制台,打印出来的数据如下所示:

excel文件内容还是如上截图,可以对比查看下。

  1. {\'模块\': \'搜索测试\', \'用例编号\': \'搜索测试01\', \'输入说明\': \'1.输入:\', \'操作输入值\': \'温一壶清酒 博客园\', \'按钮操作\': \'2.点击搜索按钮\', \'断言\': \'温一壶清酒 博客园_百度搜索\', \'预期值\': \'正确断言\', \'测试序号\': 1.0, \'\': 44035.0}
  2. {\'模块\': \'\', \'用例编号\': \'搜索测试02\', \'输入说明\': \'\', \'操作输入值\': \'温一壶清酒 抓包\', \'按钮操作\': \'\', \'断言\': \'\', \'预期值\': \'错误断言\', \'测试序号\': 2.0, \'\': 1}
  3. {\'模块\': \'\', \'用例编号\': \'搜索测试03\', \'输入说明\': \'\', \'操作输入值\': \'温一壶清酒 appium\', \'按钮操作\': \'\', \'断言\': \'温一壶清酒 博客园\', \'预期值\': \'\', \'测试序号\': 3.0, \'\': \'\'}

我们从上述的打印数据来看,细心的博友们应该发现问题了。

我们可以看出,合并单元格的数据,只有首个单元格有数据显示;单元格数据类型不正确。

今天,我们先来解决单元格数据类型显示不正确的问题。

解决该问题的方式很简单,就是将单元格类型获取后,判断单元格类型并转换格式,示例代码如下所示:

  1. \'\'\'
  2. @author: wenyihuqingjiu
  3. @project: Pytest_Auto_Test
  4. @file: demo
  5. @time: 2020-07-23 21:40
  6. @desc:
  7. \'\'\'
  8.  
  9. import xlrd
  10. import os
  11. import datetime
  12. from xlrd import xldate_as_tuple
  13. current_path = os.path.dirname(__file__)
  14. excel_path = os.path.join(current_path, \'..\', \'file/excel/testcase.xlsx\')
  15. excel_object = xlrd.open_workbook(excel_path)
  16. sheet_object = excel_object.sheet_by_name(\'Sheet1\')
  17. # 获取有效行数
  18. row_index = sheet_object.nrows
  19. # 获取有效列数
  20. col_index = sheet_object.ncols
  21. # 定义空数组
  22. all_data_list = []
  23. # 获取首行数据
  24. first_row = sheet_object.row_values(0)
  25. for row in range(1, row_index):
  26. # 定义空列表
  27. row_dict = {}
  28. for col in range(col_index):
  29. c_cell = sheet_object.cell_value(row, col)
  30. # 获取单元格数据类型
  31. c_type = sheet_object.cell(row, col).ctype
  32. if c_type == 2 and c_cell % 1 == 0: # 如果是整形
  33. c_cell = int(c_cell)
  34. elif c_type == 3:
  35. # 转成datetime对象
  36. date = datetime.datetime(*xldate_as_tuple(c_cell, 0))
  37. c_cell = date.strftime(\'%Y-%m-%d\')
  38. elif c_type == 4:
  39. c_cell = True if c_cell == 1 else False
  40. # 循环每一个有效的单元格,将字段与值对应存储到字典中
  41. row_dict[first_row[col]] = c_cell
  42. # 再将字典追加到列表中
  43. all_data_list.append(row_dict)
  44. print(str(row_dict))

运行代码,我们再来看下打印结果,如下所示:

  1. {\'模块\': \'搜索测试\', \'用例编号\': \'搜索测试01\', \'输入说明\': \'1.输入:\', \'操作输入值\': \'温一壶清酒 博客园\', \'按钮操作\': \'2.点击搜索按钮\', \'断言\': \'温一壶清酒 博客园_百度搜索\', \'预期值\': \'正确断言\', \'测试序号\': 1, \'\': \'2020-07-23\'}
  2. {\'模块\': \'\', \'用例编号\': \'搜索测试02\', \'输入说明\': \'\', \'操作输入值\': \'温一壶清酒 抓包\', \'按钮操作\': \'\', \'断言\': \'\', \'预期值\': \'错误断言\', \'测试序号\': 2, \'\': True}
  3. {\'模块\': \'\', \'用例编号\': \'搜索测试03\', \'输入说明\': \'\', \'操作输入值\': \'温一壶清酒 appium\', \'按钮操作\': \'\', \'断言\': \'温一壶清酒 博客园\', \'预期值\': \'\', \'测试序号\': 3, \'\': \'\'}

格式转换后,数据就打印正常了,数据类型错误的问题就解决了。

好了,今天的分享就到此结束啦,希望对博友们有帮助,下期分享获取合并单元格数据问题,敬请期待。

版权声明:本文为hong-fithing原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/hong-fithing/p/13348137.html