Python工具:openpyxl

文档:https://openpyxl.readthedocs.io/en/stable/tutorial.html#

源代码:https://foss.heptapod.net/openpyxl/openpyxl

1.工作簿对象和工作表对象的使用

openpyxl 中有一个 Workbook 类,可以使用 Workbook() 创建工作簿对象(该对象内部默认包含一个名为 sheet 的工作表)。

openpyxl 中,“活动状态 active” 和 “非活动状态 inactive”,通常用来描述工作簿(Workbook)中的工作表(Worksheet):

  1. 活动状态(Active): 工作簿中的一个工作表被标记为活动工作表时,表示当前正在对该工作表进行操作或访问。可以通过 workbook.active 属性来获取该活动工作表。默认情况下,新创建的工作簿的第一个工作表就是是活动的。

    """获取活动工作表"""
    from openpyxl import Workbook
    workbook = Workbook()
    active_sheet = workbook.active  # 获取活动工作表
    
  2. 非活动状态(Inactive): 工作簿中的其他工作表,即不是当前正在操作或访问的工作表,被认为是非活动的。可以通过工作簿对象的 Wookbook.worksheets 属性来获取所有工作表列表,并通过索引来访问非活动工作表。

    """获取非活动工作表"""
    from openpyxl import Workbook
    workbook = Workbook()
    inactive_sheet = workbook.worksheets[1]  # 获取第二个工作表(假设存在第二个工作表)
    

通常,活动状态和非活动状态在进行 Excel 文件的读取、写入和编辑操作时很重要。例如,如果您想往工作表中添加数据,你需要确保正在操作的是活动工作表。

而如果要切换到其他工作表,你可以 create_sheet([表格名称]) 创建新的工作表,并且重新设置 Workbook.active 属性,或者直接通过 Worksheets 列表来选择。

另外,还可以使用 Worksheet.title 属性来获取或修改现有工作表的名称。

"""查看工作表并且修改指定活动工作表"""
from openpyxl import Workbook# 创建工作簿对象并且查看默认的活动工作表
workbook = Workbook()
worksheet1 = workbook.active  # 获取默认的活动工作表
print(workbook.active) # 查看默认的活动工作表# 创建另一些非活动工作表
worksheet2 = workbook.create_sheet('Sheet2')
worksheet3 = workbook.create_sheet('Sheet3')
worksheet4 = workbook.create_sheet('Sheet4')# 将其他工作表设置为活动工作表
workbook.active = worksheet2 # 重新设置默认的活动工作表
print(workbook.active) # 查看此时设定的活动工作表# 获取所有工作表的名称
for sheet_name in workbook.sheetnames:print(sheet_name)# 修改某个工作表的名称
print(worksheet1) # 改名前
worksheet1.title = "Sheet1"
print(worksheet1) # 改名后

一旦为工作表命名,您就可以将其作为工作簿的键,使用 工作表名称-工作表 键值对的形式来获取一个工作表:

"""使用键值来获取工作表"""
# 设置活动工作表
from openpyxl import Workbook# 创建工作簿对象并且查看默认的活动工作表
workbook = Workbook()
worksheet1 = workbook.active  # 获取默认的活动工作表
worksheet1.title = "Sheet1" # 修改默认工作表的默认名称# 创建另一些非活动工作表
worksheet2 = workbook.create_sheet('Sheet2')
worksheet3 = workbook.create_sheet('Sheet3')
worksheet4 = workbook.create_sheet('Sheet4')# 通过键值对获取工作表对象
print(workbook['Sheet1'].title)
print(workbook['Sheet2'].title)
print(workbook['Sheet3'].title)
print(workbook['Sheet4'].title)

您还可以在 单个 工作簿中,使用 Workbook.copy_worksheet() 方法来创建工作表的副本,该工作表会自动插入到调用调用对象对应的工作簿中(默认名字为 [源工作表名称] copy)。

"""为本工作簿的工作表创建副本"""
from openpyxl import Workbook
wb = Workbook()
source = wb.active
wb.active.title = "mySheet"
target = wb.copy_worksheet(source)
target = wb.copy_worksheet(wb['mySheet Copy'])
print(wb.sheetnames)

