前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >openpyxl | Python操作Excel利器

openpyxl | Python操作Excel利器

作者头像
测试邦
修改于 2019-08-24 14:46:21
修改于 2019-08-24 14:46:21
2.2K00
代码可运行
举报
文章被收录于专栏:测试邦测试邦
运行总次数:0
代码可运行

Python-openpyxl操作生成Excel

初识

安装

pip install openpyxl

逻辑

一个excel文档就是一个工作簿 Workbook,每个工作簿对应可以有很多个表格sheet,每个表格页,由单元格组成。openpyxl通过操作这三个层级,完成对excel的操作。

工作簿:

表格页:

单元格:

基本用法

创建工作簿 Workbook

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
from openpyxl import Workbook

#创建一个工作簿对象
workbook = Workbook()
#保存这个工作簿,命名为test
workbook.save('test.xlsx')

打开现有工作簿

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
from openpyxl  import load_workbook
#打开当前路径下的test表格
workbook = load_workbook('test.xlsx')

创建表

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
from openpyxl  import load_workbook
#打开当前路径下的test表格
workbook = load_workbook('test.xlsx')
#创建一个名字叫sheet的表格
sheet = wb.create_sheet('test.xlsx')
#任何操作都需要保存
workbook.save('test.xlsx')

选择现有的表

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
from openpyxl  import load_workbook
#打开当前路径下的test表格
workbook = load_workbook('test.xlsx')
#选择名字为first_sheet的表格页
sheet = workbook['first_sheet']

删除表

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
from openpyxl  import load_workbook
#打开当前路径下的test表格
workbook = load_workbook('test.xlsx')
#选择名字为first_sheet的表格页
sheet = workbook['first_sheet']
#删除这张表
workbook.remove(sheet)

访问单元格

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#方法1
cell1 = sheet['A1']
#方法2
cell2 = sheet.cell(row=1,column=2)

#设置单元格的值
cell1.value = '123456'

#合并A1A2单元格
sheet.merge_cells('A1:A2')

可以关注下测试公众号再继续阅读哦~

高级用法

设置表格样式

先设置表格的样式模板

再将模板赋予需要更改样式的单元格

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
from openpyxl.styles import *

#先设置表格的样式模板,再将模板赋予需要更改样式的单元格
#设置样式模板,这里只列举一部分常用的样式
#表格边缘线的样式,thin表示有框线,框线颜色为黑色
thin = Side(border_style="thin", color="000000")
#设置表格上下左右都有黑色框线样式
all_border = Border(top=thin, left=thin, right=thin, bottom=thin)
#设置字体样式,设置字体为 微软雅黑,单下划线,颜色为蓝色,字体加粗
yahei_font_u = Font(name=u'微软雅黑',underline='single',color='0000FF',bold=True)
#设置背景颜色,设置充满方式为充满,颜色为黄色
yellow_fill = PatternFill(fill_type='solid',fgColor='FFD700')
#设置字体在表格中的位置,设置字体为上下区中,字符长度超过表格宽度时自动换行
alignment_wrap_content = Alignment(wrap_text=True,horizontal='center',vertical='center')

#设置完成后,改变单元格样式,这样这个单元格的样式就更改为模板的样式了
cell = sheet.row(row=1,column=2)
cell.fill = self.yellow_fill
cell.font = self.yahei_font_u
cell.border = self.all_border
cell.alignment = self.alignment_wrap_content

#如果要设置的单元格为合并后的,那么多个单元格样式都要设置

隐藏和折叠

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#隐藏第二行
sheet.row_dimensions[2].hidden=1
#折叠第2行到第5行
sheet.row_dimensions.group(2,5,hidden=True)

设置超链接

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#设置这个单元格的超链接为 跳转到 test工作簿 Sheet表格的 A1单元格
cell.hyperlink = 'test.xlsx#Sheet!A1'

实战

原始数据

转换效果

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
from openpyxl import *
from openpyxl.styles import *

