Excel自动化办公——Openpyxl的基本使用

news2025/2/26 14:35:08

Excel自动化办公——Openpyxl的基本使用

个人感觉,相比Pandas,openpyxl对Excel的操作更为细致,Pandas则更适用于统计计算;

  • 01 基本环境
  • 02 Excel数据读取操作
  • 03 案例
  • 04 向Excel写入数据
  • 05 表数据定向修改
  • 06 单元格样式制定
  • 07 单元格边框样式制定
  • 08 单元格对其方式
  • 09 筛选器
  • 10 公式操作
  • 11 设置行高、列宽
  • 12 单元格拆分合并
  • 13 冻结窗口
  • 14 添加绘制图表

01 基本环境

使用库:openpyxl(3.x),依赖 lxml、pillow;

一些基本定义:

  • 工作簿:一个Excel电子表格文档,保存到扩展名为.xlsx的文件中;
  • sheet表:工作簿包含的多个工作表;
  • 活动表:当前查看的表,或关闭前最后查看的表;
  • 单元格:列从A开始,行从1开始,特定行列的位置方格即为单元格;注意在Z之后,使用两个字母AA、AB、AC等;
import openpyxl
openpyxl.__version__
'3.0.9'

02 Excel数据读取操作

# 加载工作簿,返回工作簿对象
wb = openpyxl.load_workbook("./youtube_mp3_ds_test.xlsx")

# 获取工作表名称列表
print("工作表名称列表 = ",wb.sheetnames)

# 获取sheet,返回工作表对象
ws1 = wb["Sheet1"]

# 获取活动表,返回工作表对象
ws2 = wb.active

# 从表中取单元格,按行列名字访问,返回Cell对象
cell = ws2["A4"]

# 属性:value:cell中存储的值
# 属性:row:行索引
# 属性:column:列索引
# 属性:coordinate:坐标
print("单元格诸属性 = ",cell.value, cell.row, cell.column, cell.coordinate)

# 行索引可以使用数字,代替字母,从1开始,但需要变化下方式;
cell = ws2.cell(row=1, column=4)
print("单元格诸属性(索引方式) = ",cell.value, cell.row, cell.column, cell.coordinate)


# 从工作表中 可以获取一个矩形区域
for cell_row in ws2["A2":"E6"]:
    for cell in cell_row:
#         print(cell.coordinate)
        pass

# 也可以获取单独的一行或一列:使用worksheet对象的rows和columns属性,返回的是一个迭代器
for column in ws2.columns:
    for cell in column:
        print("每一列的第一行 = ",cell.coordinate)
        break

# 获取第一列 的所有单元格        
list(ws2.columns)[0]

# 获取工作表中的最大行数和最大列数
print("工作表中的最大行数和最大列数 = ",ws2.max_row,ws2.max_column)


工作表名称列表 =  ['Sheet1']
单元格诸属性 =  114584 4 1 A4
单元格诸属性(索引方式) =  a_item 1 4 D1
每一列的第一行 =  A1
每一列的第一行 =  B1
每一列的第一行 =  C1
每一列的第一行 =  D1
每一列的第一行 =  E1
每一列的第一行 =  F1
每一列的第一行 =  G1
每一列的第一行 =  H1
工作表中的最大行数和最大列数 =  12567 8

03 案例

# 四列:普查区编号A、州简称B、县名称C、普查区人口D;每个县可能存在多个普查区;

# 代码示意
sheet = ...
countryData = {}
for row in range(2, sheet.max_row + 1):
    cell_1 = sheet["B" + str(row)]
    cell_2 = sheet["C" + str(row)]
    cell_3 = sheet["D" + str(row)]
    
    countryData.setdefault(cell_1.value, {})
    countryData[cell_1.value].setdefault(cell_2.value, {'v1':0, 'v2':0})
    countryData[cell_1.value][cell_2.value]['v1'] += 1
    countryData[cell_1.value][cell_2.value]['v2'] += int(cell_3.value)

# 结果可以保存到json  

04 向Excel写入数据


# 创建一个空工作薄
wb = openpyxl.Workbook()

