Excel处理——测试工程师Python开发实战(10)

发表于:2023-8-10 10:37

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:胡通    来源:51Testing软件测试网原创

#
Python
  4.6  Excel处理
  Python的xlsxwriter、xlwings、openpyxl、pandas等库都可以用于操作Excel,如表4-14所示。
表4-14  Python中用于操作Excel的常用库
  openpyxl是一款比较综合的工具,它不仅能够同时读取和修改Excel文件,而且可以详细设置Excel文件内的单元格,包括单元格样式等内容。它还支持图表插入、打印设置等内容。使用openpyxl可以读写xltm、xltx、xlsm、xlsx等类型的文件,且可以处理数据量较大的Excel文件,它的跨平台处理大量数据的能力是其他库没法相比的。因此,openpyxl成为处理Excel复杂问题的首选库。
  openpyxl是一个非标准库,需要自行安装,它的安装过程并不复杂,Windows或macOS用户均可以在命令行或终端中使用pip安装openpyxl,命令为pip install openpyxl。
  4.6.1  基本概念
  openpyxl中主要用到3个概念是Workbook、Sheet和Cell。Workbook是一个Excel工作簿(Excel文件);Sheet是工作簿中的一张表;Cell是一个简单的单元格。openpyxl就是围绕着这3个概念进行操作的,不论读写,操作步骤都是打开Workbook,定位Sheet,操作Cell。
  openpyxl中有3个不同层次的类,Workbook是对工作簿的抽象,Worksheet是对工作表的抽象,Cell是对单元格的抽象。这3个类中每一个类都包含很多属性和方法。
  1.Workbook对象
  一个Workbook对象表示一个Excel文件,在操作Excel之前,我们应该先创建一个Workbook对象。如果需要创建一个新的Excel文档,直接调用Workbook类即可;如果需要处理一个已经存在的Excel文件,可以使用openpyxl的load_workbook函数进行读操作。Workbook类和load_workbook函数相同,返回的都是一个Workbook对象。
  Workbook类有很多属性和方法,大部分方法都与表有关,如表4-15和表4-16所示。
表4-15  Workbook类的属性
表4-16  Workbook类的方法
  2.Worksheet对象
  我们可以通过Worksheet对象获取表的属性,得到单元格中的数据,修改表中的内容。openpyxl提供了非常灵活的方式来访问表中的单元格和数据,常用的Worksheet类的属性和方法如表4-17和表4-18所示。其中,行以数字1开始,列以字母A开始。
表4-17  Worksheet类的属性
表4-18  Worksheet类的方法
  3.Cell对象
  Cell对象比较简单,常用的属性如表4-19所示。Cell对象只存储两种数据类型——数字和字符串,除了纯数字,其他均为字符串类型。
表4-19  Cell常用属性
  如前文所述,一个Excel文件Workbook由一个或者多个工作表Worksheet组成,一个Worksheet可以看作由多个行row组成,也可以看作由多个列column组成,而每一行每一列都由多个单元格Cell组成。下面简要讲解一下如何读取和写入Excel。
  4.读取Excel
  读取Excel的方式有如下4种。
  (1)载入Excel:
from openpyxl import load_workbook
workbook = load_workbook(filename='测试.xlsx')
print(workbook.sheetnames)
  注意,load_workbook只能打开已经存在的Excel,不能创建新的Excel。
  (2)根据名称获取工作表:
from openpyxl import load_workbook
workbook = load_workbook(filename='其他.xlsx') 
print(workbook.sheetnames)
sheet = workbook['工作业务']
  (3)获取多个格子的值。Excel中每一列由字母确定,是字符型;每一行由一个数字确定,是整型。如果我们要输出每一个格子的值,那么需要遍历:
for cell in cells: 
    print(cell.value)
  (4)读取所有的行:
for row in sheet.rows: 
    print(row)
  5.Excel写入
  Excel写入的方式有如下两种。
  (1)保存Excel:
workbook.save(filename='Excel工作表1.xlsx')
  如果读取和写入Excel的路径相同则对原文件进行修改,如果读取和写入Excel的路径不同则保存成新的文件。
  (2)写入单元格:
cell = sheet['A1'] 
cell.value = '业务需求'
  Excel样式调整
  openpyxl处理Excel文件中的单元格样式,总共有6个属性类。分别是Font(字体类,可设置字号、字体颜色、下画线等)、PatternFill(填充类,可设置单元格填充颜色等)、Border(边框类,可以设置单元格各种类型的边框)、Alignment(位置类,可以设置单元格内数据各种对齐方式)。例如,通过语句From openpyxl.styles import PatternFill, Border, Side, Alignment, Protection, Font导入相应的库。
  4.6.2  封装示例
  openpyxl是读写Excel 2010的xlsx、xlsm、xltx、xltm格式文件的Python库,简单易用,功能广泛,单元格格式调整、图表处理、公式处理、筛选、批注、文件保护等功能应有尽有,图表处理功能是其一大亮点。
  openpyxl几乎可以实现所有的Excel功能,而且接口清晰,文档丰富,学习成本相对较低。封装一个可以读取任意Excel文件的方法,就可以指定读取的表单,当我们多次从Excel文件中读取数据时,不用重复地写代码,只需调用封装的类即可,如代码清单4-9所示。
# -*- coding: utf-8 -*-
# @Time : 2022/2/21 10:29 上午
# @Project : excelDemo
# @File : excelUtil.py
# @Author : hutong
# @Describe: 微信公众号:大话性能
# @Version: Python3.9.8
?
from openpyxl import load_workbook
from openpyxl.worksheet.worksheet import Worksheet
 
class ExcelHandler():
 '''
 操作Excel
 '''
 
 def __init__(self, file):
  '''初始化函数'''
  self.file = file
 
 def open_sheet(self, sheet_name) -> Worksheet:
  '''打开表单'''
  wb = load_workbook(self.file)
  sheet = wb[sheet_name]
  return sheet
 
 def read_header(self, sheet_name):
  '''获取表单的表头'''
  sheet = self.open_sheet(sheet_name)
  headers = []
  for i in sheet[1]:
   headers.append(i.value)
  return headers
 
 def read_rows(self,sheet_name):
  '''
  读取除表头外所有数据(除第一行外的所有数据)
  返回的内容是一个二维列表,若想获取每一行的数据,可使用for循环或使用*解包
  '''
  sheet = self.open_sheet(sheet_name)
  rows = list(sheet.rows)[1:]
 
  data = []
  for row in rows:
   row_data = []
   for cell in row:
    row_data.append(cell.value)
   data.append(row_data)
 
  return data
 
 def read_key_value(self,sheet_name):
  '''
  获取所有数据,且将表头中的内容与数据结合展示(以字典的形式)
  如:[
  {'序号':1,'会员卡号': '680021685898','机场名称':'上海机场'},
  {'序号':2,'会员卡号': '680021685899','机场名称':'广州机场'}
  ]
  '''
  sheet = self.open_sheet(sheet_name)
  rows = list(sheet.rows)
 
  # 获取标题
  data = []
  for row in rows[1:]:
   row_data = []
   for cell in row:
    row_data.append(cell.value)
    # 列表转换成字典,与表头内容一起使用zip函数进行打包
   data_dict = dict(zip(self.read_header(sheet_name),row_data))
   data.append(data_dict)
  return data
 
 @staticmethod
 def write_change(file,sheet_name,row,column,data):
  '''写入Excel数据'''
  wb = load_workbook(file)
  sheet = wb[sheet_name]
 
  # 修改单元格
  sheet.cell(row,column).value = data
  # 保存
  wb.save(file)
  # 关闭
  wb.close()
代码清单4-9  excelUtil
  写入Excel使用了静态方法,原因是读取文件无须保存。如果修改文件后没有保存,其他地方又调用了该方法,则会引起报错,所以每次修改Excel文件,都要进行保存。
版权声明:51Testing软件测试网获得作者授权连载本书部分章节。
任何个人或单位未获得明确的书面许可,不得对本文内容复制、转载或进行镜像,否则将追究法律责
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号