Python实例:openpyxl读写单元格

原文链接:http://www.juzicode.com/python-example-openpyxl-access-data

本文介绍openpyxl模块几种读写单元格的方法,先手动创建一个表格,在代码里先用load_workbook()方法读取这个表格生成一个Workbook对象wb,再通过wb得到一个Worksheet实例ws,然后在ws的基础上访问单元格。

1)iter_rows()和iter_cols()方法

openpyxl支持整行或者整列的读出,这需要用到Worksheet的iter_rows()和iter_cols()方法

#juzicode.com/VX公众号:juzicode
from openpyxl import load_workbook
wb = load_workbook('profile.xlsx')  # 第1步访问文件
ws = wb['软件']                      # 第2步访问工作表 
print('多行访问:')
for row in ws.iter_rows(): # 迭代读出print(row)    
print('多列访问:')
for col in ws.iter_cols(): # 迭代读出print(col)

运行结果:

多行访问:
(<Cell '软件'.A1>, <Cell '软件'.B1>, <Cell '软件'.C1>, <Cell '软件'.D1>, <Cell '软件'.E1>)
(<Cell '软件'.A2>, <Cell '软件'.B2>, <Cell '软件'.C2>, <Cell '软件'.D2>, <Cell '软件'.E2>)
(<Cell '软件'.A3>, <Cell '软件'.B3>, <Cell '软件'.C3>, <Cell '软件'.D3>, <Cell '软件'.E3>)
多列访问:
(<Cell '软件'.A1>, <Cell '软件'.A2>, <Cell '软件'.A3>)
(<Cell '软件'.B1>, <Cell '软件'.B2>, <Cell '软件'.B3>)
(<Cell '软件'.C1>, <Cell '软件'.C2>, <Cell '软件'.C3>)
(<Cell '软件'.D1>, <Cell '软件'.D2>, <Cell '软件'.D3>)
(<Cell '软件'.E1>, <Cell '软件'.E2>, <Cell '软件'.E3>)

这种方法获取到的是单元格实例,还可以进一步地通过访问Cell对象的value属性获取到单元格的内容: 

for row in ws.iter_rows(): # 迭代读出for r in row:print(r.value)

如果不想返回单元格实例而是返回单元格的值,也可以在调用Worksheet的iter_rows()和iter_cols()方法时传入入参values_only=True,就能直接得到单元格的值:

#juzicode.com/VX公众号:juzicode
from openpyxl import load_workbook
wb = load_workbook('profile.xlsx')   # 第1步访问文件
ws = wb['软件']                      # 第2步访问工作表 
print('多行访问:')
for row in ws.iter_rows(values_only=True): # 迭代读出print(row)
print('多列访问:')   
for col in ws.iter_cols(values_only=True): # 迭代读出print(col)

运行结果:

多行访问:
('name', 'job', 'company', 'sex', 'contact')
('桔子菌', '软件捉虫工', '桔子code有限公司', 'M', 'VX公众号:juzicode')
('何橙子', '软件布虫工', '桔子code有限公司', 'F', 'www.juzicode.com')
多列访问:
('name', '桔子菌', '何橙子')
('job', '软件捉虫工', '软件布虫工')
('company', '桔子code有限公司', '桔子code有限公司')
('sex', 'M', 'F')
('contact', 'VX公众号:juzicode', 'www.juzicode.com')

当然你还可以在调用iter_rows()和iter_cols()方法时填写min_row,max_row等参数指定访问表格的范围,范围限定在这些指定值的闭区间。

#juzicode.com/VX公众号:juzicode
from openpyxl import load_workbook
wb = load_workbook('profile.xlsx')   # 第1步访问文件
ws = wb['汇总']                      # 第2步访问工作表 
print('多行访问:')
for row in ws.iter_rows(values_only=True, min_row=1, max_row=3, min_col=2, max_col=5): # 迭代读出print(row)

运行结果:

多行访问:
('job', 'company', 'sex', 'contact')
('软件捉虫工', '桔子code有限公司', 'M', 'VX公众号:juzicode')
('软件布虫工', '桔子code有限公司', 'F', 'www.juzicode.com')

2)下标方式访问多行多列

