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")

在这里插入图片描述

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

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

相关文章

原型对象的简单了解

在前面学习java有一个概念叫做继承,方便我们对父类方法、变量等的调用。对前端的学习我们需要让对象可以访问和继承其他对象的属性和方法,就需要了解原型对象,以及原型链。 一、原型 构造函数通过原型分配的函数是所有对象所共享的。每一个构…

回归预测 | MATLAB实现SOM-BP自组织映射结合BP神经网络多输入单输出回归预测(多指标,多图)

回归预测 | MATLAB实现SOM-BP自组织映射结合BP神经网络多输入单输出回归预测(多指标,多图) 目录 回归预测 | MATLAB实现SOM-BP自组织映射结合BP神经网络多输入单输出回归预测(多指标,多图)效果一览基本介绍…

【css动画】向下的动态箭头

前言 使用css实现一组向下的动态箭头效果&#xff0c;如下图 思路 1.使用svg画箭头 2.设置keyframes&#xff0c;主要是每个箭头加不同的延时。 代码 <div class"down-arrow"><svg id"more-arrows"><polygonclass"arrow-top&quo…

Spark第三课

1.分区规则 1.分区规则 shuffle 1.打乱顺序 2.重新组合 1.分区的规则 默认与MapReduce的规则一致,都是按照哈希值取余进行分配. 一个分区可以多个组,一个组的数据必须一个分区 2. 分组的分区导致数据倾斜怎么解决? 扩容 让分区变多修改分区规则 3.HashMap扩容为什么必须…

[JavaWeb]【七】web后端开发-MYSQL

前言&#xff1a;MySQL是一种流行的关系型数据库管理系统,它的作用是存储和管理数据。在Web开发中,MySQL是必备的数据库技能之一,因为它可以帮助Web开发人员处理大量的数据,并且提供了强大的数据查询和管理功能。 一 数据库介绍 1.1 什么是数据库 1.2 数据库产品 二 MySQL概述…

vue3 实现简单瀑布流

一、整理思路 实际场景中&#xff0c;瀑布流一般由 父组件 提供 数据列表&#xff0c;子组件渲染每个图片都是根据容器进行 绝对定位 &#xff0c;从而定好自己的位置取出 屏幕的宽度&#xff0c;设定 图片的宽度 固定 为一个值&#xff0c;计算可以铺 多少列按列数 先铺上第一…

5G科技防汛,助力守护一方平安

“立秋虽已至&#xff0c;炎夏尚还在”&#xff0c;受台风席卷以及季节性影响全国多地正面临强降水的严峻挑战。“落雨又顺秋&#xff0c;绵绵雨不休”&#xff0c;正值“七下八上” 防汛关键时期&#xff0c;贵州省水文水资源局已全面进入备战状态。 为确保及时响应做好防汛抢…

Vue3 setup新特性简单应用

去官网学习→组合式 API&#xff1a;setup() | Vue.js 运行示例&#xff1a; 代码&#xff1a;App.vue <template><div class"home"><img alt"Vue logo" src"../assets/logo.png"><!-- msg 组件传递数据 --><Hell…

VBA_MF系列技术资料1-157

MF系列VBA技术资料 为了让广大学员在VBA编程中有切实可行的思路及有效的提高自己的编程技巧&#xff0c;我参考大量的资料&#xff0c;并结合自己的经验总结了这份MF系列VBA技术综合资料&#xff0c;而且开放源码&#xff08;MF04除外&#xff09;&#xff0c;其中MF01-04属于定…

MySQL 面试题

一、数据库基础 1、MySQL 有哪些数据库类型? (1) 整数类型&#xff1a; TINYINT 1 字节 SMALLINT 2 字节 MEDIUMINT 3 字节 INT 4 字节 BIGINT 8 字节 ① 任何整数类型都可以加上 UNSIGNED …

【学会动态规划】最长湍流子数组(23)