wb.sheetnames # 默认工作表

['Sheet']

ws = wb.active

# 为工作表 设置名称
ws.title = "test_sheet"
ws.title

'test_sheet'
# 保存工作薄
wb.save("./wb_demo.xlsx")

# 创建工作表
wb = openpyxl.load_workbook("./wb_demo.xlsx")
wb.create_sheet(title="test_sheetA", index=0) # 指定sheet放的位置(该值从0开始)
wb.save("./wb_demo.xlsx")
wb.sheetnames

['test_sheetA', 'test_sheet']
# 删除工作表
del wb["test_sheetA"]
wb.sheetnames

['test_sheet']
# 指定单元格的值
sheet = wb["test_sheet"]
sheet["A1"] = "ColumnA"
sheet["B1"] = "ColumnB"
sheet.cell(row=2, column=1).value = "ValueA"
sheet.cell(row=2, column=2).value = "ValueB"
wb.save("./wb_demo.xlsx")

05 表数据定向修改

# 代码示意
wb = openpyxl.load_workbook("./xxx.xlsx")
sheet = wb["Sheet"]

PRICE_UPDATE = {
    "A": 1.0,
    "B": 2.0,
    "C": 3.0
}
for rowNum in range(2, sheet.max_row + 1):
    cur_name = sheet.cell(row=rowNum, column=1).value
    if cur_name in PRICE_UPDATE:
        sheet.cell(row=rowNum, column=2).value = PRICE_UPDATE[cur_name]

# 保存更新 wb        

06 单元格样式制定

使用openpyxl.stayles模块导入 Font 和 PatternFill 工具包;

字体

  • name=“楷体”,名称
  • color=“000000”,颜色
  • italic=Ture,斜体
  • size=12,字体大小
  • underline=“sigle”,单下划线
  • b=True,粗体
# 设置字体样式
import openpyxl
from openpyxl.styles import Font

wb = openpyxl.load_workbook("./wb_demo.xlsx")
sheet = wb["test_sheet"]

for row in sheet["A1":"B1"]:
    for col in row:
        col.font = Font(name="楷体")
wb.save("./wb_demo.xlsx")

# 设置字体颜色
wb = openpyxl.load_workbook("./wb_demo.xlsx")
sheet = wb["test_sheet"]

for row in sheet["A1":"B1"]:
    for col in row:
        col.font = Font(name="楷体",color="668B8B")
wb.save("./wb_demo.xlsx")

填充色

# 设置单元格填充色
import openpyxl
from openpyxl.styles import PatternFill

wb = openpyxl.load_workbook("./wb_demo.xlsx")
sheet = wb["test_sheet"]

for row in sheet["A2":"B2"]:
    for col in row:
        col.fill = PatternFill(patternType="solid",fgColor="8470FF")
wb.save("./wb_demo.xlsx")

在这里插入图片描述

07 单元格边框样式制定

# 设置边框(并不常用)
import openpyxl
from openpyxl.styles import Side, Border

wb = openpyxl.load_workbook("./wb_demo.xlsx")
sheet = wb["test_sheet"]

for row in sheet["A2":"B2"]:
    for col in row:
        side = Side(style='double', color='FF0000')
        col.border = Border(top=side,bottom=side, left=side, right=side)
        
wb.save("./wb_demo.xlsx")

08 单元格对其方式

# 使用Alignment工具包
import openpyxl
from openpyxl.styles import Alignment

wb = openpyxl.load_workbook("./wb_demo.xlsx")
sheet = wb["test_sheet"]

for row in sheet["A2":"B2"]:
    for col in row:
        col.alignment = Alignment(horizontal="right",vertical='center')
        
wb.save("./wb_demo.xlsx")


09 筛选器

import openpyxl

wb = openpyxl.load_workbook("./wb_demo.xlsx")
sheet = wb["test_sheet"]

# 设置筛选器:筛选器对象需制定引用的区域
sheet.auto_filter.ref = 'A1:B3'

