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:数据分析与可视化编写代码回答下面的问题…...

HBuilderX安装(uni-app和小程序开发)
下载HBuilderX 访问官方网站:https://www.dcloud.io/hbuilderx.html 根据您的操作系统选择合适版本: Windows版(推荐下载标准版) Windows系统安装步骤 运行安装程序: 双击下载的.exe安装文件 如果出现安全提示&…...
Element Plus 表单(el-form)中关于正整数输入的校验规则
目录 1 单个正整数输入1.1 模板1.2 校验规则 2 两个正整数输入(联动)2.1 模板2.2 校验规则2.3 CSS 1 单个正整数输入 1.1 模板 <el-formref"formRef":model"formData":rules"formRules"label-width"150px"…...
Xen Server服务器释放磁盘空间
disk.sh #!/bin/bashcd /run/sr-mount/e54f0646-ae11-0457-b64f-eba4673b824c # 全部虚拟机物理磁盘文件存储 a$(ls -l | awk {print $NF} | cut -d. -f1) # 使用中的虚拟机物理磁盘文件 b$(xe vm-disk-list --multiple | grep uuid | awk {print $NF})printf "%s\n"…...
现有的 Redis 分布式锁库(如 Redisson)提供了哪些便利?
现有的 Redis 分布式锁库(如 Redisson)相比于开发者自己基于 Redis 命令(如 SETNX, EXPIRE, DEL)手动实现分布式锁,提供了巨大的便利性和健壮性。主要体现在以下几个方面: 原子性保证 (Atomicity)ÿ…...
人工智能--安全大模型训练计划:基于Fine-tuning + LLM Agent
安全大模型训练计划:基于Fine-tuning LLM Agent 1. 构建高质量安全数据集 目标:为安全大模型创建高质量、去偏、符合伦理的训练数据集,涵盖安全相关任务(如有害内容检测、隐私保护、道德推理等)。 1.1 数据收集 描…...
6个月Python学习计划 Day 16 - 面向对象编程(OOP)基础
第三周 Day 3 🎯 今日目标 理解类(class)和对象(object)的关系学会定义类的属性、方法和构造函数(init)掌握对象的创建与使用初识封装、继承和多态的基本概念(预告) &a…...

Python训练营-Day26-函数专题1:函数定义与参数
题目1:计算圆的面积 任务: 编写一个名为 calculate_circle_area 的函数,该函数接收圆的半径 radius 作为参数,并返回圆的面积。圆的面积 π * radius (可以使用 math.pi 作为 π 的值)要求:函数接收一个位置参数 radi…...
写一个shell脚本,把局域网内,把能ping通的IP和不能ping通的IP分类,并保存到两个文本文件里
写一个shell脚本,把局域网内,把能ping通的IP和不能ping通的IP分类,并保存到两个文本文件里 脚本1 #!/bin/bash #定义变量 ip10.1.1 #循环去ping主机的IP for ((i1;i<10;i)) doping -c1 $ip.$i &>/dev/null[ $? -eq 0 ] &&am…...
React父子组件通信:Props怎么用?如何从父组件向子组件传递数据?
系列回顾: 在上一篇《React核心概念:State是什么?》中,我们学习了如何使用useState让一个组件拥有自己的内部数据(State),并通过一个计数器案例,实现了组件的自我更新。这很棒&#…...

LeetCode - 148. 排序链表
目录 题目 思路 基本情况检查 复杂度分析 执行示例 读者可能出的错误 正确的写法 题目 148. 排序链表 - 力扣(LeetCode) 思路 链表归并排序采用"分治"的策略,主要分为三个步骤: 分割:将链表从中间…...