自动化办公02 用openpyxl库操作excel.xlsx文件(新版本)

news2025/1/14 18:42:50

目录

一、文件读操作

二、文件写操作

三、修改单元格样式


openpyxl 是一个处理Excel表格的第三方库。openpyxl 库可以处理Excel2010以后的电子表格格式,包括:xlsx/xlsm/xltx/xltm。

openpyxl教程

一、文件读操作

工作簿(workbook): excel文件
工作表(worksheet): 工作簿中的每一个活动就是一个工作表
单元格(cell): 工作表中用来存储数据的每个格子

注意:openpyxl只能操作新版本的excel文件(后缀为.xlsx)

1. 打开excel文件,得到一个工作簿对象

openpyxl.load_workbook(excel文件路径)

2. 获取工作簿相关信息

1)获取工作簿中所有的工作表的名称

变量 = 工作簿.sheetnames

2) 获取所有的工作表,返回值是一个列表,列表中的元素是工作表对象

变量 = 工作簿.worksheets

3) 获取指定工作表:

变量 = 工作簿对象[表名]

4) 获取活跃表(当前处于选中状态的工作表)

变量 = 工作簿.active

3. 获取工作表的相关信息

1) 获取数据的最大行数和列数
   工作表对象.max_row   -  获取最大行数
   工作表对象.max_column  -   获取最大列数

2) 获取指定单元格(注意这里写的是行号和列号,都是从1开始)

变量 = 工作表.cell(row, column)

4. 获取单元格相关信息

获取单元格内容

变量 = 工作表.cell(row, column).value

import openpyxl
# 注意:openpyxl只能操作新版本的excel文件(后缀为.xlsx)

# 工作簿(workbook): excel文件
# 工作表(worksheet): 工作簿中的每一个活动就是一个工作表
# 单元格(cell): 工作表中用来存储数据的每个格子

# 1. 打开excel文件,得到一个工作簿对象
# openpyxl.load_workbook(excel文件路径)
workbook = openpyxl.load_workbook('files/2020年销售数据.xlsx')

# 2. 获取工作簿相关信息
# 1)获取工作簿中所有的工作表的名称
names = workbook.sheetnames
print(names)

# 2)获取所有的工作表,返回值是一个列表,列表中的元素是工作表对象
all_sheet = workbook.worksheets
print(all_sheet)

# 3)获取指定工作表: 工作簿对象[表名]
sheet1 = workbook['data']
print(sheet1)

# 4)获取活跃表(当前处于选中状态的工作表)
sheet2 = workbook.active
print(sheet2)

# 3. 获取工作表的相关信息
# 1)获取数据的最大行数和列数
# 工作表对象.max_row   -  获取最大行数
# 工作表对象.max_column  -   获取最大列数
print(sheet1.max_row, sheet1.max_column)
print(sheet2.max_row, sheet2.max_column)

# 2)获取指定单元格
# 注意这里写的是行号和列号,都是从1开始
cell1 = sheet1.cell(7, 4)
print(cell1)

# 4. 获取单元格相关信息
# 获取单元格内容
result = cell1.value
print(result)

练习:

import openpyxl

# 获取工作簿
wb = openpyxl.load_workbook('files/2020年销售数据.xlsx')
# 获取工作表
datasheet = wb['data']

#  案例:获取第五行
max_col = datasheet.max_column  # 最大列数
data = []
for col in range(1, max_col + 1):
    cell = datasheet.cell(5, col)
    data.append(cell.value)
print(data)

print('-----------------------分------割------线-----------------------')

# 练习1:获取data中第5列所有的数据
data1 = []
max_row = datasheet.max_row
for row in range(1, max_row + 1):
    cell = datasheet.cell(row, 5)
    data1.append(cell.value)
print(data1)

print('-----------------------分------割------线-----------------------')

# 练习2:获取所有的品牌(列表去重)
brand_list = []
max_row = datasheet.max_row
for row in range(3, max_row + 1):
    value = datasheet.cell(row, 5).value
    if value not in brand_list:
        brand_list.append(value)
print(brand_list)

print('-----------------------分------割------线-----------------------')

# 练习3:计算不同品牌的总的销售额
# 方法1:使用上面已经搜索出来的品牌列表
sale = {}
for b in brand_list:
    sum1 = 0
    for row in range(3, max_row+1):
        if datasheet.cell(row, 5).value == b:
            sum1 += datasheet.cell(row, 8).value
    sale[b] = sum1
print(sale)

print('-----------------------分------割------线-----------------------')

