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…

Redis Pub/Sub Redisson Topic

目录 一、Redis Pub/Sub二、Redisson Topic 一、Redis Pub/Sub Redis Pub/Sub实现了发布/订阅消息传递范式&#xff0c;发送端和订阅端通过channel进行关联。订阅端订阅一个或多个channel&#xff0c;而发送端向指定的channel发送消息。 Redis的Pub/Sub仅支持最多一次at-most-…

【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;需要教程可以关注留言

网络爬虫中selenium和requests这两个工具有什么区别呢?

在自动化和网络爬虫的开发过程中&#xff0c;Selenium和Requests是两个常用的工具。尽管它们都可以用于从互联网上获取数据&#xff0c;但它们在用途、功能和工作原理上存在显著的差异。以下将详细探讨Selenium和Requests之间的主要区别。 一、用途和定位 Selenium&#xff1…

互联网的盈利模式

1. 广告收入 展示广告&#xff1a;通过在网站或应用上展示横幅广告、视频广告等&#xff0c;按点击次数&#xff08;CPC&#xff09;或展示次数&#xff08;CPM&#xff09;收费。搜索广告&#xff1a;通过搜索引擎上的关键词竞价广告&#xff0c;按点击次数收费。社交媒体广告…

conda 常用指令大集合

增删改查 注&#xff1a;所有的环境都保存在路径 ${anaconda安装目录}/env/[环境名]下 查看现有环境 (星号✳️代表当前&#xff09; conda info --env 创建 conda 环境 conda create -n [环境名] python[版本号] 删除 conda 环境 conda remove -n [环境名] --all 修改…

如何通过京东API优雅地获取商品评论数据

在当今电商领域&#xff0c;用户评论成为了影响消费者购买决策的关键因素之一。京东&#xff0c;作为中国领先的电商平台&#xff0c;深知商品评论的重要性&#xff0c;并通过其开放平台提供了商品评论数据接口&#xff0c;让开发者能够轻松获取商品的用户反馈信息。本文将指导…

[Redis]持久化机制

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

如何在 Windows 上安装 Docker Desktop

如何在 Windows 上安装 Docker Desktop Docker 是一个开放平台&#xff0c;用于开发、部署和运行应用程序。Docker Desktop 是 Docker 在 Windows 和 macOS 上的官方客户端&#xff0c;它使得开发者能够轻松地在本地环境中构建、运行和共享容器化应用程序。本文将详细介绍如何…

RuoYi Swagger请求401

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

如何在SpringSecurity中配置基于角色的访问控制?

在Spring Security中配置基于角色的访问控制是保护应用程序和资源不被未授权访问的基本策略之一。这里&#xff0c;我们将详细介绍如何在配置中和方法级别上实现基于角色的访问控制。 1. 配置基于角色的访问控制 在Spring Security的配置类中&#xff0c;你可以使用HttpSecur…

揭秘MMAdapt:如何利用AI跨领域战胜新兴健康谣言?

MMAdapt: A Knowledge-Guided Multi-Source Multi-Class Domain Adaptive Framework for Early Health Misinformation Detection 论文地址: MMAdapt: A Knowledge-guided Multi-source Multi-class Domain Adaptive Framework for Early Health Misinformation Detection …

【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;评论 &…