上面这个例子通过min_row=1, max_row=3, min_col=2, max_col=5限定了访问范围,返回了第1~3行,第2~5列单元格的内容。这时还可以通过指定单元格的名称来限定访问范围,达到同样的目的,仍然是第1~3行,第2~5列,则可以用[‘B1′:’E3’]表示,其中列号用字母,行号用数字组合起来表示。

#juzicode.com/VX公众号:juzicode
from openpyxl import load_workbook
wb = load_workbook('profile.xlsx')   # 第1步访问文件
ws = wb['汇总']                      # 第2步访问工作表 
print('多行多列访问:')
cell_range = ws['B1':'E3']   # 下标方式指定行列的范围
#print('cell_range:',cell_range)
for cells in cell_range:  # cells为多个同一行的cell组成的tupleprint(cells)for c in cells:       # 单个访问cellprint(c,c.value) 

运行结果:

多行多列访问:
(<Cell '汇总'.B1>, <Cell '汇总'.C1>, <Cell '汇总'.D1>, <Cell '汇总'.E1>)
<Cell '汇总'.B1> job
<Cell '汇总'.C1> company
<Cell '汇总'.D1> sex
<Cell '汇总'.E1> contact
(<Cell '汇总'.B2>, <Cell '汇总'.C2>, <Cell '汇总'.D2>, <Cell '汇总'.E2>)
<Cell '汇总'.B2> 软件捉虫工
<Cell '汇总'.C2> 桔子code有限公司
<Cell '汇总'.D2> M
<Cell '汇总'.E2> VX公众号:juzicode
(<Cell '汇总'.B3>, <Cell '汇总'.C3>, <Cell '汇总'.D3>, <Cell '汇总'.E3>)
<Cell '汇总'.B3> 软件布虫工
<Cell '汇总'.C3> 桔子code有限公司
<Cell '汇总'.D3> F
<Cell '汇总'.E3> www.juzicode.com

3)下标方式访问整行整列

还可以通过Worksheet实例的下标方式访问多行多列。如果下标为整型数值对应访问行,如果下标为字符串型数值则对应访问列。如果要得到多行多列的Cell实例可以通过冒号间隔下标,这点和numpy数据下标访问方法类似。比如下面的例子中ws[1]表示第一行的cell,ws[1:3]表示第1-3行cell:

#juzicode.com/VX公众号:juzicode
from openpyxl import load_workbook
wb = load_workbook('profile.xlsx')  
ws = wb['汇总']                      
print(ws[1])       # 第1行的cell
print(ws['A'])     # 第A列的cellprint(ws[1:3])     # 第1-3行cell
print(ws['A':'C']) # 第A-C列cell

运行结果:

(<Cell '汇总'.A1>, <Cell '汇总'.B1>, <Cell '汇总'.C1>, <Cell '汇总'.D1>, <Cell '汇总'.E1>)
(<Cell '汇总'.A1>, <Cell '汇总'.A2>, <Cell '汇总'.A3>, <Cell '汇总'.A4>, <Cell '汇总'.A5>, <Cell '汇总'.A6>)
((<Cell '汇总'.A1>, <Cell '汇总'.B1>, <Cell '汇总'.C1>, <Cell '汇总'.D1>, <Cell '汇总'.E1>), (<Cell '汇总'.A2>, <Cell '汇总'.B2>, <Cell '汇总'.C2>, <Cell '汇总'.D2>, <Cell '汇总'.E2>), (<Cell '汇总'.A3>, <Cell '汇总'.B3>, <Cell '汇总'.C3>, <Cell '汇总'.D3>, <Cell '汇总'.E3>))
((<Cell '汇总'.A1>, <Cell '汇总'.A2>, <Cell '汇总'.A3>, <Cell '汇总'.A4>, <Cell '汇总'.A5>, <Cell '汇总'.A6>), (<Cell '汇总'.B1>, <Cell '汇总'.B2>, <Cell '汇总'.B3>, <Cell '汇总'.B4>, <Cell '汇总'.B5>, <Cell '汇总'.B6>), (<Cell '汇总'.C1>, <Cell '汇总'.C2>, <Cell '汇总'.C3>, <Cell '汇总'.C4>, <Cell '汇总'.C5>, <Cell '汇总'.C6>))