# print(type(datasheet.cell(row, 5).value))
# 方法2:
dic = {}
for row in range(3, max_row + 1):
    brand = datasheet.cell(row, 5).value
    sale = datasheet.cell(row, 8).value
    # a.使用setdefault函数添加键值对
    # dic.setdefault(brand, 0)
    # dic[brand] += sale
    # b.使用if判断
    # if brand in dic:
    #     dic[brand] += sale
    # else:
    #     dic[brand] = sale
    # c.使用.get()方法读取第一个数据,则不会报错
    dic[brand] = dic.get(brand, 0) + sale
print(dic)

print('-----------------------分------割------线-----------------------')

dic = {'八匹马': 0, '皮皮虾': 0, '壁虎': 0, '花花姑娘': 0, '啊哟喂': 0}
# dic = {}
max_row = datasheet.max_row
for row in range(3, max_row + 1):
    value = datasheet.cell(row, 5).value
    for d in list(dic.keys()):
        if value == d:
            dic[d] += datasheet.cell(row, 8).value
print(dic)

print('-----------------------分------割------线-----------------------')

# data2 = []
# for row in range(1, max_row):
#     temp = []
#     for col in range(1, max_col):
#         cell = datasheet.cell(row, col)
#         temp.append(cell.value)
#     data2.append(temp)
# print(data2)

二、文件写操作

注意:所有写操作在保存后才会有效

1. 新建工作簿(创建一个工作簿对象)

新建的工作簿中默认有一个工作表

变量 = openpyxl.Workbook()

2. 添加工作表

工作簿对象.create_sheet()  -  在工作簿的最后添加一个名字为Sheet?的工作表

工作簿对象.create_sheet(表名)    -   在工作簿的最后添加一个名字为指定值的工作表

工作簿对象.create_sheet(表名,下标)  -  在指定下标对应位置添加名字为指定值的工作表

3. 删除工作表

工作簿对象.remove(工作簿[表名])

del 工作簿[表名] 

4.修改单元格内容

工作表.cell(row, column, 修改/添加内容)

工作表.cell(row, column).value = 修改/添加内容

import openpyxl

# 1. 新建工作簿(创建一个工作簿对象)
wb = openpyxl.Workbook()

# 2. 添加工作表
wb.create_sheet()

# 注意:添加工作表的逻辑 - 不存在才添加
if 'students' not in wb.sheetnames:
    wb.create_sheet('students')

wb.create_sheet('teachers', 0)

# 3. 删除工作表
# 工作簿对象.remove(工作簿[表名])
# del 工作簿[表名]
if 'Sheet' in wb.sheetnames:
    wb.remove(wb['Sheet'])

if 'Sheet1' in wb.sheetnames:
    del wb['Sheet1']

# 4.修改单元格内容
students_sheet = wb['students']
students_sheet.cell(1, 1, '姓名')     # 方法1
students_sheet.cell(1, 2).value = '年龄'    # 方法2

wb.save('files/school.xlsx')

案例:

import openpyxl

# 1.将data数据写深入到新建的excel中默认的工作表中的第二行
data = ['2020-1-1', '上海', '天猫', '205654-021', '八匹马', 169, 85, 14365]

# 准备工作表
wb1 = openpyxl.Workbook()
sheet = wb1.active

# 写入数据
for x in range(len(data)):
    value = data[x]
    col = x + 1
    sheet.cell(2, col, value)

wb1.save('files/data1.xlsx')

练习:

 练习1:将data中的写入到新建的表中的第3列中

# 练习1:将data中的写入到新建的表中的第3列中
data = ['八匹马', '皮皮虾', '壁虎', '花花姑娘', '啊哟喂']
sheet1 = wb1.create_sheet('练习1')

for x in range(len(data)):
    row = x + 1
    value = data[x]
    sheet1.cell(row, 3, value)

wb1.save('files/data1.xlsx')

 练习2:将class1中所有学生的信息以合理方式保存到新建的'学生表'中