class MakeExcel():

    def __init__(self):
        self.dict = {
        '英雄联盟': 'https://lol.qq.com/main.shtml',
        '地下城与勇士': 'https://dnf.qq.com/?ADTAG=media.innerenter.gamecom.navigation',
        '使命召唤Online': 'https://codol.qq.com/?ADTAG=media.innerenter.gamecom.navigation',
        '疾风之刃': 'https://jf.qq.com/?ADTAG=media.innerenter.gamecom.navigation',
        '冒险岛2':'https://mxd2.qq.com/?ADTAG=media.innerenter.gamecom.navigation',
        '天涯明月刀':'https://wuxia.qq.com/?ADTAG=media.innerenter.gamecom.navigation',
        '御龙在天': 'https://yl.qq.com/?ADTAG=media.innerenter.gamecom.navigation',
        '剑灵': 'https://bns.qq.com/?ADTAG=media.innerenter.gamecom.navigation',
        '流放之路': 'https://poe.qq.com/?ADTAG=media.innerenter.gamecom.navigation',
        '轩辕传奇2':  'https://xy2.qq.com/?ADTAG=media.innerenter.gamecom.navigation',
        '斗战神':  'https://dzs.qq.com/?ADTAG=media.innerenter.gamecom.navigation',
        'QQ三国': 'https://sg.qq.com/web201706/index.shtml?ADTAG=media.innerenter.gamecom.navigation',
        }
        self.excel_template()
        self.make()

    #表格样式模板
    def excel_template(self):

        # 表格边缘线的样式,thin表示有框线,框线颜色为黑色
        self.thin = Side(border_style="thin", color="000000")

        # 设置表格上下左右都有黑色框线样式
        self.all_border = Border(top=self.thin, left=self.thin, right=self.thin, bottom=self.thin)

        # 设置普通字体样式
        self.yahei_normal = Font(name=u'微软雅黑')

        #设置标题字体样式
        self.yahei_title = Font(name=u'微软雅黑',bold=True)

        # 设置链接字体样式,设置字体为 微软雅黑,单下划线,颜色为蓝色
        self.yahei_u = Font(name=u'微软雅黑', underline='single', color='0000FF')

        # 设置背景颜色,设置充满方式为充满,颜色为黄色
        self.yellow_fill = PatternFill(fill_type='solid', fgColor='FFD700')

        # 设置字体在表格中的位置,设置字体为上下区中,字符长度超过表格宽度时自动换行
        self.alignment_wrap = Alignment(wrap_text=True, horizontal='center', vertical='center')

    #设置表格样式,根据传入的样式设置传入的单元格对象的样式
    def make_cell_style(self,cell,style):

        #普通单元格样式
        if style == 'normal':
            cell.font = self.yahei_normal
            cell.border = self.all_border
            cell.alignment = self.alignment_wrap
        #标题单元格样式
        elif style == 'title':
            cell.fill = self.yellow_fill
            cell.font = self.yahei_title
            cell.border = self.all_border
            cell.alignment = self.alignment_wrap
        #地址单元格样式
        elif style == 'addr':
            cell.font = self.yahei_u
            cell.border = self.all_border
            cell.alignment = self.alignment_wrap

    #生成表格
    def make(self):
        #创建一个工作簿,选用Sheet这张表
        workbook = Workbook()
        sheet = workbook['Sheet']

        #设置标题的名称
        cell1 = sheet['A1']
        cell2 = sheet['B1']
        cell1.value = '名称'
        cell2.value = '地址'

        #设置列框
        sheet.column_dimensions['A'].width = 20.0
        sheet.column_dimensions['B'].width = 100.0

        #设置标题样式
        self.make_cell_style(cell1, 'title')
        self.make_cell_style(cell2, 'title')

        #设置游戏和地址的样式
        cur_row = 2
        for key in self.dict.keys():

            #设置名称和地址的值
            temp_cell_A = sheet.cell(row=cur_row, column=1)
            temp_cell_B = sheet.cell(row=cur_row, column=2)
            temp_cell_A.value = key
            temp_cell_B.value = self.dict[key]
            #设置地址超链接
            temp_cell_B.hyperlink = self.dict[key]
            #设置名称和地址的样式
            self.make_cell_style(temp_cell_A, 'normal')
            self.make_cell_style(temp_cell_B, 'addr')
            cur_row = cur_row + 1

        #从第六行开始折叠
        sheet.row_dimensions.group(6, cur_row, hidden=True)
        
        workbook.save('游戏.xlsx')

