用python操作Excel表格(自动化办公)!

news2024/11/13 21:49:01

文章开始前打个小广告——分享一份Python学习大礼包(激活码+安装包、Python web开发,Python爬虫,Python数据分析,人工智能、自动化办公等学习教程)点击领取,100%免费!

一、openpyxl介绍安装

1.为什么要学Excel

存测试数据

有时候有大批量的数据,存到TXT文件里面显然不是最佳的方式,我们可以存到Excel里面去,第一方便我们存数据和做数据,另一方面方便我们读取数据,比较明朗。测试的时候就从数据库中读取出来,这点是非常重要的。

存测试结果

可以批量把结果存入到Excel中,也是比较好整理数据点,比我们的TXT要好。

2.安装openpyxl

python中与excel操作相关的模块:

  • xlrd库:从excel中读取数据,支持xls、xlsx
  • xlwt库:对excel进行修改操作,不支持对xlsx格式的修改
  • xlutils库:在xlw和xlrd中,对一个已存在的文件进行修改。
  • openpyxl:主要针对xlsx格式的excel进行读取和编辑。

安装方式:pip install openpyxl

3.Excel中的三大对象

  • WorkBook:工作簿对象
  • Sheet:表单对象
  • Cell:表格对象

二、openpyxl对Excel的操作

  • 创建一个工作薄:wb = openpyxl.Workbook()
  • 新增一个sheet表单:wb.create_sheet(‘test_case’)
  • 保存case.xlsx文件:wb.save(‘cases.xlsx’)
  • 打开工作簿:wb = openpyxl.load_workbook(‘cases.xlsx’)
  • 选取表单:sh = wb[‘Sheet1’
  • 读取第一行、第一列的数据:ce = sh.cell(row = 1,column = 1)
  • 按行读取数据:row_data = list(sh.rows)
  • 关闭工作薄:wb.close()
  • 按列读取数据:columns_data = list(sh.columns)
  • 写入数据之前,该文件一定要处于关闭状态
  • 写入第一行、第四列的数据 value = ‘result’:sh.cell(row = 1,column = 4,value = ‘result’)
  • 获取最大行总数、最大列总数:sh.max_row、sh.max_column
  • del 删除表单的用法:del wb[‘sheet_name’]
  • remove 删除表单的用法:sh = wb[‘sheet_name’] wb.remove(sh)
import openpyxl
# 创建一个工作簿
wb = openpyxl.Workbook()
# 创建一个test_case的sheet表单
wb.create_sheet('test_case')
# 保存为一个xlsx格式的文件
wb.save('cases.xlsx')
# 读取excel中的数据
# 第一步:打开工作簿
wb = openpyxl.load_workbook('cases.xlsx')
# 第二步:选取表单
sh = wb['Sheet1']
# 第三步:读取数据
# 参数 row:行  column:列
ce = sh.cell(row = 1,column = 1)   # 读取第一行,第一列的数据
print(ce.value)
# 按行读取数据 list(sh.rows)
print(list(sh.rows)[1:])     # 按行读取数据,去掉第一行的表头信息数据
for cases in list(sh.rows)[1:]:
    case_id =  cases[0].value
    case_excepted = cases[1].value
    case_data = cases[2].value
    print(case_excepted,case_data)
# 关闭工作薄
wb.close()

三.封装一个读取用例的excel类:用来实现读取数据和写入数据的功能

cases.xlsx的测试数据:

1.按行读取数据,存储在列表中


import openpyxl
class Case: #这个类用来存储用例的
    __slots__ = [] #特殊的类属性,可以用来限制这个类创建的实例属性添加 可写可不写
    pass

class ReadExcel(object): #读取excel数据的类
    def __init__(self,file_name,sheet_name):
        """
        这个是用来初始化读取对象的
        :param file_name: 文件名 ---> str类型
        :param sheet_name: 表单名 ———> str类型
        """
        # 打开文件
        self.wb = openpyxl.load_workbook(file_name)
        # 选择表单
        self.sh = self.wb[sheet_name]
    def read_data_line(self):
        #按行读取数据转化为列表
        rows_data = list(self.sh.rows)
        # print(rows_data)
        # 获取表单的表头信息
        titles = []
        for title in rows_data[0]:
            titles.append(title.value)
        # print(titles)
        #定义一个空列表用来存储测试用例
        cases = []
        for case in rows_data[1:]:
            # print(case)
            data = []
            for cell in case: #获取一条测试用例数据
                # print(cell.value)
                data.append(cell.value)
                # print(data)
                #判断该单元格是否为字符串,如果是字符串类型则需要使用eval();如果不是字符串类型则不需要使用eval()
                if isinstance(cell.value,str):
                    data.append(eval(cell.value))
                else:
                    data.append(cell.value)
                #将该条数据存放至cases中
            # print(dict(list(zip(titles,data))))
                case_data = dict(list(zip(titles,data)))
                cases.append(case_data)
        return cases
if __name__ == '__main__':
    r = ReadExcel('cases.xlsx','Sheet1')
    data1 = r.read_data_line()
    print(data1)

2.按行读取数据,存储在对象中

import openpyxl
class Case:
    pass
class ReadExcel(object):
    def __init__(self,filename,sheetname):
        self.wb = openpyxl.load_workbook(filename)
        self.sh = self.wb[sheetname]
    def read_data_obj(self):
        """
        按行读取数据  每条用例存储在一个对象中
        :return:
        """
        rows_data = list(self.sh.rows)
        # print(rows_data)
        # 获取表单的表头信息
        titles = []
        for title in rows_data[0]:
            titles.append(title.value)
        # print(titles)
        # 定义一个空列表用来存储测试用例
        cases = []
        for case in rows_data[1:]:
            # print(case)
            #创建一个Case类的对象,用来保存用例数据
            case_obj = Case()
            data = []
            for cell in case:  # 获取一条测试用例数据
                # print(cell.value)
                # data.append(cell.value)
                # print(data)
                if isinstance(cell.value,str):  # 判断该单元格是否为字符串,如果是字符串类型则需要使用eval();如果不是字符串类型则不需要使用eval()
                    data.append(eval(cell.value))
                else:
                    data.append(cell.value)
            # 将该条数据存放至cases中
            # print(dict(list(zip(titles,data))))
            case_data = list(zip(titles, data))
            # print(case_data)
            for i in case_data:
                setattr(case_obj,i[0],i[1])
            # print(case_obj)
            # print(case_obj.case_id,case_obj.data,case_obj.excepted)
            cases.append(case_obj)
        return cases
if  __name__ == '__main__':
    r = ReadExcel('cases.xlsx','Sheet1')
    res = r.read_data_obj()
    for i in res:
        print(i.caseid, i.excepted, i.data)

3.将测试用例封装到列表中,读取指定列的数据

import openpyxl
class Case:
    pass
class ReadExcelZy(object):
    def __init__(self,filename,sheetname):
        self.wb = openpyxl.load_workbook(filename)
        self.sheet = self.wb[sheetname]
        # list1 参数为一个列表,传入的是指定读取数据的列,比如[1,2,3]
        # 每一行[1,3,5]列的数据,读取出来就作为一条测试用例,放在字典中
        # 所有的用例放在列表中并且进行返回
    def read_data(self,list1):
        """
        :param list1:  list--->要读取列   list类型
        :return:    返回一个列表,每一个元素为一个用例(用例为dict类型)
        """
        # 获取最大的行数
        max_r = self.sheet.max_row
        cases = []   #定义一个空列表,用来存放所有的用例数据
        titles = []   #定义一个空列表,用来存放表头
        # 遍历所有的行数据
        for row in range(1,max_r+1):
            if row != 1:      #判断是否是第一行
                case_data = [] #定义一个空列表,用来存放该行的用例数据
                for column in list1:
                    info = self.sheet.cell(row,column).value
                    # print(info)
                    case_data.append(info)
                    # print(list(zip(titles,case_data)))
                case = dict(zip(titles,case_data))  #将该条数据和表头进行打包组合,作用相当于dict(list(zip(titles,case_data)))
                # print(case)
                cases.append(case)
                # print(cases)
            else:   #获取表头数据
                for column in list1:
                    title = self.sheet.cell(row,column).value
                    titles.append(title)
                # print(titles)
        return cases
if __name__ == '__main__':
    r = ReadExcelZy("cases.xlsx","Sheet1")
    res = r.read_data([1,2,3])
    for o in res:
        print(o['caseid'],o['data'],o['excepted'])

4.将测试用例封装到对象中,读取指定列的数据

import openpyxl
class Case:
    pass
class ReadExcelZy(object):
    def __init__(self,filename,sheetname):
        self.wb = openpyxl.load_workbook(filename)
        self.sheet = self.wb[sheetname]

        # list1 参数为一个列表,传入的是指定读取数据的列,比如[1,2,3]
        # 每一行[1,3,5]列的数据,读取出来就作为一条测试用例,放在字典中
        # 所有的用例放在对象中并且进行返回
    def read_data_obj(self,list2):
        max_r1 = self.sheet.max_row      #获取最大行数
        cases = []
        titles = []      #用来存放表头数据
        for row in range(1,max_r1+1):
            if row != 1:
                case_data = []
                for column in list2:
                    info = self.sheet.cell(row,column).value
                    # print(info)
                    case_data.append(info)
                cases_data = list(zip(titles,case_data))
                #将一条用例存到一个对象中(每一列对应对象的一个属性)
                case_obj = Case()
                for i in cases_data:
                    # print(i)
                    setattr(case_obj,i[0],i[1])
                # print(case_obj.caseid,case_obj.excepted,case_obj.data)
                cases.append(case_obj)
            else:
                for column in list2:
                    title = self.sheet.cell(row,column).value
                    titles.append(title)
        return cases
if __name__ == '__main__':
    r = ReadExcelZy("cases.xlsx","Sheet1")
    res = r.read_data_obj([1,2,3])
    for i in res:
        print(i.caseid,i.data,i.excepted)

5.优化第4部分代码,将设置对象属性写在初始化方法中(封装Excel类读取数据最常用的方法)

import openpyxl
class Case:  # 这个类用来存储用例的
    def __init__(self, attrs):
        """
        初始化用例
        :param attrs:zip类型——>[{key,value},(key1,value1)......]
        """
        for i in attrs:
            setattr(self, i[0], i[1])
class ReadExcel(object):
    def __init__(self, filename, sheetname):
        """
        定义需要打开的文件及表名
        :param filename:   文件名
        :param sheetname:  表名
        """
        self.wb = openpyxl.load_workbook(filename)
        self.sheet = self.wb[sheetname]
    def read_data_obj_new(self, list2):
        # 获取最大行数
        max_r1 = self.sheet.max_row
        cases = []
        # 用来存放表头数据
        titles = []
        for row in range(1, max_r1 + 1):
            if row != 1:
                case_data = []
                for column in list2:
                    info = self.sheet.cell(row, column).value
                    # print(info)
                    case_data.append(info)
                case = list(zip(titles, case_data))
                # 新建对象时,将对象传给Case类
                case_obj = Case(case)
                # print(case_obj.caseid,case_obj.excepted,case_obj.data)
                cases.append(case_obj)
            else:
                # 获取表头
                for column in list2:
                    title = self.sheet.cell(row, column).value
                    titles.append(title)
                if None in titles:
                    raise ValueError("传入的表头的数据有显示为空")
        return cases
if __name__ == '__main__':
    r = ReadExcel('cases.xlsx', 'Sheet1')
    res1 = r.read_data_obj_new([1, 2, 3])
    for i in res1:
        print(i.caseid, i.data, i.excepted)

三.完整流程的代码

一、将测试数据参数化

import unittest
from python.register_new.register import register
from python.register_new.register_testcase_new import RegisterTestCase
from HTMLTestRunnerNew import HTMLTestRunner
class RegisterTestCase(unittest.TestCase):
    # 初始化测试用例
    def __init__(self,modethod_name,excepted,data):
        # modethod_name 测试用例方法名
        super().__init__(modethod_name)
        # excepted 测试用例的预期结果
        self.excepted = excepted
        # data 测试用例参数值
        self.data = data

    def setUp(self):
        print("准备测试环境,执行测试用例之前会执行此操作")

    def tearDown(self):
        print("还原测试环境,执行完测试用例之后会执行此操作")

    def test_register(self):
        res = register(*self.data)
        try:
            self.assertEquals(self.excepted,res)
        except AssertionError as e:
            print("该条测试用例执行未通通过")
            raise e
        else:
            print("该条测试用例执行通过")

# 创建测试套件
suite = unittest.TestSuite()

# 将测试用例添加至测试套件中
case = [{'excepted':'{"code": 1, "msg": "注册成功"}','data':'('python1', '123456','123456')'},
        {'excepted':'{"code": 0, "msg": "两次密码不一致"}','data':'('python1', '1234567','123456')'}]
for case in cases:
    suite.addTest(RegisterTestCase('test_register',case['excepted'],case['data']))

# 执行测试套件,生成测试报告
with open("report.html",'wb') as f:
    runner = HTMLTestRunner(
        stream = f,
        verbosity = 2,
        title = 'python_test_report',
        description = '这是一份测试报告',
        tester = 'WL'
    )
    runner.run(suite)

二.将调用封装好的Excel类的完整代码流程


import unittest
from python.register_new.register import register
from python.register_new.register_testcase_new import RegisterTestCase
from HTMLTestRunnerNew import HTMLTestRunner
from python.readexcel import ReadExcel


class RegisterTestCase(unittest.TestCase):
    # 初始化测试用例
    def __init__(self, modethod_name, excepted, data):
        # modethod_name 测试用例方法名
        super().__init__(modethod_name)
        # excepted 测试用例的预期结果
        self.excepted = excepted
        # data 测试用例参数值
        self.data = data

    def setUp(self):
        print("准备测试环境,执行测试用例之前会执行此操作")

    def tearDown(self):
        print("还原测试环境,执行完测试用例之后会执行此操作")

    def test_register(self):
        res = register(*self.data)
        try:
            self.assertEquals(self.excepted, res)
        except AssertionError as e:
            print("该条测试用例执行未通通过")
            raise e
        else:
            print("该条测试用例执行通过")


# 创建测试套件
suite = unittest.TestSuite()
# 调用封装好的读取数据的Excel类,获取测试数据
r1 = ReadExcel('cases.xlsx', 'Sheet1')
cases = r1.read_data_obj_new([2, 3])
# 将测试用例添加至测试套件中
for case in cases:
    # 需要使用eval()函数对except和data进行自动识别
    suite.addTest(RegisterTestCase('test_register', eval(case.excepted), eval(case.data)))
# 执行测试套件,生成测试报告
with open("report.html", 'wb') as f:
    runner = HTMLTestRunner(
        stream=f,
        verbosity=2,
        title='python_test_report',
        description='这是一份测试报告',
        tester='WL')
    runner.run(suite)

关于Python技能储备!

如果你是准备学习Python或者正在学习(想通过Python兼职),下面这些你应该能用得上:
【点击这里】领取!
包括:激活码+安装包、Python web开发,Python爬虫,Python数据分析,人工智能、自动化办公等学习教程。带你从零基础系统性的学好Python!
Python所有方向的学习路线图,清楚各个方向要学什么东西
100多节Python课程视频,涵盖必备基础、爬虫和数据分析
100多个Python实战案例,学习不再是只会理论
华为出品独家Python漫画教程,手机也能学习
历年互联网企业Python面试真题,复习时非常方便
****

在这里插入图片描述

在这里插入图片描述

以上就是本次分享的全部内容。我们下期见~

End

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2135130.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

影刀RPA:考勤自动打卡小程序

上班族,最惊心动魄的一件事,是什么,当然是:打卡 即使你在智能手机上设置提醒,比如闹钟或者日历事件,提醒自己按时打卡,但依然会忘记 即使公司很开明,使用的考勤系统支持可以设置自…

五大注入攻击网络安全类型介绍

1. SQL注入(SQL Injection) SQL注入流程 1.1. 概述 SQL注入是最常见的注入攻击类型之一,攻击者通过在输入字段中插入恶意的SQL代码来改变原本的SQL逻辑或执行额外的SQL语句,来操控数据库执行未授权的操作(如拖库、获取…

不可思议!这7个反共识设计原则,正悄然改变AI应用的未来格局!

引言 在AI技术日益成熟的今天,如何设计出既符合用户需求又具备高度智能化的原生应用,成为摆在开发者面前的重要课题。然而,传统的应用设计思维往往限制了AI潜力的充分发挥。本文提出的七个反共识观点,旨在挑战传统观念&#xff0…

如何优雅的使用 Nacos

简介 问题描述:Nacos 在某一版本后,Spring 官方不再对 Nacos 作版本适配,导致在使用配置中心时,无法导入配置 如何解决:使用 https://start.aliyun.com/ 问题复现 如何解决 新建模块时将服务器 URL 修改为 https://…

UE4_后期处理六—复古电视效果

效果图: 步骤: 1、让场景颜色与复古色相混合,采用强光混合模式,蓝图连接如下图: 效果图如下: 2、把上一章的扫描线效果拿过来,看看扫描线的蓝图节点: 效果图如下: 此效果…

数据为翼,智控未来:EasyCVR视频监控汇聚平台助力城市精准管理

在数字化浪潮席卷全球的今天,智慧城市的概念已不再遥不可及,而是逐步成为现代城市发展的核心驱动力。作为智慧城市的重要组成部分,视频监控系统正以前所未有的速度和规模覆盖城市的每一个角落,成为城市管理者手中的“千里眼”和“…

SOLIDWORKS链阵列功能详解—快速设计链条

在工业产品的设计中,链传动是一种广泛应用的技术,无论是在传送带还是自行车上都能见到它的身影。作为工程师,在进行SOLIDWORKS设计时需要关注产品的整体结构,检查机构运动的合理性,考虑生产成本。 那么如何实现链条的…

学习使用LangGraph x GPT-Researcher构建一个多智能体架构的AI自主研究助理

原文:学习使用LangGraph x GPT-Researcher构建一个多智能体架构的AI自主研究助理 - 百度智能云千帆社区 本文为大家剖析一个通过多智能体协作来完成的AI研究助理,可以用来帮助进行各种综合的在线研究任务并输出报告。该应用基于LangGraph以及开源的GPT-…

【吊打面试官系列-Redis面试题】如果有大量的 key 需要设置同一时间过期,一般需要注意什么?

大家好,我是锋哥。今天分享关于【如果有大量的 key 需要设置同一时间过期,一般需要注意什么?】面试题,希望对大家有帮助; 如果有大量的 key 需要设置同一时间过期,一般需要注意什么? 如果大量的…

19. 删除链表的倒数第 N 个结点【 力扣(LeetCode) 】

零、LeetCode 原题 19. 删除链表的倒数第 N 个结点 一、题目描述 给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。 进阶:你能尝试使用一趟扫描实现吗? 二、测试用例 示例 1: 输入:hea…

【数据结构与算法 | 灵神题单 | 分治(链表)篇】力扣148

1. 力扣148:排序链表 1.1 题目: 给你链表的头结点 head ,请将其按 升序 排列并返回 排序后的链表 。 示例 1: 输入:head [4,2,1,3] 输出:[1,2,3,4]示例 2: 输入:head [-1,5,3,4…

【C++算法】二分查找

二分查找 题目链接 二分查找https://leetcode.cn/problems/binary-search/ 算法原理 代码步骤 代码展示 class Solution { public:int search(vector<int>& nums, int target) {int left 0, right nums.size() - 1;while(left < right){// 防止溢出int mid …

AI周报(9.8-9.14)

AI应用-NEKO Health用AI颠覆体检 Neko Health 由 Spotify 创始人丹尼尔埃克和哈亚尔马尔尼尔森共同创立&#xff0c;致力于通过每年的全身扫描和由 AI 驱动的洞察力来改善预防性医疗保健&#xff0c;能够检测诸如心脏病和皮肤癌等疾病。 该公司通过使用人工智能软件支持的全身…

Docker:对已有的容器,对当前容器映射的端口实时 (增删改查)

首先我的docker已经起了一个容器&#xff0c;我突然想把他的80->80映射的端口改成80->8080 但是我不想去新启动容器&#xff0c;想在现有容器基础上去修改&#xff0c;或者我想删除某个端口映射&#xff08;只是大概思路&#xff09; 如何寻找容器配置文件位置 首先我这…

【运维平台】WGCLOUD是如何判定主机下线的

只要被控主机的agent超过5分钟没有上报监测数据&#xff0c;系统就会判定该主机下线 这里的5分钟是默认的判定时间&#xff0c;如果agent上报时间是1分钟&#xff0c;那么agent超过1分钟没有上报数据&#xff0c;就会判定下线

优化IDEA卡顿,提示慢的问题,亲测有效!

1、优化JVM的参数 以下文件在idea安装目录的idea64.exe.vmoptions文件中。 一般来说我们只需要调整-Xms、-Xmx、-XX:ReservedCodeCacheSize三个即可&#xff0c;根据电脑的实际内存去调&#xff0c;我的电脑是48G内存&#xff0c;调到了 -Xms4096m (堆初始内存大小) -Xmx8192m…

多线程学习篇二:Thread常见方法

1. 常见方法 方法名 static 功能说明 注意点 start() 启动一个新线程&#xff0c;在新线程里面运行run方法 start 方法只是让线程进入就绪&#xff0c;里面代码不一定立刻运行(CPU 的时间片还没分给它)。每个线程对象的 start 方法只能调用一次&#xff0c;如果调用了多…

man命令详解

一、man命令简介&#xff1a; man是manual的缩写。操作手册之意。 本地的帮助文档称为man pages&#xff0c;这些操作手册随着软件安装而安装到本地&#xff0c;可以使用man命令进行查询。 随着软件包的安装有些操作手册会以文档的方式放在/usr/share/doc目录当中。…

初识HTTP

1、请求头中存储的是该请求的一些主要说明 accept:浏览器通过这个头告诉服务器&#xff0c;它所支持的数据类型 Accept-Charset:浏览器通过这个头告诉服务器&#xff0c;它支持哪种字符集 Accept-Encoding:浏览器通过这个头告诉服务器&#xff0c;支持的压缩格式 Accept-Lan…

微信这些危险设置一定要关!

你有仔细研究你的微信吗&#xff1f; 用了这么久的微信&#xff0c;才知道 有这么几个设置需要及时关闭&#xff01; 逐个操作更安心1️⃣取消不常用的免密支付和自动续费 我>服务>钱包>底部 支付设置>免密支付/自动续费2️⃣取消对附近陌生人授权位置 2️⃣取消对…