但是仅复制单元格(包括值、样式、超链接和注释)和某些工作表属性(包括尺寸、格式和属性),不会复制所有其他工作簿/工作表属性(包括图像、图表)

注意 1:您无法直接使用 copy_worksheet() 在工作簿之间直接复制工作表,但可以用其他方式…

from openpyxl import load_workbook, Workbook# 加载源工作簿的工作表
workbook1 = load_workbook(r"C:\Users\Limou_p350ml9\Desktop\Test\新建文件夹\pythontest\workbook1.xlsx")
source_sheet = workbook1.active# 创建一个新的目标工作簿并获取其默认活动工作表
workbook2 = Workbook()
destination_sheet = workbook2.active# 将源工作表的值复制到目标工作簿中的新工作表
for row in source_sheet.iter_rows():destination_sheet.append([cell.value for cell in row])# 保存目标工作簿
workbook2.save(r"C:\Users\Limou_p350ml9\Desktop\Test\新建文件夹\pythontest\workbook2.xlsx")

注意 2:如果后续打开现有工作簿时,以“只读或只写模式打开”,则无法复制工作表。

2.查询和修改单元格

2.1.查询和修改一个单元格

使用数字行和字母列组合可以作为工作表的键直接访问一个单元格,如果不存在则将创建一个,并且可以通过赋值给单元格填入数据。

此外还可以使用 Worksheet.cell() 方法,该方法使用整型行数和整型列数访问一个单元格(个人更加常用),并且可以使用参数 value 来填充单元格数据。

而访问单元格的值必须使用 Cell.value 属性才能获取到对应值(当然,也可以通过这个属性来修改单元格存储的数据)。

"""通过键值对和方法访问和修改一个单元格"""
from openpyxl import Workbook
wb = Workbook()
ws = wb.active
ws['A4'] = 4
ws['B3'].value = "limou"
a = ws.cell(row=4, column=2, value=10)print(ws['A4'])
print(ws['B3'])
print(a)print(ws['A4'].value)
print(ws['B3'].value)
print(a.value)

注意:我们上述提及的工作表,基本都是在内存中创建的工作表(不是直接加载现有的工作表),本身是不包含单元格的,单元格只有在一次被访问时才会被创建出来。

由于此功能,遍历查询内存中工作表对象的单元格,而不是直接访问它们的值时,Workbook 将会自动在内存中创建它们,即使您没有为它们分配任何值。

"""通过遍历导致创建单元格空间"""
from openpyxl import Workbookwb = Workbook()
ws = wb.active
for x in range(1,101):for y in range(1,101):ws.cell(row=x, column=y)

此操作会在内存中创建 100x100 个单元,毫无意义。

2.2.查询和修改多个单元格

利用键值对和切片,可以访问一段单元格范围(亦或是一行和一列单元格),也可以直接使用 Worksheet.iter_rows()Worksheet.iter_cols() 方法获取(个人更加常用)

"""通过切片和方法访问多个单元格"""
from openpyxl import Workbook
wb = Workbook()
ws = wb.activecell_range = ws['A1':'C2'] # [A1, C2)
col_range = ws['C:E'] # C列 和 D列 全部
row_range = ws[5:10] # 5行 和 9行 全部
colC = ws['C'] # C列 的全部
row10 = ws[10] # 10行 的全部for row in ws.iter_rows(min_row=1, max_col=3, max_row=2):"""min_row=1 表示从 1行 开始max_row=2 表示到 2行 结束max_col=3 表示从 0列 到 3列 结束"""for cell in row:print(cell)for col in ws.iter_cols(min_row=1, max_col=3, max_row=2):"""min_row=1 表示从 1行 开始max_col=3 表示到 3行 结束max_row=2 表示从 0列 到 2列 结束"""for cell in col:print(cell) 

同理得到每一个单元格元素时,可以使用 Cell.valus 属性来修改多个单元格内的值。

注意:出于性能原因,该 Worksheet.iter_cols() 方法在表格文件为只读模式打开下不可用。