# 设置筛选项:参数1指定对第几列应用筛选条件,参数2表示筛选条件的内容
sheet.auto_filter.add_filter_column(0, ["ValueA"]) # 但注意 数据展示样式 需要打开Excel并操作筛选后才会生效,相当于bug

# 设置排序:指定排序区域,及升降序
sheet.auto_filter.add_sort_condition(ref="B2:B3", descending=True) # 依旧存在上面的bug:配置已经存在,样式却未生效

wb.save("./wb_demo.xlsx")

10 公式操作

import openpyxl

wb = openpyxl.load_workbook("./wb_demo.xlsx")
sheet = wb["test_sheet"]
sheet['C4'] = '=SUM(C2:C3)'
wb.save("./wb_demo.xlsx")

# 读取使用公式的单元格的结果
wb = openpyxl.load_workbook("./wb_demo.xlsx",read_only=True)
sheet = wb["test_sheet"]
sheet['C4'].value # 注意 这是一个公式字符串,而非计算好的结果

'=SUM(C2:C3)'

11 设置行高、列宽

sheet对象有 row_dimensions 和 column_demensions 属性,控制行高和列宽;

  • 行高范围 0~409的整数或小数,表示点数,默认行高12.75,一点等于1/72英寸;
  • 列宽可设置0~255的整数或小数,默认8.43个字符;
  • 行高或列宽设为0,将使单元格隐藏;
import openpyxl

wb = openpyxl.load_workbook("./wb_demo.xlsx")
sheet = wb["test_sheet"]

sheet.row_dimensions[2].height = 50 # 设置第2行 行高
sheet.column_dimensions['A'].width = 50 # 设置第A列 列宽

wb.save("./wb_demo.xlsx")

12 单元格拆分合并

  • merge_cells() 将一个矩形区域的单元格合并为一个单元格
  • unmerge_cells() 用于拆分单元格
import openpyxl

wb = openpyxl.load_workbook("./wb_demo.xlsx")
sheet = wb["test_sheet"]

sheet.merge_cells('A2:B3')
sheet['A2'] = "合并后的内容"

# sheet.unmerge_cells('A2:B3')

wb.save("./wb_demo.xlsx")

13 冻结窗口

  • 悬停顶部几行或最左侧几列;
  • sheet对象的freeze_panes属性,可以设置为一个Cell对象或一个单元格坐标字符串;
  • 单元格上边的所有行和左边的所有列都会被冻结,但单元格所在行和列不会冻结;
属性值受影响的行列
=‘A2’行1
=‘B1’列A
=‘C1’列A和列B
=‘C2’行1和列A和列B
=‘A1’ 或 =None解冻所有单元格

14 添加绘制图表

利用工作表中数据创建 条形图、折线图、散点图和饼图:

  • 创建一个Reference对象,表示作用于图表的数据区域;
  • 创建图表对象
  • 向图表对象中添加数据
  • 将图表添加到指定sheet中

python_openpyxl中的48种图表样式参考

Python办公自动化—用openpyxl制作Excel图表

import openpyxl
from openpyxl.chart.legend import LegendEntry

wb = openpyxl.load_workbook("./youtube_mp3_ds_test.xlsx")
sheet = wb.active

# 仅划定数据区域
values = openpyxl.chart.Reference(sheet, min_row=2, min_col=2, max_row=5, max_col=3)

# chart = openpyxl.chart.BarChart()
chart = openpyxl.chart.LineChart()
# chart = openpyxl.chart.ScatterChart()
# chart = openpyxl.chart.PieChart()
chart.title = 'Bar for cls'
chart.x_axis.title = 'cls'
chart.y_axis.title = 'num'
# 图例的位置可以通过设置其位置来控制:
# 右、左、上、下和右上分别为r、l、t、b和tr。默认值为r
# chart.legend.position = 'tr'

## chart.add_data(values)

## 设置图例(注意 通过以下方式设置数据 不可与”chart.add_data(values)“共用
## 否则会导致新图例与”chart.add_data(values)“生成的默认图例共存)
for index in range(2,4):
    name = sheet.cell(row=1, column=index).value
    seriesObj = openpyxl.chart.Series(list(values.cols)[index-2], title=name)
    chart.append(seriesObj)

