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

目录

一、文件读操作

二、文件写操作

三、修改单元格样式


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).valueif value not in brand_list:brand_list.append(value)
print(brand_list)print('-----------------------分------割------线-----------------------')# 练习3:计算不同品牌的总的销售额
# 方法1:使用上面已经搜索出来的品牌列表
sale = {}
for b in brand_list:sum1 = 0for row in range(3, max_row+1):if datasheet.cell(row, 5).value == b:sum1 += datasheet.cell(row, 8).valuesale[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).valuesale = 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).valuefor 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 = '年龄'    # 方法2wb.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 + 1sheet.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 + 1value = 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 + 1value = data[x]sheet2.cell(1, col, value)
student_list = class1['students']
for x in range(len(student_list)):stu = student_list[x]row = x + 2stu_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 + 1value = 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 = 0for col in range(2, max_col + 1):value = sheet1.cell(row, col).valuesum1 += valueif value == 0:sheet1.cell(row, col).value = '补考'sheet1.cell(row, max_col + 1).value = sum1wb.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/Falsecolor=None,     # 文字颜色size=None,      # 字号bold=None,      # 加粗, True/Falseitalic=None,    # 倾斜,Tue/Falseunderline=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, rightvertical='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, Alignmentwb = 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 = border1wb.save('files/data1.xlsx')

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

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

相关文章

word自带公式编辑器技巧

1.实现多行公式换行且对齐 1.1 准备阶段(默认Unicode模式) 进入公式编辑模式,输入\eqarray,紧接着按下空格键输入空格,如下 1.2 实现换行和对齐 将要编辑的公式输入到括号内 &:实现位置对齐 &…

104.网络游戏逆向分析与漏洞攻防-装备系统数据分析-筛选与装备有关的数据包

免责声明:内容仅供学习参考,请合法利用知识,禁止进行违法犯罪活动! 如果看不懂、不知道现在做的什么,那就跟着做完看效果,代码看不懂是正常的,只要会抄就行,抄着抄着就能懂了 内容…

postman教程-15-前置脚本

上一小节我们学习了Postman生成随机数的方法,本小节我们讲解一下Postman前置脚本的使用方法。 Postman中的前置脚本(Pre-request Script)允许你在发送请求之前运行JavaScript代码。这可以用于修改请求头、查询参数、请求体等,或者…

web学习笔记(六十二)

目录 1.键盘事件 2.KeepAlive 3.组件传值 3.1 兄弟组件传值 3.2 组件树传值 3.3 发布订阅者传值 1.键盘事件 keydown表示键盘事件&#xff0c;在不加修饰符的情况下&#xff0c;点击键盘上的任意位置都可以触发键盘事件&#xff0c; <template><div><!--…

word 无法自动检测拼写

word 有时候不能分辨是哪种语言,比如把英语错认为法语 。 例如&#xff1a;Interlaayer spacace,发现误认为是法语。 1、选中Interlaayer spacace 2、点击语言下拉按钮 选择设置校对语言 发现校对语言为法语 3、手动修改校对语言为英语&#xff0c;并点击确认。 4、发现现…

什么是 Batch Normalization 批标准化和全连接层

Batch Normalization 神经元在经过激活函数之后会处于饱和状态&#xff0c;无论后续怎么变化都不会再起作用。 每一层都会进行batch normalization的处理&#xff01; without normalization 会导致数据分布再饱和区 全连接层&#xff1a; 全连接层(fully connected layers&a…

十四、返回Insert操作自增索引值

分为两部分&#xff0c;解析初始化和使用 拿含有selectkey标签的insert语句解析来说 解析部分 1.解析时看有没有selectkey标签&#xff0c;有的话先解析selectkey的内容&#xff0c;包括对其SQL的解析并封装成一个MappedStatement和创建KeyGenerator放入configuration中 2.解…

SpringBoot前端URL访问本地磁盘文件

SpringBoot前端通过 URL访问本地磁盘文件&#xff0c;其实就是 SpringBoot访问web中的静态资源的处理方式。 SpringBoot 访问web中的静态资源&#xff1a;https://blog.csdn.net/qq_42402854/article/details/90295079 首先&#xff0c;我们知道浏览器访问本地磁盘文件的方式为…

LLM的基础模型5:Embedding模型

大模型技术论文不断&#xff0c;每个月总会新增上千篇。本专栏精选论文重点解读&#xff0c;主题还是围绕着行业实践和工程量产。若在某个环节出现卡点&#xff0c;可以回到大模型必备腔调或者LLM背后的基础模型新阅读。而最新科技&#xff08;Mamba,xLSTM,KAN&#xff09;则提…

三十七、openlayers官网示例Earthquakes Heatmap解析——在地图上加载热力图