# 练习2:将class1中所有学生的信息以合理方式保存到新建的'学生表'中
class1 = {
    'name': 'python2402',
    'address': '6教室',
    'lecturer': {'name': '余婷', 'age': 18, 'gender': '女', 'qq': '726550822'},
    'head_teacher': {'name': '舒嚒嚒', 'age': 18, 'gender': '女', 'tel': '110'},
    'students': [
        {'name': 'stu1', 'age': 17, 'gender': '男', 'score': 89, 'link_man': {'name': '张三', 'tel': '122334'}},
        {'name': 'stu2', 'age': 28, 'gender': '女', 'score': 99, 'link_man': {'name': '李四', 'tel': '29833'}},
        {'name': 'stu3', 'age': 22, 'gender': '女', 'score': 65, 'link_man': {'name': '王五', 'tel': '22223'}},
        {'name': 'stu4', 'age': 22, 'gender': '男', 'score': 77, 'link_man': {'name': '赵六', 'tel': '6544'}},
        {'name': 'stu5', 'age': 21, 'gender': '男', 'score': 46, 'link_man': {'name': '何七', 'tel': '664322'}},
        {'name': 'stu6', 'age': 16, 'gender': '女', 'score': 82, 'link_man': {'name': '李八', 'tel': '12278334'}}
    ]
}
data = ['姓名', '年龄', '性别', '分数', '联系人', '联系人电话']
sheet2 = wb1.create_sheet('学生表')
for x in range(len(data)):
    col = x + 1
    value = data[x]
    sheet2.cell(1, col, value)
student_list = class1['students']
for x in range(len(student_list)):
    stu = student_list[x]
    row = x + 2
    stu_value = list(stu.values())
    link_man = stu_value.pop()
    # print(stu_value,link_man)   # ['stu1', 17, '男', 89] {'name': '张三', 'tel': '122334'}
    stu_value.append(link_man['name'])
    stu_value.append(link_man['tel'])
    # print(stu_value)    # ['stu1', 17, '男', 89, '张三', '122334']
    for y in range(len(stu_value)):
        col = y + 1
        value = stu_value[y]
        sheet2.cell(row, col, value)
wb1.save('files/data1.xlsx')

练习3:将所有的0分都替换成补考;添加总分列,并且计算出每个学生的总分 

import openpyxl

# 练习3:将所有的0分都替换成补考;添加总分列,并且计算出每个学生的总分
wb = openpyxl.load_workbook('files/data2.xlsx')

sheet1 = wb['Sheet1']

max_row = sheet1.max_row  # 19
max_col = sheet1.max_column  # 5
sheet1.cell(1, max_col + 1, '总分')
for row in range(2, max_row + 1):
    sum1 = 0
    for col in range(2, max_col + 1):
        value = sheet1.cell(row, col).value
        sum1 += value
        if value == 0:
            sheet1.cell(row, col).value = '补考'
    sheet1.cell(row, max_col + 1).value = sum1

wb.save('files/data2.xlsx')

三、修改单元格样式

import openpyxl
from openpyxl.styles import Font, PatternFill, Border, Side, Alignment

# 1.打开工作簿
wb = openpyxl.load_workbook('files/school.xlsx')
sheet = wb.active

# 2.设置单元格字体样式
"""
Font(
    name=None,      # 字体名,可以用字体名字的字符串
    strike=None,    # 删除线,True/False
    color=None,     # 文字颜色
    size=None,      # 字号
    bold=None,      # 加粗, True/False
    italic=None,    # 倾斜,Tue/False
    underline=None # 下划线, 'singleAccounting', 'double', 'single', 'doubleAccounting'
)
"""
# 1) 创建字体对象
font1 = Font(
        size=20,
        italic=True,
        color='ff0000',
        bold=True,
        strike=True
)
# 2) 设置指定单元格的字体
# 单元格对象.font = 字体对象
sheet['B2'].font = font1


# 3. 设置单元格填充样式
"""
PatternFill(
	fill_type=None,		# 设置填充样式: 'darkGrid', 'darkTrellis', 'darkHorizontal', 'darkGray', 'lightDown', 'lightGray', 'solid', 'lightGrid', 'gray125', 'lightHorizontal', 'lightTrellis', 'darkDown', 'mediumGray', 'gray0625', 'darkUp', 'darkVertical', 'lightVertical', 'lightUp'
	start_color=None	# 设置填充颜色
)
"""
# 1) 设置填充对象
fill = PatternFill(
        fill_type='solid',
        start_color='ffff00'
)
# 2)设置单元格的填充样式
# 单元格对象.fill = 填充对象
sheet['B2'].fill = fill


# 4. 设置单元格对齐样式
# 1)创建对象
al = Alignment(
        horizontal='right',     # 水平方向:center, left, right
        vertical='top'       # 垂直方向: center, top, bottom
)
# 2) 设置单元格的对齐方式
sheet['B2'].alignment = al

