python除了熟悉的pandas,openpyxl库也很方便的支持编辑Excel表

图片

excel表格是大家经常用到的文件格式,各行各业都会跟它打交道。之前文章我们介绍了使用openpyxl和xlrd库读取excel表数据,使用xlwt库创建和编辑excel表,在办公自动化方面可以方便我们快速处理数据,帮助我们提升效率。

python之openpyxl快速读取Excel表内容

测开不得不会的python之xlrd库读取excel表内容

python之xlwt库编辑写入excel表内容

本次我们介绍使用openpyxl创建和编辑excel表。

官网文档:
https://openpyxl.readthedocs.io/en/stable/

官网显示,openpyxl是一个用于读/写Excel2010后缀为XLSX/XLSM/XLTX/XLTM文件的python库。

了解下电脑中的excel表格文件格式

微软或者金山的excel表格编辑保存时一般要选择文件后缀,有xls和xlsx两类。

xls和xlsx后缀文件的主要区别:

  • 文件格式:xls是二进制格式,而xlsx是基于XML的压缩方式。

  • 版本:xls是Excel 2003及以前版本生成的文件格式,而xlsx是Excel 2007及以后版本生成的文件格式。

  • 兼容性:xlsx格式向下兼容,而xls格式不支持向后兼容。

安装openpyxl库

pip install openpyxl -i https://mirrors.aliyun.com/pypi/simple/

目前最新版本3.1.5,安装后目录结果如下,初始化文件__init__.py文件如下:

图片

使用openpyxl库

初始化文件__init__.py文件已经导入了Workbookl类:

图片

该函数用于创建和编辑excel表,使用时我们只需要通过如下命令直接导入即可:

from openpyxl import Workbook

该Workbook类可以创建和操作sheet页对象(class为openpyxl.worksheet. worksheet.Worksheet),通过sheet对象不同的函数来编辑表格中的内容。

创建并编辑,保存Excel表

1导入openpyxl库的Workbook类

from openpyxl import Workbook

2用一个图展示下编辑表格常用的函数(WorkBook和Worksheet类中的函数)

图片

3操作sheet对象

首先我们先初始化Workbook对象

wb = Workbook()

我们编辑表格,其实编辑的都是表格下方的sheet页,所以我们初始化后要先创建sheet页对象,当然也可以复制,删除,移动,复制sheet页对象。

a 创建sheet对象

1)使用wb.active属性函数获取sheet对象

#获取表格sheet页,一般是默认第1个,也可以选择其他并保存后,获取的就是保存后的sheet页对象
sheet = wb.active

2)使用create_sheet函数创建sheet对象

图片

  • 参数title代表 sheet页的名称,可以不填。

  • 参数index:传值时代表创建第几个sheet页;不传值时,则按照顺序依次创建。

测试代码:创建三个sheet页对象

wb = Workbook()
sheet0 = wb.create_sheet('sheet0',0)
sheet1 = wb.create_sheet('sheet1',1)
sheet2 = wb.create_sheet('sheet2')

b 获取sheet对象

1)当创建了多个sheet对象后,可指定获取第N个sheet页对象

wb.active = 1
sheet = wb.active

2)使用wb._sheets获取所有sheet页对象列表,并通过index获取单个sheet页对象

sheet = wb._sheets[0]

3)使用wb.sheetnames获取所有sheet页名称,并通过wb[sheetname]获取sheet页对象

sheetnames = wb.sheetnames
print(sheetnames )
sheet = wb['functions']

4)使用wb.worksheets获取所有sheet页对象列表,并通过index获取单个sheet页对象

print(wb.worksheets)
sheet = wb.worksheets[0]

c 复制sheet页对象

函数copy_worksheet传入已存在的sheet对象,并复制一个对象。

图片

测试代码:

wb = Workbook()
sheet0 = wb.active
sheet1 = wb.copy_worksheet(sheet0)
wb.save(‘1.xlsx’) #保存文件

结果:

图片

d 删除sheet对象

有2种方式删除sheet对象:

wb.remove(worksheet) or del wb[sheetname]

图片

测试代码:

wb = Workbook()
#先创建三个sheet对象
sheet0 = wb.create_sheet('sheet0',0)
sheet1 = wb.create_sheet('sheet1',1)
sheet2 = wb.create_sheet('sheet2')
#删除两个对象
wb.remove(sheet0)
del wb['sheet1']
wb.save(‘2.xlsx’) #保存文件

结果:sheet0和sheet1被删除

图片

e move_sheet:用于移动对象

函数move_sheet可以将sheet对象移动offsheet偏移量。

参数sheet可以传sheet对象或者sheet的名称。

图片

测试代码:

wb = Workbook()
#先创建三个sheet对象
sheet0 = wb.create_sheet('sheet0',0)
sheet1 = wb.create_sheet('sheet1',1)
sheet2 = wb.create_sheet('sheet2')
#移动两个对象
wb.move_sheet(sheet0,3)
wb.move_sheet('sheet1',4)
wb.save('3.xlsx') #保存文件

结果:sheet0和sheet1移动到了右边位置

图片

4 编辑sheet页

a cell()函数:设置单元格的值

cell函数的参数:

  • row代表第几行,column代表第几列,需要大于等于1,都则会报错,
  • value参数如果传值会设置为该单元格的值

图片

以上函数返回的是单元格对象,class为openpyxl.cell.cell.Cell

图片

Cell对象的几个属性:

  • value :单元格的值
  • row:单元格所在的行数
  • column:单元格所在的列数
  • data_type:单元格内容对应的数据类型

测试代码:

wb = Workbook()
#先创建1个sheet对象
sheet0 = wb.create_sheet('sheet0',0)
#填入第1行第1列和第1行第2列的值
sheet0.cell(1,1,'hello')
sheet0.cell(1,2,'python')
wb.save('3.xlsx') #保存文件

结果:

图片

b 像设置列表元素一样输入和删除单元格的值

之前文章我们讲过(python中类class的魔法方法),在类中实现了__getitem__、__setitem__,__delitem__魔法方法,我们就可以对该类的对象,像使用list列表一样获取、设置、删除元素。

图片

  • 按照如下格式输入单元格内容:sheet0['A1'] =‘hello’

  • 按照如下格式删除单元格内容:del sheet0['B1']

解释:A1代表第1列第1行的单元格,B1代表第2列第1行的单元格; 相信大家已经清楚的知道字母代表列,数字代表行(跟我们打开表格看到的是一样的)

测试代码:

wb = Workbook()
#先创建1个sheet对象
sheet0 = wb.create_sheet('sheet0',0)
#填入第1行第1列和第1行第2列的值
sheet0['A1'] = 'hello'
sheet0['B1'] = 'python'
del sheet0['B1'] 
wb.save('4.xlsx') #保存文件

结果:单元格B1的内容又被删掉了

图片

c append()函数:按行批量添加可迭代对象的元素

通过下图可知,参数需要为可迭代对象:列表/元组/字典等,默认从第1行开始写入;

如果为字典,则字典的key需要满足大写字母A到ZZZ,或者为数字,代表在第几列输入字典的value。

图片

测试代码:

wb = Workbook()
#先创建1个sheet对象
sheet0 = wb.create_sheet('sheet0',0)
#设置列表和字典变量
data1 = ['hello','python','my','friend']
data2 = {'A':'hello','C':'python'}
data3 = {1:'hello',2:'python',4:'friend'}
sheet0.append(data1)
sheet0.append(data2)
sheet0.append(data3)
wb.save('6.xlsx') #保存文件

结果:

图片

d 插入/删除行和列

insert_rows,insert_cols,delete_rows,delete_cols四个函数分别代表插入行/插入列/删除行/删除列

参数都是有两个idx和amount:

  • idx代表插入或者删除的位置
  • amount代表插入或者删除的数量(amount值>=1)

图片

图片

比如 insert_rows(2,3) 代表在第2行上面插入3行

比如 insert_cols(2,3) 代表在第2列左面插入3列

比如 delete_rows(5,3) 代表在第5行上面删除3行