注意这种方式和前面通过下标方式访问多行多列有所区别,这种方式只能得到整行或整列的cell,并不能得到一个“矩形”状的多行多列cell。

4) Worksheet的vaules属性

还可以通过Worksheet的vaules属性直接得到单元格的值:

#juzicode.com/VX公众号:juzicode
from openpyxl import load_workbook
wb = load_workbook('profile.xlsx') 
ws = wb['汇总']                   
print(ws.values)
for value in ws.values:print(value)

运行结果:

<generator object Worksheet.values at 0x000001F3F9167A70>
('name', 'job', 'company', 'sex', 'contact')
('桔子菌', '软件捉虫工', '桔子code有限公司', 'M', 'VX公众号:juzicode')
('何橙子', '软件布虫工', '桔子code有限公司', 'F', 'www.juzicode.com')
('柚子菌', '硬件抠图工', '桔子code有限公司', 'F', 'VX公众号:桔子code')
('王金桔', '焊工', '橙子加工工厂', 'M', 'VX公众号:桔子code')
('赵沃柑', '维修工', '桔子电子信息有限公司', 'F', '1008611')

5) Worksheet的rows,colnums属性

也可以通Worksheet的rows,colnums属性访问单元格,他们会返回单元格对象生成器,通过for循环能得到单元格Cell对象:

#juzicode.com/VX公众号:juzicode
from openpyxl import load_workbook
wb = load_workbook('profile.xlsx')  
ws = wb['汇总']                      
print(ws.rows)
for row in ws.rows:print(row)#juzicode.com/VX公众号:juzicode
from openpyxl import load_workbook
wb = load_workbook('profile.xlsx')  
ws = wb['汇总']                      
print(ws.columns)   
for col in ws.columns:print(col)

运行结果:

<generator object Worksheet._cells_by_row at 0x00000214C7FF7990>
(<Cell '汇总'.A1>, <Cell '汇总'.B1>, <Cell '汇总'.C1>, <Cell '汇总'.D1>, <Cell '汇总'.E1>)
(<Cell '汇总'.A2>, <Cell '汇总'.B2>, <Cell '汇总'.C2>, <Cell '汇总'.D2>, <Cell '汇总'.E2>)
(<Cell '汇总'.A3>, <Cell '汇总'.B3>, <Cell '汇总'.C3>, <Cell '汇总'.D3>, <Cell '汇总'.E3>)
(<Cell '汇总'.A4>, <Cell '汇总'.B4>, <Cell '汇总'.C4>, <Cell '汇总'.D4>, <Cell '汇总'.E4>)
(<Cell '汇总'.A5>, <Cell '汇总'.B5>, <Cell '汇总'.C5>, <Cell '汇总'.D5>, <Cell '汇总'.E5>)
(<Cell '汇总'.A6>, <Cell '汇总'.B6>, <Cell '汇总'.C6>, <Cell '汇总'.D6>, <Cell '汇总'.E6>)<generator object Worksheet._cells_by_col at 0x00000214C7FF7A00>
(<Cell '汇总'.A1>, <Cell '汇总'.A2>, <Cell '汇总'.A3>, <Cell '汇总'.A4>, <Cell '汇总'.A5>, <Cell '汇总'.A6>)
(<Cell '汇总'.B1>, <Cell '汇总'.B2>, <Cell '汇总'.B3>, <Cell '汇总'.B4>, <Cell '汇总'.B5>, <Cell '汇总'.B6>)
(<Cell '汇总'.C1>, <Cell '汇总'.C2>, <Cell '汇总'.C3>, <Cell '汇总'.C4>, <Cell '汇总'.C5>, <Cell '汇总'.C6>)
(<Cell '汇总'.D1>, <Cell '汇总'.D2>, <Cell '汇总'.D3>, <Cell '汇总'.D4>, <Cell '汇总'.D5>, <Cell '汇总'.D6>)
(<Cell '汇总'.E1>, <Cell '汇总'.E2>, <Cell '汇总'.E3>, <Cell '汇总'.E4>, <Cell '汇总'.E5>, <Cell '汇总'.E6>)

更多应用实例公众号【桔子code】后台回复【openpyxl】获取下载链接。

扩展阅读:

  1. Python轮子:Excel读写利器——openpyxl – 桔子code (juzicode.com)

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

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