补充:如果您仅仅需要工作表中的值,则可以使用 Worksheet.values 属性,这将迭代工作表中所有行,您可以使用嵌套的 for 语句来返回所有单元格的值。

# 仅遍历工作表文件的所有值
from openpyxl import Workbook
wb = Workbook()
ws = wb.active
for row in ws.values:for value in row:print(value)

3.加载现有工作表文件

可以使用 openpyxl.load_workbook() 打开一个现有的表格文件。

4.保存和创建工作表文件

关闭表格前需要保存工作簿,而最简单、最安全的方法是使用 Workbook.save() 方法。

而关闭文件一般是由 openpyxl 自动关闭表格文件的,不需要用户显示调用关闭表格文件的方法,但是有些情况下,用户可能需要提前关闭工作表文件(很大概率是为了将内存中表格文件的数据写入到磁盘中),可以考虑使用上下文管理器 with

"""保存工作表文件"""
from openpyxl import Workbook
wb = Workbook()
wb.save('balances.xlsx')

补充:在 openpyxl 中,创建一个表格文件可以使用 Workbook.save() 方法来创建,因此 save() 操作会直接覆盖现有文件而不发出警告也是比较合理的。

openpyxl 中,如果您希望将工作簿保存为 Excel 模板文件(即后缀为 .xltx 的文件),您可以在代码中设置工作簿对象的 template 属性为 True,然后保存文件,这样生成的文件将以模板的形式存在。

"""保存为模板文件"""
from openpyxl import load_workbook
wb = load_workbook('document.xlsx')
wb.template = True
wb.save('document_template.xltx')

补充:Excel 模板文件通常用于创建具有相同格式和布局的新工作簿。当你在 Excel 中打开一个模板文件时,它会创建一个新的工作簿副本,保留了模板中的格式和样式,但不包含原始数据。

当你保存一个工作簿为 Excel 模板文件(.xltx)时,模板文件将保留以下内容:

  1. 格式和样式: 包括单元格的字体、颜色、对齐方式、边框等格式和样式设置。

  2. 公式: 如果模板中包含公式,这些公式也会被保留。

  3. 工作表结构: 包括工作表的名称、列宽、行高等。

  4. 图表和图形: 如果模板中包含图表或图形,它们也会被保留。

  5. 其他工作簿级别的设置: 例如,模板中的一些工作簿级别的设置,如打印设置等,也可能会被保留。

需要注意的是,保存为模板的文件并不会包含具体的数据内容。当你基于这个模板创建新的工作簿时,新工作簿会保留模板的格式和结构,但不会包含原始模板中的实际数据。

这种保存为模板的方式允许用户在创建新工作簿时保留特定的格式和样式,以便更方便地应用于同类模板的文档。

以上结果来源谷歌搜索,暂时不做验证,因为我对 Excel 不同格式的文件了解不多,并且我按照上述程序的流程保存模板后,其原始数据依旧存在,因此这块内容待补充…

5.工作表文件另保为流

如果您想要将文件保存到流中,例如:在使用 PyramidFlaskDjangoWeb 应用程序时,您只需提供 tempfile.NamedTemporaryFile() 所创建出的对象即可。

# 传递流
from tempfile import NamedTemporaryFile
from openpyxl import Workbook# 创建一个新的工作簿
wb = Workbook()# 使用 NamedTemporaryFile 创建一个临时文件对象(在内存中)
with NamedTemporaryFile() as tmp:# 将工作簿保存到临时文件wb.save(tmp.name)# 将文件指针移到文件开头tmp.seek(0)# 读取临时文件中的内容stream = tmp.read()

“另存为流” 意味着将文件保存到一个类文件对象(file-like object)中,该对象可以像文件一样进行读取,但实际上是存储在内存中而不是磁盘上的一份资源。

这对于在 Web 应用程序中生成临时文件并将其直接返回给客户端而言是一种有效的方式(不必做缓慢的 IO 操作)。