# 以第1列 作为x轴展示(需要add_data后设置)
x_label = openpyxl.chart.Reference(sheet, min_row=2, min_col=1, max_row=5, max_col=1)
chart.set_categories(x_label)

sheet.add_chart(chart, 'I1') # I1 表示放置位置的单元格
wb.save("./youtube_mp3_ds_test1.xlsx")

在这里插入图片描述

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

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

相关文章

2019年3月全国计算机等级考试真题(C语言二级)

2019年3月全国计算机等级考试真题(C语言二级) 第1题 负责数据库中查询操作的数据库语言是 A. 数据定义语言 B. 数据管理语言 C. 数据操纵语言 D. 数据控制语言 正确答案:C 第2题 有关系如下图所示,其违反了哪一类完整性约束 …

c++——静态成员变量、静态成员函数和const修饰的静态成员变量

一、c静态成员变量 在C中,静态成员变量(Static Member Variable)是类的一种特殊类型的成员变量,它被类的所有实例共享,而不是每个实例都有自己的副本。静态成员变量在类的所有对象之间保持唯一的状态,具有…

ElementPlusError 解决: [ElForm] model is required for validate to work 的三种方式

1、问题描述: 其一、报错为: ElementPlusError: [ElForm] model is required for validate to work. 中文为: ElementPlusError:验证工作需要 [ElForm] 模型 其二、问题描述为: 在 form 表单中需要进行规则校验&a…

分布式锁系列之Redis分布式锁

目录 介绍 模拟订单超卖场景 代码版 不加锁情况 synchronized加锁 ​编辑 lock加锁 整合Mysql版 不加锁版 synchronized加锁 lock加锁版 jvm加锁失效情况 多例模式 事务 集群搭建 书写sql解决集群超卖 使用悲观锁select ...for update ​编辑 不加悲观锁情况 使用…

备份或同步数据?跨国大文件传输的不同需求与解决方案

信息化时代的到来,使得许多个人、组织、企业在日常生活中都需要对数据进行备份或同步。但不同的应用场景和需求,也需要不同的备份和同步方式。而在跨国大文件传输方面,更是需要根据不同需求选择合适的传输方案。下面将分别介绍备份与同步数据…

第一章MyBatis概述

框架 Java常用框架 SSM三大框架:SpringSpringMVCMyBatisSpringBootSpringCloud 框架简单来说就是提前封装好的通用代码,提高我们的开发的效率(站在巨人的肩膀上) 框架一般以jar包的形式存在 三层架构 代码封装主要为了降低代…