目录 动态规划怎么学&#xff1f; 1. 题目解析 2. 算法原理 1. 状态表示 2. 状态转移方程 3. 初始化 4. 填表顺序 5. 返回值 3. 代码编写 写在最后&#xff1a; 动态规划怎么学&#xff1f; 学习一个算法没有捷径&#xff0c;更何况是学习动态规划&#xff0c; 跟我…

在 IDEA 中使用 Git开发 图文教程

在 IDEA 中使用 Git开发 图文教程 一、连接远程仓库二、IDEA利用Git进行开发操作三、分支操作3.1 新建分支3.2 切换分支3.3 删除分支3.4 比较分支3.5 合并分支 四、常用快捷键 一、连接远程仓库 一、打开IDEA&#xff0c;进入目录&#xff1a;File ->New ->Project from…

opencv 矩阵运算

1.矩阵乘&#xff08;*&#xff09; Mat mat1 Mat::ones(2,3,CV_32FC1);Mat mat2 Mat::ones(3,2,CV_32FC1);Mat mat3 mat1 * mat2; //矩阵乘 结果 2.元素乘法或者除法&#xff08;mul&#xff09; Mat m Mat::ones(2, 3, CV_32FC1);m.at<float>(0, 1) 3;m.at…

浏览器控制台调试实用方法

许多程序员仅知道控制台的console.log&#xff0c;其实控制台API还包含一些其他实用方法&#xff0c; 这些方法在前端调试时会很有帮助。 目录 console.dir 查看对象属性和方法 输出DOM元素 console.error console.time和console.timeEnd console.log console.clear 总结…

(五)、深度学习框架源码编译

1、源码构建与预构建&#xff1a; 源码构建&#xff1a; 源码构建是通过获取软件的源代码&#xff0c;然后在本地编译生成可执行程序或库文件的过程。这种方法允许根据特定需求进行配置和优化&#xff0c;但可能需要较长的时间和较大的资源来编译源代码。 预构建&#xff1a; 预…

2023年05月 C/C++(二级)真题解析#中国电子学会#全国青少年软件编程等级考试

第1题:数字放大 给定一个整数序列以及放大倍数x,将序列中每个整数放大x倍后输出。 时间限制:1000 内存限制:65536 输入 包含三行: 第一行为N,表示整数序列的长度(N ≤ 100); 第二行为N个整数(不超过整型范围),整数之间以一个空格分开; 第三行包含一个整数(不超过整…

Vue2-全局事件总线、消息的订阅与发布、TodoList的编辑功能、$nextTick、动画与过渡

&#x1f954;&#xff1a;高度自律即自由 更多Vue知识请点击——Vue.js VUE2-Day9 全局事件总线1、安装全局事件总线2、使用事件总线&#xff08;1&#xff09;接收数据&#xff08;2&#xff09;提供数据&#xff08;3&#xff09;组件销毁前最好解绑 3、TodoList中的孙传父&…

【Git】Git中用到的一些命令

Git文件有四种状态&#xff1a; 未跟踪未修改&#xff08;已跟踪&#xff09;已修改&#xff08;已跟踪&#xff09;已暂存&#xff08;已跟踪&#xff09; 通常我们将项目clone下来就会处于已跟踪状态 1、git diff命令 git diff&#xff1a;查看没有暂存的文件更新哪些部分…

Spring Clould 部署 - Docker

视频地址&#xff1a;微服务&#xff08;SpringCloudRabbitMQDockerRedis搜索分布式&#xff09; 初识Docker-什么是Docker&#xff08;P42&#xff0c;P43&#xff09; 微服务虽然具备各种各样的优势&#xff0c;但服务的拆分通用给部署带来了很大的麻烦。 分布式系统中&…

[强网杯 2019]随便注

输入1‘ 输入1“ 和输入1 一样说明是由‘闭合 然后我们尝试输入select 这里提示过滤了select&#xff0c;说明联合查询&#xff0c;报错注入&#xff0c;布尔,时间盲注就都不可以使用了。我们只剩下了 堆叠注入。 或者将select编码绕开也可以。 按sql注入测试1 or 11 # ​然…