MakeExcel()往期好评
Gitlab 一个涵盖项目管理、代码仓库、持续集成的高可用系统基于docker容器技术的测试平台解决方案(dap)
谈谈测试服务化
Python简介及其环境搭建
基于puppeteer的前端性能测试解决方案
UnitTest:maven中使用Jacoco计算代码覆盖率
安全测试|移动端安全测试drozer
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-08-22,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 测试邦 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
[oeasy]python093_find方法_指数为负数_index_实际效果
负数索引 char_list = list("oeasy") char_list-1
oeasy
2025/05/14
670
[oeasy]python093_find方法_指数为负数_index_实际效果
[oeasy]python092_eval_衡量_转化为列表
绕道 s = "oeasy" char_list = list(s) char_list char_list2 = "A" char_list s = "" for c in char_list: s += c
oeasy
2025/04/27
470
[oeasy]python092_eval_衡量_转化为列表
[oeasy]085_列表_列表项的追加_append
list1 = ["刘备", "关羽", "张飞"] liubei = list1[0] # 获取索引为0的元素,即“刘备” print(liubei) # 输出: 刘备
oeasy
2025/04/08
640
[oeasy]085_列表_列表项的追加_append
[oeasy]python089_列表_删除列表项_remove_列表长度_len
clist = list("oeasy") clist clist.clear()
oeasy
2025/04/19
700
[oeasy]python089_列表_删除列表项_remove_列表长度_len
[oeasy]python0071_字符串类型_str_string_下标运算符_中括号
oeasy
2023/07/07
1710
[oeasy]python0071_字符串类型_str_string_下标运算符_中括号
[oeasy]python090_列表_构造_范围_range_start_end_step_步长
从空列表增加列表项 my_list = [] my_list.append(1) my_list.append(2) my_list.append(3) my_list
oeasy
2025/04/21
980
[oeasy]python090_列表_构造_范围_range_start_end_step_步长
[oeasy]python0045_四种进制_binary_octal_decimal_hexadecimal
四种进制回忆上次内容 上次研究了 通过 八进制数值 转义 \ooo把(ooo)8进制对应的ascii字符输出 转义序列 \n、\t 是 转义序列\xhh 也是 转义序列\ooo 还是 转义序列现在 总共有 几种进制 了呢?🤔先数一下 树数树树 就是这么多棵树用八进制的方式 数树八进制八根手指头 (13)8进制棵这是用 八根手指头 数的 如果换成 十根手指头呢?10进制用十根手指头数树 (11)10进制棵到底多少棵树?哪个才对呢? (13)8进制棵(11)10进制棵数树在不同进制下 有不同的数值都是正
oeasy
2023/01/12
2080
[oeasy]python0045_四种进制_binary_octal_decimal_hexadecimal
[oeasy]python086方法_method_函数_function_区别
[oeasy]python086方法_method_函数_function_区别 回忆
oeasy
2025/04/10
610
[oeasy]python086方法_method_函数_function_区别
[oeasy]python0015_十六进制_hexadecimal_字节形态_hex函数
​十六进制(hexadecimal)回忆上次内容上次数制可以转化bin(n)可以把数字转化为 ​​2进制​binary接收一个整数(int)得到一个二进制数形式的字符串​编辑数字在计算机中是用二进制存储的但是展示给我们的时候用的是十进制​编辑也就是0-9这10个字符的形式都说字节是计算机存储的最小单位这些数字在字节里面长什么样子呢?🤔字节首先明确字节长什么样子?​编辑1 个 字节(byte)正好 8 个 位(bit)​编辑如果我们用一个数字来表示一个字节的话需要表示[0,28-1]至少需要3
oeasy
2022/11/15
4870
[oeasy]python0015_十六进制_hexadecimal_字节形态_hex函数
[oeasy]python035_根据序号得到字符_chr函数_字符_character_
oeasy
2024/09/23
1110
[oeasy]python035_根据序号得到字符_chr函数_字符_character_
[oeasy]python0131_[趣味拓展]各种符号_汉语拼音符号_中文全角英文字母_中文全角标点
1.[á]/[â] 2.[ǎ] 3.[ā] 4.[a̖]/[ȁ] 5.[a̗] 6.[à] 总结
oeasy
2023/04/09
9730
[oeasy]python0131_[趣味拓展]各种符号_汉语拼音符号_中文全角英文字母_中文全角标点
[oeasy]python054_python有哪些关键字_keyword_list_列表_reserved_words
oeasy
2024/12/20
590
[oeasy]python054_python有哪些关键字_keyword_list_列表_reserved_words
[oeasy]python0014_二进制_binary_bin
​二进制(binary)回忆上次内容上次我们了解了​​ASCII​​码表​ASCII​​ 码表就是​​A​​merican ​​S​​tandard ​​C​​ode for ​​I​​nformation ​​I​​nterchange美国信息交换标准代码ASCII 码表范围​0x30-0x39​​ 这个范围是 ​​数字​数字的编码减去 ​​0x30​​ 正好得到数字本身​​0x41-0x5A​​ 这个范围是 ​​大​​ 写字母​​0x61-0x7A​​ 这个范围是 ​​小​​ 写字母​​0x20-0x7
oeasy
2022/11/13
4450
[oeasy]python0014_二进制_binary_bin
[oeasy]python0012_字符_character_chr函数_根据序号得到字符
​字符(character)回忆上次内容上次了解了ord函数这个函数可以通过字符得到序号那么可以反过来吗?通过序号得到字符可以吗?​编辑ord的逆运算chr有来就有回​编辑好像可以我们可以把 104 作为参数给到 函数chr()注意给的参数是数字 104而不是字符串"104"没有引号我们可以发现 ​​数字104​​ 和 ​​字符'h'​​ 是有关联的有两个单词了ordchr他们都是什么意思来着?🤔ord是ordinal 序号看一下帮助ordhelp(ord)​编辑看完之后可以q退回来​ord​​
oeasy
2022/11/09
3290
[oeasy]python0020换行字符_feed_line_lf_反斜杠n_B语言_安徒生童话
Basic Combined Programming Language(BCPL)
oeasy
2022/11/25
1.1K0
[oeasy]python0020换行字符_feed_line_lf_反斜杠n_B语言_安徒生童话
[oeasy]python078_字符串类型怎么用_str_string_下标运算符_中括号
oeasy
2025/03/25
490
[oeasy]python078_字符串类型怎么用_str_string_下标运算符_中括号
[oeasy]python0017_解码_decode_字节序列_bytes_字符串_str
​解码 decode回忆上次内容code就是码最早也指电报码后来有各种编码、密码、砝码、条码都指的是把各种事物编个号encode就是编码编码就是给事物编个号​编辑编码基本了解了给事物编号就是编码怎么通过编号找到原来的事物呢?解码解码是编码的逆运算解铃换需系铃人​编辑上次把白菜编上号这次扫到号知道是白菜扫到码就知道这个条码对应这个大白菜并知道价格​编辑这解码用英文怎么说呢?解码(decode)de 的意思是相反的defuse 解除保险炸弹引信decolor 漂白defame 中伤destruct
oeasy
2022/11/19
4870
[oeasy]python0017_解码_decode_字节序列_bytes_字符串_str
[oeasy]python0041_ 转义字符_转义序列_escape_序列_sequence
转义序列回忆上次内容上次回顾了5bit-Baudot博多码的来历从 莫尔斯码 到 博多码 原来 人 来 收发电报现在 机器 来 收发电报输入方式 从 电键改成 键盘输出方式 从 纸带变成 打印纸张后来 电传打字机ASR-33成为 初代 经典终端除了 \n 和 \r 之外 还有什么 特殊字符 吗?🤔搜索 ASCII找到 ascii的定义还有 好多 类似于\n、\r的 特殊字符动手试试总结一下 各种 转义字符转义总结\a 响铃 ␇ (bell)电传打字机 回车前 都会预警响铛 避免 回车过程中 误打字符可以
oeasy
2023/01/09
1.5K0
[oeasy]python0041_ 转义字符_转义序列_escape_序列_sequence
[oeasy]python061_如何接收输入_input函数_字符串_str_容器_ 输入输出
061_python如何接收输入_input函数_字符串_str_容器 输入输出0 播放 · 0 赞同视频
oeasy
2025/01/17
780
[oeasy]python061_如何接收输入_input函数_字符串_str_容器_ 输入输出
[oeasy]python088_列表_清空列表_clear
while True: numbers = [] while True: num = input("请输入商品价格(输入end停止输入):") if num == "end": break try: num = float(num) numbers.append(num) except ValueError: print("输入不合法,请输入有效的浮点数或end。") total = sum(numbers) print(f"本次输入的数字总和为:{total}")
oeasy
2025/04/17
450
[oeasy]python088_列表_清空列表_clear
推荐阅读
相关推荐
[oeasy]python093_find方法_指数为负数_index_实际效果
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验