比如 delete_cols(5,3) 代表在第5列左面删除3列

e move_range:移动一个范围内的单元格

图片

move_range 方法需要几个参数:

  • cell_range:一个字符串,表示要移动的单元格范围(例如 'A1:C3')。
  • rows:一个整数,表示要向下移动的行数(正数表示向下,负数表示向上)。
  • cols:一个整数,表示要向右移动的列数(正数表示向右,负数表示向左)。

注意:移动时单元格会被覆盖,请务必小心。

测试代码:

wb = Workbook()
#先创建1个sheet对象
sheet0 = wb.create_sheet('sheet0',0)
#设置列表和字典变量
data1 = ['hello','python','my','friend']
data2 = {'A':'hello','C':'python'}
data3 = {1:'hello',2:'python',4:'friend'}
sheet0.append(data1)
sheet0.append(data2)
sheet0.append(data3)
#移动一个范围
sheet0.move_range('A1:C1',2,3)
wb.save('6.xlsx') #保存文件

f merge_cells函数用于合并单元格

合并后的单元格将拥有合并前单元格的数据和样式,并且可以跨越多个行和列。合并单元格可能会导致原有数据丢失,大家要慎重使用。

图片

参数介绍:

  • range_string:指定要合并的单元格区域,例如'A1:B2'表示合并从A1到B2的单元格区域。
  • 其他四个参数:分别表示合并的起始行、起始列、结束行和结束列。比如(1, 1, 3,2)表示合并第1行第1列到第3行第2列的单元格。

测试代码:

wb = Workbook()
#先创建1个sheet对象
sheet0 = wb.create_sheet('sheet0',0)
#设置列表和字典变量
data1 = ['hello','python','my','friend']
data2 = {'A':'hello','C':'python'}
data3 = {1:'hello',2:'python',4:'friend'}
sheet0.append(data1)
sheet0.append(data2)
sheet0.append(data3)
#以下两种方式 同样的效果
sheet0.merge_cells('A1:C2')
sheet0.merge_cells(start_row=1,start_column=1,end_row=3,end_column=2)
wb.save('6.xlsx') #保存文件

结果:

图片

g unmerge_cells 取消合并单元格

跟merge_cells函数功能相反,取消合并的单元格,参数跟merge_cells一致,参考上面的介绍

图片

h 属性函数最大行/最大列/最小行/最小列

max_row: 代表最大行

max_column:代表最大列

min_row: 代表最小行

min_column:代表最小列

图片

测试代码:

wb = Workbook()
#先创建1个sheet对象
sheet0 = wb.create_sheet('sheet0',0)
#设置列表和字典变量
data1 = ['hello','python','my','friend']
data2 = {'A':'hello','C':'python'}
data3 = {1:'hello',2:'python',4:'friend'}
sheet0.append(data1)
sheet0.append(data2)
sheet0.append(data3)
#打印最大行 最大列等信息
print(f'max_row: {sheet0.max_row}')
print(f'max_colunn: {sheet0.max_column}')
print(f'min_row: {sheet0.min_row}')
print(f'min_column: {sheet0.min_row}')
wb.save('6.xlsx') #保存文件

结果:

max_row: 3

max_colunn: 4

min_row: 1

min_column: 1

​​​​​​​i add_image:在单元格中添加图片

  • 参数image需要传入一个image对象,而不是某个图片;
  • anchor填入单元格位置,比如“A1”

image对象依赖另一个库pillow,我们先安装这个库:

pip install pillow -i ​​​​​​​https://mirrors.aliyun.com/pypi/simple/

测试代码:

from openpyxl.drawing.image import Image
from openpyxl import Workbook
wb = Workbook()
#先创建1个sheet对象
sheet0 = wb.create_sheet('sheet0',0)
#定义image对象

imageins = Image('xxxx.jpg')

#在单元格A1处添加图片
sheet0.add_image(imageins,'A1')
wb.save('6.xlsx')  #保存文件

共勉:东汉·班固《汉书·枚乘传》:“泰山之管穿石,单极之绠断干。水非石之钻,索非木之锯,渐靡使之然也。”