# 5. 设置边框样式
# 1)设置边对象(四个边的边可以是一样的也可以不同,如果不同就创建对个Side对象)
side = Side(border_style='thin', color='0000ff')
# 2) 设置边框对象
# 这儿的left、right、top、bottom表示的是边框的四个边,这儿四个边使用的是一个边对象
bd = Border(left=side, right=side, top=side, bottom=side)
# 3)设置单元格的边框
sheet['B2'].border = bd

# 6.设置单元格的宽度和高度
# 设置指定列的宽度
sheet.column_dimensions['A'].width = 20
# 设置指定行的高度
sheet.row_dimensions[1].height = 45

# 7. 保存
wb.save('files/school.xlsx')

简单示例:

"""
Author:  余婷
Create Time: 2024/5/28 16:58
你只管努力,时间会给你惊喜!
"""
import openpyxl
from openpyxl.styles import Font, PatternFill, Border, Side, Alignment

wb = openpyxl.load_workbook('files/data1.xlsx')
sheet1 = wb['Sheet']


# 1. 设置字体
# 1)创建字体对象
f1 = Font(
    name='楷体',
    color='990033',
    size=20,
    bold=True
)
# 2)设置单元格的字体
sheet1.cell(2, 2).font = f1

# 2. 填充单元格
# 1)创建填充对象
fill1 = PatternFill(
    fill_type='solid',
    start_color='FFFFCC'
)
# 2)设置单元格的填充样式
sheet1.cell(2, 2).fill = fill1

# 3. 设置边框样式
# 1)创建边对象
s1 = Side(
    border_style='medium',
    color='663366'
)
s2 = Side(
    border_style='mediumDashDot',
    color='009966'
)
# 2)创建边框对象
border1 = Border(
    bottom=s1,
    top=s1,
    left=s2,
    right=s2
)

# 3)设置单元格的边框
sheet1.cell(2, 2).border = border1


wb.save('files/data1.xlsx')

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

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

相关文章

PID控制算法介绍及使用举例

PID 控制算法是一种常用的反馈控制算法,用于控制系统的稳定性和精度。PID 分别代表比例(Proportional)、积分(Integral)和微分(Derivative),通过组合这三个部分来调节控制输出&#…

宝塔nginx配置

将跟php有关的注释掉: 添加: #解决vue刷新404问题try_files $uri $uri/ /index.html; location /prod-api/ {proxy_set_header Host $http_host;proxy_set_header X-Real-IP $remote_addr;proxy_set_header REMOTE-HOST $remote_addr;proxy_set_header…

SOCKS 代理 和 HTTP 代理, WebSocket

SOCKS 代理 和 HTTP 代理 的区别 SOCKS 代理 和 HTTP 代理 都是代理服务器,它们充当客户端和目标服务器之间的中介,但它们的工作方式和应用场景有所不同。 1. SOCKS 代理: 工作原理: SOCKS 代理是一种更底层的代理,…

攻防世界—webbaby详解

1.ssrf注入漏洞 ssrf(服务端请求伪造)是一种安全漏洞,攻击者通过该漏洞向受害服务器发出伪造的请求,从而访问并获取服务器上的资源,常见的ssrf攻击场景包括访问内部网络的服务,执行本地文件系统命令&#…

基于小波变换贝叶斯LMMSE估计的图像降噪方法(MATLAB 2018)

自从小波被发现以来,由于其优良的时频局部化性能,大大解决了信号与图像降噪的难题。利用小波降噪大致有三种方法,分别是基于小波模极大值原理、基于小波变换系数的相关性,和最为常用的小波阈值函数法。 基于小波模极大值降噪 该…

React(五)useEffect、useRef、useImperativeHandle、useLayoutEffect

