Excel自动化办公——Openpyxl的基本使用
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'] += 1countryData[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).valueif 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 Fontwb = 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 PatternFillwb = 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, Borderwb = 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 Alignmentwb = 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 openpyxlwb = 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 openpyxlwb = 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 openpyxlwb = 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 openpyxlwb = 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 LegendEntrywb = 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).valueseriesObj = 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")

相关文章:
Excel自动化办公——Openpyxl的基本使用
Excel自动化办公——Openpyxl的基本使用 个人感觉,相比Pandas,openpyxl对Excel的操作更为细致,Pandas则更适用于统计计算; 01 基本环境02 Excel数据读取操作03 案例04 向Excel写入数据05 表数据定向修改06 单元格样式制定07 单元…...
解决Fastjson2 oom(Out Of Memory),支持大对象(LargeObject 1G)json操作
在使用Fastjson中的 JSON.toJSONString时,如果对象数据太大(>64M)会出现Out Of Memory,查看源码发现为JSONWriter中的判断代码 其中maxArraySize默认最大为64M,如果超过了就会抛出oom错误 如果fastjson过多的使用内存,也可能导致java堆内存溢出,所以这…...
SpringBoot + redis处理购物车逻辑
1、pom.xml <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId></dependency> 2、application.xml spring: characterEncodingutf-8&useSSLfalseredis:host: 127.0.…...
open cv学习 (五) 图像的阈值处理
图像的阈值处理 demo1 # 二值化处理黑白渐变图 import cv2 img cv2.imread("./img.png", 0) # 二值化处理 t1, dst cv2.threshold(img, 127, 255, cv2.THRESH_BINARY) cv2.imshow("img", img) cv2.imshow("dst", dst) cv2.waitKey() cv2.des…...
NVIDIA vGPU License许可服务器高可用全套部署秘籍
第1章 前言 近期遇到比较多的场景使用vGPU,比如Citrix 3D场景、Horizon 3D场景,还有AI等,都需要使用显卡设计研发等,此时许可服务器尤为重要,许可断掉会出现掉帧等情况,我们此次教大家部署HA许可服务器。 …...
基于CNN卷积神经网络的口罩检测识别系统matlab仿真
目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 5.算法完整程序工程 1.算法运行效果图预览 2.算法运行软件版本 matlab2022a 3.部分核心程序 ............................................................ % 循环处理每张输入图像 for…...
《HeadFirst设计模式(第二版)》第九章代码——迭代器模式
情景: 一家早餐店和一家午餐点准备合并在一起,两家的点菜的菜单实现方式如下: 首先,他们的菜单选项都基于同一个类: 菜单选项类 package Chapter9_IteratorPattern.Origin;/*** Author 竹心* Date 2023/8/17**/public class Men…...
Electron入门,项目启动。
electron 简单介绍: 实现:HTML/CSS/JS桌面程序,搭建跨平台桌面应用。 electron 官方文档: [https://electronjs.org/docs] 本文是基于以下2篇文章且自行实践过的,可行性真实有效。 文章1: https://www.cnbl…...
深入理解索引B+树的基本原理
目录 1. 引言 2. 为什么要使用索引? 3. 索引的概述 4. 索引的优点是什么? 4.1 降低数据库的IO成本,提高数据查找效率 4.2 保证数据库每一行数据的唯一性 4.3 加速表与表之间的连接 4.4 减少查询中分组与排序的执行时间 5. 索引的缺点…...
vue3 简易用对话框实现点击头像放大查看
设置头像悬停手势 img:hover{cursor: pointer;}效果: 编写对话框 <el-dialog class"bigAvatar"style"border-radius: 4px;"v-model"deleteDialogVisible"title"查看头像"top"5px"><div><img src&…...
opencv 矩阵运算
1.矩阵乘(*) Mat mat1 Mat::ones(2,3,CV_32FC1);Mat mat2 Mat::ones(3,2,CV_32FC1);Mat mat3 mat1 * mat2; //矩阵乘 结果 2.元素乘法或者除法(mul) Mat m Mat::ones(2, 3, CV_32FC1);m.at<float>(0, 1) 3;m.at…...
第四章 字符串part01
344.反转字符串 public void reverseString(char[] s) {int len s.length;int left 0;int right len-1;while (left < right){char tmp s[right];s[right] s[left];s[left] tmp;left;right--;} }反转字符串II 注意String不可变,因此可使用char数组或者St…...
Python3内置函数大全
吐血整理 Python3内置函数大全 1.abs()函数2.all()函数3.any()函数4.ascii()函数5.bin()函数6.bool()函数7.bytes()函数8.challable()函数9.chr()函数10.classmethod()函数11.complex()函数12.complie()函数13.delattr()函数14.dict()函数15.dir()函数16.divmod()函数17.enumer…...
什么是“新型基础设施”?建设重点是什么?
一是信息基础设施。主要是指基于新一代信息技术演化生成的基础设施,比如,以5G、物联网、工业互联网、卫星互联网为代表的通信网络基础设施,以人工智能、云计算、区块链等为代表的新技术基础设施,以数据中心、智能计算中心为代表的…...
混杂接口模式---vlan
策略在两个地方可以用--1、重发布 2、bgp邻居 2、二层可以干的,三层也可以干 3、未知单播:交换机的MAC地址表的记录保留时间是5分钟,电脑的ARP表的记录保留时间是2小时 4、route recursive-lookup tunnel 华为默认对于bgp学习来的路由不开启标…...
Greenplum多级分区表添加分区报错ERROR: no partitions specified at depth 2
一般来说,我们二级分区表都会使用模版,如果没有使用模版特性,那么就会报ERROR: no partitions specified at depth 2类似的错误。因为没有模版,必须要显式指定分区。 当然我们在建表的时候,如果没有指定,那…...
EV PV AC SPI CPI TCPI
SPI EV / PV CPI EV / ACCPI 1.25 SPI 0.8 PV 10 000 BAC 100 000EV PV * SPI 10 000 * 0.8 8000 AC EV / CPI 8000 / 1.25 6400TCPI (BAC - EV) / (BAC -AC) (100 000 - 8 000) / (100 000 - 6 400) 92 000 / 93 600 0.98290598...
【电商领域】Axure在线购物商城小程序原型图,品牌自营垂直电商APP原型
作品概况 页面数量:共 60 页 兼容软件:Axure RP 9/10,不支持低版本 应用领域:网上商城、品牌自营商城、商城模块插件 作品申明:页面内容仅用于功能演示,无实际功能 作品特色 本作品为品牌自营网上商城…...
Cpp基础Ⅰ之编译、链接
1 C是如何工作的 工具:Visual Studio 1.1 预处理语句 在.cpp源文件中,所有#字符开头的语句为预处理语句 例如在下面的 Hello World 程序中 #include<iostream>int main() {std::cout <"Hello World!"<std::endl;std::cin.get…...
用户新增预测(Datawhale机器学习AI夏令营第三期)
文章目录 简介任务1:跑通Baseline实操并回答下面问题:如果将submit.csv提交到讯飞比赛页面,会有多少的分数?代码中如何对udmp进行了人工的onehot? 任务2.1:数据分析与可视化编写代码回答下面的问题…...
内存分配函数malloc kmalloc vmalloc
内存分配函数malloc kmalloc vmalloc malloc实现步骤: 1)请求大小调整:首先,malloc 需要调整用户请求的大小,以适应内部数据结构(例如,可能需要存储额外的元数据)。通常,这包括对齐调整,确保分配的内存地址满足特定硬件要求(如对齐到8字节或16字节边界)。 2)空闲…...
Ubuntu系统下交叉编译openssl
一、参考资料 OpenSSL&&libcurl库的交叉编译 - hesetone - 博客园 二、准备工作 1. 编译环境 宿主机:Ubuntu 20.04.6 LTSHost:ARM32位交叉编译器:arm-linux-gnueabihf-gcc-11.1.0 2. 设置交叉编译工具链 在交叉编译之前&#x…...
synchronized 学习
学习源: https://www.bilibili.com/video/BV1aJ411V763?spm_id_from333.788.videopod.episodes&vd_source32e1c41a9370911ab06d12fbc36c4ebc 1.应用场景 不超卖,也要考虑性能问题(场景) 2.常见面试问题: sync出…...
逻辑回归:给不确定性划界的分类大师
想象你是一名医生。面对患者的检查报告(肿瘤大小、血液指标),你需要做出一个**决定性判断**:恶性还是良性?这种“非黑即白”的抉择,正是**逻辑回归(Logistic Regression)** 的战场&a…...
三维GIS开发cesium智慧地铁教程(5)Cesium相机控制
一、环境搭建 <script src"../cesium1.99/Build/Cesium/Cesium.js"></script> <link rel"stylesheet" href"../cesium1.99/Build/Cesium/Widgets/widgets.css"> 关键配置点: 路径验证:确保相对路径.…...
Debian系统简介
目录 Debian系统介绍 Debian版本介绍 Debian软件源介绍 软件包管理工具dpkg dpkg核心指令详解 安装软件包 卸载软件包 查询软件包状态 验证软件包完整性 手动处理依赖关系 dpkg vs apt Debian系统介绍 Debian 和 Ubuntu 都是基于 Debian内核 的 Linux 发行版ÿ…...
Cloudflare 从 Nginx 到 Pingora:性能、效率与安全的全面升级
在互联网的快速发展中,高性能、高效率和高安全性的网络服务成为了各大互联网基础设施提供商的核心追求。Cloudflare 作为全球领先的互联网安全和基础设施公司,近期做出了一个重大技术决策:弃用长期使用的 Nginx,转而采用其内部开发…...
听写流程自动化实践,轻量级教育辅助
随着智能教育工具的发展,越来越多的传统学习方式正在被数字化、自动化所优化。听写作为语文、英语等学科中重要的基础训练形式,也迎来了更高效的解决方案。 这是一款轻量但功能强大的听写辅助工具。它是基于本地词库与可选在线语音引擎构建,…...
【JVM面试篇】高频八股汇总——类加载和类加载器
目录 1. 讲一下类加载过程? 2. Java创建对象的过程? 3. 对象的生命周期? 4. 类加载器有哪些? 5. 双亲委派模型的作用(好处)? 6. 讲一下类的加载和双亲委派原则? 7. 双亲委派模…...
Linux nano命令的基本使用
参考资料 GNU nanoを使いこなすnano基础 目录 一. 简介二. 文件打开2.1 普通方式打开文件2.2 只读方式打开文件 三. 文件查看3.1 打开文件时,显示行号3.2 翻页查看 四. 文件编辑4.1 Ctrl K 复制 和 Ctrl U 粘贴4.2 Alt/Esc U 撤回 五. 文件保存与退出5.1 Ctrl …...