-----指水滴不断地滴,可以滴穿石头;

-----比喻坚持不懈,集细微的力量也能成就难能的功劳。

----感谢读者的阅读和学习,点个赞和关注吧,谢谢大家。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【VUE3】新版Vue3+ElementPlus全家桶开发视频项目实战

VUE 介绍 Vue (发音为 /vjuː/,类似 view) 是一款用于构建用户界面的 JavaScript 框架。它基于标准 HTML、CSS 和 JavaScript 构建,并提供了一套声明式的、组件化的编程模型,帮助你高效地开发用户界面。 Vue.js是一个MVVM(Model - View - ViewModel)的SPA框架。 Model:数…

介绍一下atol(arr);(c基础)

hi , I am 36 适合对象c语言初学者 atol(arr)&#xff1b;是返回整数(long型)&#xff0c;整数是arr数组中字符中数字 格式 #include<stdio.h> atol(arr); 返回值arr数组中的数字 未改变arr数组 #include<stdio.h> //atol(arr); 返 <stdlib> int main…

微信小程序WXSS全局样式与局部样式的使用教程

微信小程序WXSS全局样式与局部样式的使用教程 引言 在微信小程序的开发中,样式的设计与实现是提升用户体验的关键部分。WXSS(WeiXin Style Sheets)作为微信小程序的样式表语言,不仅支持丰富的样式功能,还能通过全局样式与局部样式的灵活运用,帮助开发者构建美观且易于维…

OceanBase 大数据量导入(obloader)

现需要将源数据库&#xff08;Oracle|MySQL等&#xff09;一些表的海量数据迁移到目标数据库 OceanBase 中&#xff0c;基于常规 jdbc 驱动编码的方式涉及开发工作&#xff0c;性能效率也要看编码的处理机制。 OceanBase 官方提供了的 OceanBase Migration Service (OMS) 数据…

Spring Boot框架:英语知识网站构建指南

3系统分析 3.1可行性分析 通过对本英语知识应用网站实行的目的初步调查和分析&#xff0c;提出可行性方案并对其一一进行论证。我们在这里主要从技术可行性、经济可行性、操作可行性等方面进行分析。 3.1.1技术可行性 本英语知识应用网站采用SSM框架&#xff0c;JAVA作为开发语…

路由器中继与桥接

一 . 背景 现在的路由器大多数已经开始支持多种网络连接模式&#xff0c;以下将以TP-Link迷你无线路由器为例进行展开介绍。在TP-Link迷你无线路由器上一般有AP&#xff08;接入点&#xff09;模式&#xff0c;Router&#xff08;无线路由&#xff09;模式&#xff0c;Repeate…

Paddle Inference部署推理(一)

一&#xff1a;Paddle Inference推理 简介 Paddle Inference 是飞桨的原生推理库&#xff0c;提供服务器端的高性能推理能力。由于 Paddle Inference 能力直接基于飞桨的训练算子&#xff0c;因此它支持飞桨训练出的所有模型的推理。 Paddle Inference 功能特性丰富&#xff…

前端 vue3 + element-plus + ts 对话框示例

【父组件】&#xff1a;SampleInput.vue&#xff0c;局部代码片段 引入子组件 ApplyItemChooseDialog.vue&#xff0c;定义变量&#xff0c;用于渲染和显示标识 <script>片段代码 import ApplyItemChooseDialog from "/views/accept/ApplyItemChooseDialog.vue&q…

【最优清零方案——贪心+滑动窗口:暴力/线段树/单调队列】

题目 暴力 #include <bits/stdc.h> using namespace std; using ll long long; const int N 1e6 10; int a[N]; int main() {int n, k;cin >> n >> k;ll sum 0;for (int i 1; i < n; i)cin >> a[i], sum a[i];int minn 1e9, pos;ll cnt 0…

Python爬取豆瓣电影全部分类数据并存入数据库

在当今数字化的时代&#xff0c;网络上丰富的影视资源信息吸引着众多开发者去挖掘和利用。今天&#xff0c;我就来和大家分享一段有趣的代码&#xff0c;它能够从豆瓣电影平台获取相关数据并存储到数据库中哦。 结果展示&#xff08;文末附完整代码&#xff09;&#xff1a; 目…