(一)useEffect useEffect – React 中文文档 useEffect hook用于模拟以前的class组件的生命周期,但比原本的生命周期有着更强大的功能 1.类组件的生命周期 在类组件编程时,网络请求,订阅等操作都是在生命周期中完成 import React, { Com…

C语言的printf输出问题

看到这段代码的时候&#xff0c;想到这个printf输出的值是多少? 若您想到的答案是1-2&#xff0c;真的是这样吗&#xff1f; #include <stdio.h>int main(int argc, char *argv[]) {int i 1;printf("%d-%d\r\n", i, i);return 0; }先了解一个知识点&#xf…

QT安装与使用

QT安装与使用 Windows QT安装 1.下载windowsQT安装包 本教程使用的QT版本是&#xff1a;https://download.qt.io/archive/qt/5.12/5.12.9/ 本教程的安装包放在阿里云盘供大家获取。 2.QT安装 如果没有梯子&#xff0c;大家登录QT官网可能会失败&#xff0c;这里可以不需要Q…

VS Code 开发小技巧

VS Code的开发小技巧 添加代码片段 平时开发的时候&#xff0c;可以快速创建一个空白的模板。 一个快速生成代码片段的网站&#xff1a;https://snippet-generator.app/ 打开网站&#xff0c;把常用的模板代码复制进去&#xff0c;就会自动生成VS Code可以使用的代码片段了。…

揭秘成都跃享未来教育:安全靠谱,打造教育新未来?

在当今这个信息爆炸的时代&#xff0c;教育行业的变革日新月异&#xff0c;各种教育机构如雨后春笋般涌现。其中&#xff0c;成都跃享未来教育咨询有限公司以其独特的教育理念和创新的教学模式&#xff0c;吸引了众多家长和学生的目光。那么&#xff0c;这家公司到底安不安全&a…

45-3 护网溯源 - 为什么要做溯源工作

官网:CVERC-国家计算机病毒应急处理中心 西工大遭网络攻击再曝细节!13名攻击者身份查明→ (baidu.com) 护网溯源是指通过技术手段追踪网络攻击的来源和行为,其重要性体现在以下几个方面: 安全防御:了解攻击源头可以帮助组织加强网络安全防御,及时采取措施防止攻击的再次…

跟着大佬学RE(四)

几个API函数 [ACTF新生赛2020]Universe_final_answer 一个很多方程组的函数&#xff0c;还有一个嗯&#xff0c;对input进行一些操作的函数 嗯&#xff0c;确实方程解出来得到 key 直接运行就可以得到 flag 了&#xff0c;不过还是去分析了一下。 v22 __readfsqword(0x28u);…

course-nlp——2-svd-nmf-topic-modeling

本文参考自https://github.com/fastai/course-nlp。 使用NMF and SVD进行主题建模 问题 主题建模是开始学习 NLP 的一种有趣方式。我们将使用两种流行的矩阵分解技术。考虑最极端的情况——使用两个向量的外积重建矩阵。显然&#xff0c;在大多数情况下&#xff0c;我们无法…

【微机原理与汇编语言】循环程序设计

一、实验目的 1.熟练掌握8086/8088常用汇编指令的使用方法 2.熟练掌握循环结构程序编程技巧 3.熟练掌握汇编语言程序运行调试方法 二、实验要求 认真分析实验题目&#xff0c;设计程序流程图&#xff0c;独立完成代码编写及运行调试。 三、实验题目 给出不大于255的十个…

电子电器架构 --- 智能座舱技术分类

电子电器架构 — 智能座舱技术分类 我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 屏蔽力是信息过载时代一个人的特殊竞争力,任何消耗你的人和事,多看一眼都是你的不对。非必要不费力证明自己,…

纯血鸿蒙开发教程:如何实现运动饮食卡片效果

开发背景 人们对健康的要求越来越高&#xff0c;从单纯的健康饮食到健康运动&#xff0c;再到两者的结合。但是&#xff0c;饮食和运动之间的平衡一般人很难掌握&#xff0c;而我们这款 APP 将饮食、运动、以及自身身体状况&#xff08;如体脂、体重、内脂等&#xff09;有机结…

React + SpringBoot开发用户中心管理系统

用户中心项目搭建笔记 技术栈 前端技术栈 “react”: “^18.2.0”,ant-design-pro 后端技术栈 SpringBoot 2.6.x 项目源码地址 https://gitee.com/szxio/user-center 前端项目搭建 快速搭建一个后端管理系统项目框架 初始化 antDesignPro 官网&#xff1a; https://…

zdppy_amauth 实现给角色批量绑定权限

新增接口 api.resp.post("/auth/role_auth", amauth.role.add_auths)如何测试 如何测试能不能给指定的角色批量的添加权限呢&#xff1f; 1、需要新建一个角色2、需要拿到这个角色的ID3、需要新增三个权限4、需要拿到新增的三个权限的ID5、拿着角色ID和权限ID列表…

11. RBAC权限管理从零到一实现(二)

前端页面已提交至git https://github.com/SJshenjian/cloud-web默认用户名密码admin 1

深度解析:ISP代理与住宅代理区别

代理充当用户和互联网之间的中介&#xff0c;提供各种功能以增强安全性、隐私性和可访问性。在众多代理类型中&#xff0c;ISP 和住宅代理脱颖而出&#xff0c;每种代理都具有独特的功能和应用。 了解 ISP 代理 代理ISP&#xff0c;通常称为互联网服务提供商代理&#xff0c;通…