在上述代码例子中:

  1. NamedTemporaryFile() 用于创建一个临时文件对象,该对象在被关闭时将自动删除
  2. wb.save(tmp.name) 将工作簿保存到临时文件中
  3. 通过 tmp.seek(0) 将文件指针移到文件的开头,以便从头开始读取文件内容
  4. tmp.read() 读取文件的内容,并将其存储在变量 stream 中。

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

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

相关文章

【数据结构】72变的双端队列

双端队列 前言一、双端队列1.1 双端队列的定义1.2 输入受限的双端队列1.3 输出受限的双端队列1.5 输入输出都受限的双端队列1.6 小结 二、双端队列的使用2.1 双端队列的出队序列——暴力求解2.1.1 栈的出栈序列2.1.2 输入受限的双端队列2.1.3 输出受限的双端队列2.1.4 输入输出…

2859. 计算 K 置位下标对应元素的和(01-25每日一题)

链接 力扣&#xff08;LeetCode&#xff09;官网 - 全球极客挚爱的技术成长平台 思路 : 直接模拟 代码 class Solution { public:int get(int n){int cnt 0 ;while(n){cnt ;n n & (n-1) ;}return cnt ;}int sumIndicesWithKSetBits(vector<int>& nums, …

three.js中Meshline库的使用

three.js中Meshline的使用 库的地址为什么要使用MeshLine,three.js内置的线不好用吗?MeshLine入门MeshLine的深入思考样条曲线一个问题 库的地址 https://github.com/spite/THREE.MeshLine?tabreadme-ov-file 为什么要使用MeshLine,three.js内置的线不好用吗? 确实不好用,…

金融帝国实验室(Capitalism Lab)V10版本推出新招高管待命选项

金融帝国实验室&#xff08;Capitalism Lab&#xff09;V10版本推出新招高管待命选项 ————————————— 【全新V10版本开发播报】 即将发布的V10版本&#xff0c;在“分配管理器”菜单上将引入一个名为“暂时待命”的新功能。启用此选项后&#xff0c;分配给公司的高…

256:vue+openlayers利用高德逆地理编码,点击地图,弹出某点坐标和地址信息

第256个 点击查看专栏目录 本示例的目的是介绍演示如何在vue+openlayers中利用高德逆地理编码,点击地图,弹出某点坐标和地址信息。这里要仔细阅读高德地图的逆编码API,同时要注意的是,这种转换在中国很好用,到了欧美国家就不好使了。 直接复制下面的 vue+openlayers源代码…

用队列实现实现栈

用队列实现实现栈 力扣&#xff08;LeetCode&#xff09;官网 - 全球极客挚爱的技术成长平台备战技术面试&#xff1f;力扣提供海量技术面试资源&#xff0c;帮助你高效提升编程技能&#xff0c;轻松拿下世界 IT 名企 Dream Offer。https://leetcode.cn/problems/implement-st…

HTML+CSS:炫酷按钮组件

效果演示 实现了一个带有发光效果的按钮。按钮在悬停或激活时会产生发光效果&#xff0c;并且按钮上的文字也会随之移动。 Code <main id"app"><button><span class"text">若冰说CSS</span><span class"shimmer">…

Sentinel-1 扩展时序注释数据集 (ETAD)的查询和下载

概述 Sentinel-1的扩展计时注释数据集&#xff08;ETAD&#xff09;是ESA&#xff08;DLR作为承包商&#xff09;开发的新辅助产品&#xff0c;为用户提供校正&#xff0c;将Sentinel-1 SLC图像的几何精度提高到厘米级别。该产品包含分析就绪层&#xff0c;用于消除大气路径延…

用大模型训练实体机器人,谷歌推出机器人代理模型

谷歌DeepMind的研究人员推出了一款&#xff0c;通过视觉语言模型进行场景理解&#xff0c;并使用大语言模型来发出指令控制实体机器人的模型——AutoRT AutoRT可有效地推理自主权和安全性&#xff0c;并扩大实体机器人学习的数据收集规模。在实验中&#xff0c;AutoRT指导超过…

JVM问题排查手册

三万字长文&#xff1a;JVM内存问题排查Cookbook 一、Heap快照 # jmap命令保存整个Java堆&#xff08;在你dump的时间不是事故发生点的时候尤其推荐&#xff09; jmap -dump:formatb,fileheap.bin <pid> # jmap命令只保存Java堆中的存活对象, 包含live选项&#xff0c;…