数据结构 ——— 归并排序算法的实现

目录 归并排序的思想 归并排序算法的实现 归并排序的思想 将已经有序的子序列合并&#xff0c;得到完全有序的序列&#xff0c;即先使每个子序列有序后&#xff0c;再使子序列段间有序 若将两个有序表合并成一个有序表&#xff0c;称为二路归并 归并排序步骤示意图&#x…

vue2面试题11|[2024-11-25]

1.vue源码-模版解析 <!DOCTYPE html> <html> <head><title></title> </head> <body><div idapp><h1> {{ str }} </h1>{{ str }} </div></body><script type"text/javascript" srcvue.js…

web博客系统的自动化测试

目录 前言测试用例编写自动化脚本测试准备博客登录页相关测试用例登陆成功登录失败 博客首页相关测试用例登陆成功登录失败 博客详情页相关测试用例登录成功登录失败 博客编辑页相关测试用例登陆成功登录失败 编写测试文档测试类型内容 前言 本次测试是运用个人写的一个博客系…

MATLAB矩阵元素的修改及删除

利用等号赋值来进行修改 A ( m , n ) c A(m,n)c A(m,n)c将将矩阵第 m m m行第 n n n列的元素改为 c c c&#xff0c;如果 m m m或 n n n超出原来的行或列&#xff0c;则会自动补充行或列&#xff0c;目标元素改为要求的&#xff0c;其余为 0 0 0 A ( m ) c A(m)c A(m)c将索引…

告别 Kafka,拥抱 Databend:构建高效低成本的用户行为分析体系

用户行为数据埋点指标是数据仓库中不可或缺的重要数据源之一&#xff0c;同时也是企业最宝贵的资产之一。通常情况下&#xff0c;用户行为数据分析包含两大数据源&#xff1a;用户行为分析日志和上游关系型数据库&#xff08;如 MySQL&#xff09;。基于这些数据&#xff0c;企…

WEB攻防-通用漏洞文件上传中间件解析漏洞编辑器安全

中间件文件解析-IIS&Apache&Nginx Web应用编辑器-Ueditor文件上传安全 实例CMS&平台-中间件解析&编辑器引用 Vulhub是一个基于docker和docker-compose的漏洞环境集合&#xff0c;进入对应目录并执行一条语句即可启动一个全新的漏洞环境&#xff0c;让漏洞复现…

【算法day1】数组:双指针算法

题目引用 这里以 1、LeetCode704.二分查找 2、LeetCode27.移除元素 3、LeetCode977.有序数组的平方 这三道题举例来说明数组中双指针的妙用。 1、二分查找 给定一个 n 个元素有序的&#xff08;升序&#xff09;整型数组 nums 和一个目标值 target &#xff0c;写一个函数搜…

快速理解微服务中Sentinel怎么实现限流

Sentinel是通过动态管理限流规则&#xff0c;根据定义的规则对请求进行限流控制。 一.实现步骤 1.定义资源&#xff1a;在Sentinel中&#xff0c;资源可以是URL、方法等&#xff0c;用于标识需要进行限流的请求&#xff1b;(在Sentinel中&#xff0c;需要我们去告诉Sentinel哪些…

controller中的参数注解@Param @RequestParam和@RequestBody的不同

现在controller中有个方法&#xff1a;&#xff08;LoginUserRequest是一个用户类对象&#xff09; PostMapping("/test/phone")public Result validPhone(LoginUserRequest loginUserRequest) {return Result.success(loginUserRequest);}现在讨论Param("login…

OpenCV截取指定图片区域

import cv2 img cv2.imread(F:/2024/Python/demo1/test1/man.jpg) cv2.imshow(Image, img) # 显示图片 #cv2.waitKey(0) # 等待按键x, y, w, h 500, 100, 200, 200 # 示例坐标 roi img[y:yh, x:xw] # 截取指定区域 cv2.imshow(ROI, roi) cv2.waitKey(0) cv…