官网demo地址&#xff1a; Earthquakes Heatmap 这篇主要介绍了热力图HeatmapLayer HeatmapLayer 是一个用于在地图上显示热力图的图层类型&#xff0c;通常用于表示地理数据中的密度或强度。例如&#xff0c;它可以用来显示地震、人口密度或其他空间数据的热点区域。在这个示…

Siemens-NXUG二次开发-创建倒斜角特征、边倒圆角特征、设置对象颜色、获取面信息[Python UF][20240605]

Siemens-NXUG二次开发-创建倒斜角特征、边倒圆角特征、设置对象颜色、获取面信息[Python UF][20240605] 1.python uf函数1.1 NXOpen.UF.Modeling.AskFaceData1.2 NXOpen.UF.Modeling.CreateChamfer1.3 NXOpen.UF.ModlFeatures.CreateBlend1.4 NXOpen.UF.Obj.SetColor 2.实体目标…

lib库和dll库的介绍和使用

lib&#xff08;静态库&#xff09; 静态库定义&#xff1a;.lib文件是静态库文件&#xff0c;包含了在编译时被链接到目标程序的代码。使用静态库时&#xff0c;库的代码会被复制到最终生成的可执行文件中。优点&#xff1a; 性能&#xff1a;由于库代码在编译时就被集成到可…

分布式架构与分布式理论

文章目录 分布式架构什么是分布式系统分布式系统特性分布式系统面临的问题 分布式理论数据一致性CAP理论BASE理论 分布式架构 什么是分布式系统 分布式系统是一个硬件或软件组件分布在不同的网络计算机上&#xff0c;彼此之间仅仅通过消息传递进行通信和协调的系统。 所谓分…

Vue的APP实现下载文件功能,并将文件保存到手机中

Vue的APP实现下载文件功能&#xff0c;并将文件保存到手机中 文字说明后台核心代码前台核心代码运行截图项目链接 文字说明 本文介绍Vue实现的APP&#xff0c;将文件下载并保存到手机中&#xff0c;为系统提供导出功能&#xff1b;同时支持导入&#xff0c;即选择本地的文件后&…

Ubuntu18.04 文件管理器无法打开的解决方法

问题&#xff1a;打开Ubuntu虚拟机发现文件管理器无法打开,一直在转圈圈 在终端中输入 nautilus 显示如下信息 nautilus: symbol lookup error: /usr/lib/x86_64-linux-gnu/tracker-2.0/libtracker-data.so.0: undefined symbol: sqlite3_bind_pointer 解决措施&#xff1a…

LabVIEW 反向工程的实现与法律地位

什么是LabVIEW反向工程&#xff1f; 反向工程是指从现有的应用程序或软件中推导出其设计、架构、代码等信息的过程。对于LabVIEW而言&#xff0c;反向工程涉及从现有的VI&#xff08;虚拟仪器&#xff09;文件、项目或应用程序中提取出设计思路、功能模块、算法实现等。 LabV…

Spring Boot整合Jasypt 库实现配置文件和数据库字段敏感数据的加解密

&#x1f604; 19年之后由于某些原因断更了三年&#xff0c;23年重新扬帆起航&#xff0c;推出更多优质博文&#xff0c;希望大家多多支持&#xff5e; &#x1f337; 古之立大事者&#xff0c;不惟有超世之才&#xff0c;亦必有坚忍不拔之志 &#x1f390; 个人CSND主页——Mi…

大数据学习问题记录

问题记录 node1突然无法连接finalshell node1突然无法连接finalshell 今天我打开虚拟机和finalshell的时候&#xff0c;发现我的node1连接不上finalshell,但是node2、node3依旧可以链接&#xff0c;我在网上找了很多方法&#xff0c;但是是关于全部虚拟机连接不上finalshell&a…

大模型时代,是 Infra 的春天还是冬天?

Highlights 大模型时代元年感悟 Scaling Laws 是大模型时代的摩尔定律,是最值得研究的方向 LLM 发展的三个阶段: 算法瓶颈 -> 数据瓶颈 -> Infra 瓶颈 为什么 GPT 一枝独秀, BERT、T5 日落西山? 大模型时代,是大部分 Infra 人的冬天,少部分 Infra 人的春天(算法研…

算法金 | 一文读懂K均值(K-Means)聚类算法

​大侠幸会&#xff0c;在下全网同名[算法金] 0 基础转 AI 上岸&#xff0c;多个算法赛 Top [日更万日&#xff0c;让更多人享受智能乐趣] 1. 引言 数据分析中聚类算法的作用 在数据分析中&#xff0c;聚类算法用于发现数据集中的固有分组&#xff0c;通过将相似对象聚集在一…