相关文章

Linux编译器-gcc/g++使用 make/makefile最基础的功能

文章目录 一.引例&#xff1a;C语言C 二.程序翻译的过程预处理条件编译 编译汇编链接 三.链接--动静态链接链接是什么&#xff1f;动静态库为什么要有库&#xff1f;怎么办&#xff1f;证明&#xff1a; 优缺点静态链接的应用场景 四.make/makefile原理&#xff1a;为什么makef…

云资源管理系统-项目部署

云资源管理系统-项目部署 大家好&#xff0c;我是秋意零。 今天分享个人项目同时也是个人毕设项目&#xff0c;云平台资源管理系统。该系统具备对OpenStack最基本资源的生命周期管理&#xff0c;如&#xff1a;云主机、云盘、镜像、网络。 该篇主要介绍&#xff0c;项目在Li…

【LLM】PISSA:一种高效的微调方法

前言 介绍PISSA前&#xff0c;先简单过一下LLMs微调经常采用的LoRA&#xff08;Low-Rank Adaptation&#xff09;微调的方法&#xff0c;LoRA 假设权重更新的过程中有一个较低的本征秩&#xff0c;对于预训练的权重参数矩阵 W 0 ∈ R d k W_0 ∈ R^{dk} W0​∈Rdk&#xff0c…

Linux_内核缓冲区

目录 1、用户缓冲区概念 2、用户缓冲区刷新策略 3、用户缓冲区的好处 4、内核缓冲区 5、验证内核缓冲区 6、用户缓冲区存放的位置 7、全缓冲 结语 前言&#xff1a; Linux下的内核缓冲区存在于系统中&#xff0c;该缓冲区和用户层面的缓冲区不过同一个概念&#x…

数据结构与算法引入(Python)

华子目录 引入第一次尝试第二次尝试 算法的概念算法的五大特性 算法效率衡量执行时间单靠时间值绝对可信吗&#xff1f; 时间复杂度与 "大O记法"如何理解 “大O记法” 最坏时间复杂度时间复杂度的几条基本计算规则 算法分析常见的时间复杂度常见时间复杂度之间的关系…

2024最新版DataGrip安装教程-全网最全教程!!!

1.DataGrip下载安装 1.打开DataGrip官网&#xff0c;选择自己需要的版本下载即可&#xff1a; 2.进行安装&#xff1a; 3.重启打开&#xff1a; 我这个是正版激活码激活的&#xff0c;需要教程可以关注留言

[Redis]持久化机制

众所周知&#xff0c;Redis是内存数据库&#xff0c;也就是把数据存在内存上&#xff0c;读写速度很快&#xff0c;但是&#xff0c;内存的数据容易丢失&#xff0c;为了数据的持久性&#xff0c;还得把数据存储到硬盘上 也就是说&#xff0c;内存有一份数据&#xff0c;硬盘也…

RuoYi Swagger请求401

问题描述&#xff1a; 提示&#xff1a;这里简述项目相关背景&#xff1a; 使用ruoyi-vue分离版&#xff0c;访问swagger&#xff0c;发现接口都调用失败&#xff1a;401 解决方案&#xff1a; 最终解决问题如下步骤&#xff1a; 1、 调用swagger中的接口&#xff0c;报错&a…

【Mysql】DQL操作单表、创建数据库、排序、聚合函数、分组、limit关键字

DQL操作单表 1.1 创建数据库 •创建一个新的数据库 db2 CREATE DATABASE db2 CHARACTER SET utf8;•将db1数据库中的 emp表 复制到当前 db2数据库 ** 1.2 排序** 通过 ORDER BY 子句,可以将查询出的结果进行排序 (排序只是显示效果,不会影响真实数据) 语法结构&#xff1a;…

算法:渐进记号的含义及时间复杂度计算

渐进记号及时间复杂度计算 渐近符号渐近记号 Ω \Omega Ω渐进记号 Θ \Theta Θ渐进记号小 ο \omicron ο渐进记号小 ω \omega ω渐进记号大 O \Omicron O常见的时间复杂度关系 时间复杂度计算&#xff1a;递归方程代入法迭代法套用公式法 渐近符号 渐近记号 Ω \Omega Ω …