mysql备份

1.新建备份目录 mkdir -p /data/mysql_dump/#查找mysql配置位置 find / -name "my.cnf" find / -name "mysql.sock" find / -name "mysqldump"2.定时任务 #每天凌晨备份一次 echo "00 00 * * * root /data/mysql_bak.sh" >> /…

CentOS7服务器的安装配置连接客户端Xshell进行使用

目录 一. CentOS7的安装【在虚拟机中】 二. 查看设置IP地址 三. 安装并连接客户端软件Xshell 3.1 安装Xshell 3.2 xshell连接centos7服务器 四. 切换国内源 一. CentOS7的安装【在虚拟机中】 首先创建一个虚拟机&#xff0c; 这个没什么好说的&#xff0c;基本上都是下…

OSPF协议解析及相关技术探索(C/C++代码实现)

OSPF&#xff08;开放最短路径优先&#xff09;是一种用于自治系统&#xff08;AS&#xff09;内部的路由协议&#xff0c;它是基于链路状态算法的。OSPF的设计目的是为了提供一种可扩展、快速收敛和高效的路由解决方案。 OSPF概念和特点 概念 自治系统&#xff08;AS&#…

【AIGC】Diffusers:AutoPipeline自动化扩散生图管道

前言 &#x1f917; 扩散器能够完成许多不同的任务&#xff0c;并且您通常可以将相同的预训练权重用于多个任务&#xff0c;例如文本到图像、图像到图像和修复。但是&#xff0c;如果您不熟悉库和扩散模型&#xff0c;可能很难知道将哪个管道用于任务。例如&#xff0c;如果您…

解决WinForms跨线程操作控件的问题

解决WinForms跨线程操作控件的问题 介绍 在构建Windows窗体应用程序时&#xff0c;我们通常会遇到需要从非UI线程更新UI元素的场景。由于WinForms控件并不是线程安全的&#xff0c;直接这样做会抛出一个异常&#xff1a;“控件’control name’是从其他线程创建的&#xff0c;…

大模型学习与实践笔记(十三)

将训练好的模型权重上传到 OpenXLab 方式1&#xff1a; 先将Adapter 模型权重通过scp 传到本地&#xff0c;然后网页上传 步骤1. scp 到本地 命令为&#xff1a; scp -o StrictHostKeyCheckingno -r -P *** rootssh.intern-ai.org.cn:/root/data/ e/opencv/ 步骤2&#…

Verilog语法——移位运算符“>>“和“>>>“的细节

Verilog中的移位运算符 “>>” 不区分无符号和有符号移位&#xff0c;即对有符号和无符号数进行">>"操作结果一致。 对有符号数使用">>“进行右移&#xff0c;高位补"0”;对无符号数使用">>“进行右移&#xff0c;高位补&q…

Springboot自定义全局异常处理

目录 ErrorController ControllerAdviceExceptionHandler ErrorController BasicErrorController是Spring Boot中默认提供的用于处理基本错误的控制器。它实现了ErrorController接口&#xff0c;用于处理在应用程序中发生的错误&#xff0c;例如404 Not Found等。此种方式是…

Vp9解码方式概述 -- Parsing Process

Vp9解码方式概述 – Parsing Process 本文是对vp9协议第9章&#xff0c;解析字符串函数的一个梳理&#xff0c;主要对几种解析类型&#xff08;Type&#xff09;的流程进行梳理 目录 Vp9解码方式概述 -- Parsing Process1. 如何解码视频&#xff1f;2. f(n)3. 布尔解码器Boole…

Spring5学习笔记

Spring5 框架概述IOC(Inversion Of Control)IOC基本过程:IOC接口(BeanFactory)IOC接口实现类IOC操作Bean管理一、什么是Bean管理?二、什么是DI?三、Bean管理的两种实现方式1.基于XML配置文件方式实现基于XML方式创建对象基于XML方式注入属性常规属性注入特殊属性值的注入…