MQTT 常用客户端库介绍 (全面涵盖c,c++,java,c#,python)

MQTT(Message Queuing Telemetry Transport)是一种轻量级的通信协议,被广泛应用于物联网和分布式系统中。它以其简单、可靠和高效的特性而备受推崇,成为连接设备和应用程序的首选协议。MQTT的重要性不言而喻,它为实时通…

K8S应用笔记 —— 签发自签名证书用于Ingress的https配置

一、需求描述 在本地签发自命名证书,用于K8S集群的Ingress的https配置。 前提条件: 完成K8S集群搭建。完成证书制作机器的openssl服务安装。 二、自签名证书制作 2.1 脚本及配置文件准备 2.1.1 CA.sh脚本准备 注意事项: openssl服务默认CA…

【vim 学习系列文章 5 - cscope 过滤掉某些目录】

文章目录 cscope 过滤目录介绍 cscope 过滤目录介绍 第一步创建自己的cscope脚本~/.local/bin/cscope.sh,如下: function my_cscope() {CODE_PATHpwdecho "$CODE_PATH"echo "start cscope...."if [ ! -f "$CODE_PATH/cscope.…

qt实现9×9数独游戏

qt实现的数独小游戏&#xff0c;资源有可下载直接跑的exe&#xff08;enigma已经打包好&#xff09;&#xff0c;源码可私信 部分代码 #include "widget.h" #include "ui_widget.h" #include"form.h" #include<QDebug> #include<QPush…

数据结构——二叉搜索树(附带C++实现版本)

文章目录 二叉搜索树概念 二叉树的实际应用二叉树模拟实现存储结构二叉搜索树构成二叉搜索树的查找插入操作中序遍历二叉树的删除循环(利用左子树最右节点&#xff09;递归(利用右子树根节点) 二叉树拷贝二叉树资源的销毁 二叉树实现完整代码总结 二叉搜索树 概念 二叉搜索树…

LVS-DR+keepalived实现高可用负载群集

VRRP 通信原理&#xff1a; VRRP就是虚拟路由冗余协议&#xff0c;它的出现就是为了解决静态路由的单点故障。 VRRP是通过一种竞选的一种协议机制&#xff0c;来将路由交给某台VRRP路由。 VRRP用IP多播的方式&#xff08;多播地址224.0.0.18&#xff09;来实现高可用的通信&…

opencv运动目标检测-背景建模

背景建模 帧差法 由于场景中的目标在运动&#xff0c;目标的影像在不同图像帧中的位置不同。该类算法对时间上连续的两帧图像进行差分运算&#xff0c;不同帧对应的像素点相减&#xff0c;判断灰度差的绝对值&#xff0c;当绝对值超过一定阈值时&#xff0c;即可判断为运动目…

Java虚拟机(JVM):垃圾收集算法

目录 一、分代收集理论 二、标记-清除算法 三、标记-复制算法 四、标记-整理算法 一、分代收集理论 分代收集理论建立在两个分代假说之上&#xff1a; 1、弱分代假说&#xff1a;绝大多数对象都是朝生夕灭的。 2、强分代假说&#xff1a;熬过越多次垃圾收集过程的对象就…

Python中数据结构列表详解

列表是最常用的 Python 数据类型&#xff0c;它用一个方括号内的逗号分隔值出现&#xff0c;列表的数据项不需要具有相同的类型。 列表中的每个值都有对应的位置值&#xff0c;称之为索引&#xff0c;第一个索引是 0&#xff0c;第二个索引是 1&#xff0c;依此类推。列表都可…

C语言之指针进阶篇(1)

目录​​​​​​​ 引言 字符指针 指针数组 数组指针 数组指针的定义 &数组名vs数组名 数组指针的使用 一维数组使用 二维数组使用 一维数组传参 二维数组传参 总结 数组参数 一维数组传参 二维数组传参 指针参数 一级指针传参 二级指针传参 引言 今…

Jmeter对websocket进行测试

JMeterWebSocketSampler-1.0.2-SNAPSHOT.jar下载 公司使用websocket比较奇怪&#xff0c;需要带认证信息进行长连接&#xff0c;通过websocket插件是请求失败&#xff0c;如下图&#xff0c;后面通过代码实现随再打包jar包完成websocket测试 本地实现代码如下&#xff1a; pa…

总结,由于顺丰的问题,产生了电脑近期一个月死机问题集锦

由于我搬家&#xff0c;我妈搞顺丰发回家&#xff0c;但是没有检查有没有坏&#xff0c;并且我自己由于不可抗力因素&#xff0c;超过了索赔时间&#xff0c;反馈给顺丰客服&#xff0c;说超过了造成了无法索赔的情况&#xff0c;现在总结发生了损坏配件有几件&#xff0c;显卡…

Java 项目日志实例基础:Log4j

点击下方关注我&#xff0c;然后右上角点击...“设为星标”&#xff0c;就能第一时间收到更新推送啦~~~ 介绍几个日志使用方面的基础知识。 1 Log4j 1、Log4j 介绍 Log4j&#xff08;log for java&#xff09;是 Apache 的一个开源项目&#xff0c;通过使用 Log4j&#xff0c;我…

奥威BI数据可视化工具:个性化定制,打造独特大屏

每个人都有自己独特的审美&#xff0c;因此即使是做可视化大屏&#xff0c;也有很多人希望做出不一样的报表&#xff0c;用以缓解审美疲劳的同时提高报表浏览效率。因此这也催生出了数据可视化工具的个性化可视化大屏制作需求。 奥威BI数据可视化工具&#xff1a;个性化定制&a…