每天写java到期末考试--接口1--基础--6.22

规则&#xff1a; 练习&#xff1a; 抽象类的抽象方法 动物类Animal package 期末复习;public abstract class Animal {private String name;private int age;//1.空构造public Animal(){}public Animal(String name,int age){this.ageage;this.namename;}public String getNa…

【C++提高编程-11】----C++ STL常用集合算法

&#x1f3a9; 欢迎来到技术探索的奇幻世界&#x1f468;‍&#x1f4bb; &#x1f4dc; 个人主页&#xff1a;一伦明悦-CSDN博客 ✍&#x1f3fb; 作者简介&#xff1a; C软件开发、Python机器学习爱好者 &#x1f5e3;️ 互动与支持&#xff1a;&#x1f4ac;评论 &…

Nginx 负载均衡实现上游服务健康检查

Nginx 负载均衡实现上游服务健康检查 Author&#xff1a;Arsen Date&#xff1a;2024/06/20 目录 Nginx 负载均衡实现上游服务健康检查 前言一、Nginx 部署并新增模块二、健康检查配置2.1 准备 nodeJS 应用程序2.2 Nginx 配置负载均衡健康检查 小结 前言 如果你使用云负载均衡…

【Linux】 yum学习

yum介绍 在Linux系统中&#xff0c;yum&#xff08;Yellowdog Updater, Modified&#xff09;是一个用于管理软件包的命令行工具&#xff0c;特别适用于基于RPM&#xff08;Red Hat Package Manager&#xff09;的系统&#xff0c;如CentOS、Fedora和Red Hat Enterprise Linux…

【Arduino】实验使用ESP32单片机根据光线变化控制LED小灯开关(图文)

今天小飞鱼继续来实验ESP32的开发&#xff0c;这里使用关敏电阻来配合ESP32做一个我们平常接触比较多的根据光线变化开关灯的实验。当白天时有太阳光&#xff0c;则把小灯关闭&#xff1b;当光线不好或者黑天时&#xff0c;自动打开小灯。 int value;void setup() {pinMode(34…

音视频开发29 FFmpeg 音频编码- 流程以及重要API,该章节使用AAC编码说明

此章节的一些参数&#xff0c;需要先掌握aac的一些基本知识&#xff1a;​​​​​​aac音视频开发13 FFmpeg 音频 --- 常用音频格式AAC&#xff0c;AAC编码器&#xff0c; AAC ADTS格式 。_ffmpeg aac data数据格式-CSDN博客 目的&#xff1a; 从本地⽂件读取PCM数据进⾏AAC格…

【CARD】多变化字幕的上下文感知差异提炼(ACL 2024)

摘要 Multi-change captioning旨在用自然语言描述图像对中的复杂变化。和图像字幕相比&#xff0c;这个任务要求模型具有更高层次的认知能力来推理任意数量的变化。本文提出一种新的上下文感知差异提取网络&#xff08;CARD&#xff09;。给定一个图像对&#xff0c;CARD首先解…

Multigranularity and MultiscaleProgressive Contrastive Learning

这篇文章将一张图片划分为四个不同细粒度大小的图片&#xff0c;然后输出四个神经网络&#xff0c;这四个神经网络共享权重&#xff0c;得到四个输出&#xff0c;将这四个输出求交叉熵损失和对比学习损失&#xff0c;共同监督模型学习。 通过对比学习&#xff0c;最大化一个Bat…

Microsoft Edge无法启动搜索问题的解决

今天本来想清一下电脑&#xff0c;看到visual studio2022没怎么用了就打算卸载掉。然后看到网上有篇文章说进入C盘的ProgramFiles&#xff08;x86&#xff09;目录下的microsoft目录下的microsoft visual studio目录下的install目录中&#xff0c;双击InstallCleanup.exe&#…

Windows环境利用 OpenCV 中 CascadeClassifier 分类器识别人脸 c++

Windows环境中配置OpenCV 关于在Windows环境中配置opencv的说明&#xff0c;具体可以参考&#xff1a;VS2022 配置OpenCV开发环境详细教程。 CascadeClassifier 分类器 CascadeClassifier 是 OpenCV 库中的一个类&#xff0c;它用于实现一种快速的物体检测算法&#xff0c;称…