当前位置: 首页 > news >正文

15.使用读写包操作Excel文件:OpenPyXL 包

一 OpenPyXL 和 XlsxWriter

想写入 xlsx 或者 xlsm 文件,就需要在 OpenPyXL 和 XlsxWriter 中做出选择。

OpenPyXL 既可以读也可以写 Excel 文件的包。可以用它来编辑一些简单的Excel 文件。

XlsxWriter 使用的是从 0 开始的单元格索引, 而 OpenPyXL 使用的是从 1 开始的单元格索引,一定要在切换两个包时考虑到这一点。

OpenPyXL 相比,XlsxWriter 在写入 xlsm 文件时必须采用一种更复杂的方法。

1.这两个包有相似的功能,但是各自又有一些对方所没有的特性

2.如果同时安装了 OpenPyXL 和 XlsxWriter,那么 pandas 默认使用 XlsxWriter

如果你想亲自选择 pandas 所使用的包,则可以在 read_excel 或 to_excel,以及 ExcelFile 或 ExcelWriter 的 engine 参数中指定所选包。engine(引擎) 是小写的包名,因此如果要用 OpenPyXL 而不是 XlsxWriter 来写文件,则需要执行如下代码:


 二 OpenPyXL 和 xlrdxlwt 、xlutils

OpenPyXL 可以为 xlsx 格式提供读、写和编辑的功能。如果将 xlrdxlwt xlutils 结合起来,它们也可以为旧式 xls 格式的文件提供类似的功能。xlrd 读、xlwt 写和 xluils 编辑 xls 文件。


三 如何使用OpenPyXL

1.使用 OpenPyXL 读取文件

1.导入库

import pandas as pd
import openpyxl
import excel
import datetime as dt

2.打开工作簿

book = openpyxl.load_workbook("xl/stores.xlsx", data_only=True)
print(book)

要获得单元格的值,需要使用 data_only=True 参数来打开工作簿,其默认值是 False,此时会返回单元格的公式而不是值。

输出结果:

这段输出确认了你已经成功使用 openpyxl.load_workbook 函数加载了一个 Excel 工作簿。

data_only=True 参数表示加载工作簿时,将只读取公式计算后的值,而不是公式本身。在 Excel 中,单元格可以包含公式(如 =SUM(A1:A10)),这些公式会计算出结果并显示在单元格中。当使用 data_only=True 加载工作簿时,openpyxl 会忽略单元格中的公式,只读取并返回公式计算后的值。即使单元格中包含公式,你访问该单元格时也会得到公式已经计算好的结果,而不是公式本身。

这个 book 对象包含了工作簿中的所有工作表和数据,你可以通过它进一步访问和操作这些数据。

print(book)为什么没有打印出工作簿中的所有工作表和数据?

print(book)语句打印的是 book 对象的内存地址,而不是工作簿中的内容。openpyxl 的 Workbook 对象本身并不直接包含工作簿数据的字符串表示形式,而是提供了方法和属性用于访问这些数据。

3.通过名称或索引(从0开始)获取工作表对象

sheet = book["2019"]
sheet = book.worksheets[0]

4.获取所有工作表名称的列表

print(book.sheetnames)

5.遍历所有工作表对象

openpyxl 使用的是 title 而不是 name 。
打印每个工作表的标题(名称)。输出结果显示了工作表的名称:20192020 和 2019-2020
for i in book.worksheets:
    print(i.title)
'''
2019
2020
2019-2020

'''

6.获取维度

print(sheet.max_row, sheet.max_column)

'''
8 6

'''

7.读取单个单元格的值,分别使用的是A1这种字符串表示法,以及单元格索引(从1开始)

print(sheet["B6"].value)
print(sheet.cell(row=6, column=2).value)

'''
Boston
Boston

'''

8.使用 excel 模块来读取一个单元格区域的值

excel 模块是自定义模块。

data = excel.read(book["2019"], (2, 2), (8, 6))
print(data)

嵌套列表输出。
打印前两行:
data = excel.read(book["2019"], (2, 2), (8, 6))
print(data[:2])

'''
[['Store', 'Employees', 'Manager', 'Since', 'Flagship'], ['New York', 10, 'Sarah', datetime.datetime(2018, 7, 20, 0, 0), False]]

'''

2.使用 OpenPyXL 写入文件

假设你正在使用 Word 编写一份报告。你在软件中输入文字、调整格式、插入图片等,所有这些操作都是在软件的内存中完成的,而不是直接在你的硬盘上修改文件。当你完成报告并决定保存时,软件会将内存中构建好的报告数据写入到你的硬盘上,形成一个新的或更新后的文件。这个过程与 OpenPyXL 操作 Excel 文件非常相似。在内存中构建文件的好处是,你可以随时撤销、重做或尝试不同的操作,而不必担心会立即影响到硬盘上的文件。当你满意你的操作结果后,再将其保存到硬盘上即可。

1.导入库

import openpyxl
from openpyxl.drawing.image import Image
from openpyxl.chart import BarChart, Reference
from openpyxl.styles import Font, colors
from openpyxl.styles.borders import Border, Side
from openpyxl.styles.alignment import Alignment
from openpyxl.styles.fills import PatternFill
import excel

2.实例化工作簿:创建一个新的工作簿

book = openpyxl.load_workbook("xl/stores.xlsx", data_only=True)

book = openpyxl.Workbook()

补充:编程中的实例化

类是一个模板,用于定义对象的属性和行为。而实例化是指根据这个类创建一个具体的对象。这个对象继承了类的所有属性和方法,并且可以被独立操作和使用。

Workbook 是 OpenPyXL 库中定义的一个类,book = openpyxl.Workbook() 这行代码就是实例化操作。

假设你有一个“汽车设计图纸”(编程中的类)。这个设计图纸定义了汽车的所有特征和功能,比如发动机、轮子、座位、方向盘等。

设计图纸(类):就像 Workbook 类一样,它是一个模板,描述了汽车(或工作簿)应该如何构建。

制造汽车(实例化):根据这个设计图纸,工厂会制造出一辆具体的汽车。这辆汽车拥有设计图纸中定义的所有特征和功能,但它是一个独立的实体,可以独立运行和使用。

book = openpyxl.Workbook() 就相当于工厂根据设计图纸制造了一辆汽车。book 就是这辆具体的汽车(或工作簿对象),你可以对它进行操作,比如添加工作表、填写数据等。

3.创建第一张工作表并赋予它一个名称

sheet = book.active
sheet.title = "Sheet1"

book.active:获取当前工作簿中活动的工作表。这行代码将活动工作表对象赋值给变量 sheet,之后你就可以通过 sheet 变量来操作这个工作表了。

4.使用A1表示法和单元格索引 (从1开始)写入各个单元格

sheet["A1"].value = "Hello 1"
sheet.cell(row=2, column=1, value="Hello 2")

5.格式化:填充颜色、对齐、边框和字体

font_format = Font(color="FF0000", bold=True)
thin = Side(border_style="thin", color="FF0000")
sheet["A3"].value = "Hello 3"
sheet["A3"].font = font_format
sheet["A3"].border = Border(top=thin, left=thin,right=thin, bottom=thin)
sheet["A3"].alignment = Alignment(horizontal="center")
sheet["A3"].fill = PatternFill(fgColor="FFFF00", fill_type="solid")

使用 OpenPyXL 库来格式化 Excel 工作表中的单元格 A3

font_format = Font(color="FF0000", bold=True)

定义单元格文本的字体格式。

color="FF0000":设置字体颜色为红色(使用 RGB 十六进制代码)。

bold=True:将字体设置为粗体。

thin = Side(border_style="thin", color="FF0000")

定义单元格边框的样式。

border_style="thin":设置边框样式为细线。

color="FF0000":设置边框颜色为红色。

sheet["A3"].value = "Hello 3"
sheet["A3"].font = font_format

设置单元格 A3 的值为字符串 "Hello 3"

将单元格 A3 的字体格式设置为之前定义的 font_format 对象。

sheet["A3"].border = Border(top=thin, left=thin, right=thin, bottom=thin)

.border:是单元格对象的一个属性,用于设置或获取单元格的边框样式。通过给这个属性赋值,你可以改变单元格的边框样式。

Border 是OpenPyXL 中的一个类,用于定义单元格的边框样式。top=thinleft=thinright=thinbottom=thin:这些参数分别设置单元格的顶部、左侧、右侧和底部边框。thin 是一个 Side 对象,之前通过 Side(border_style="thin", color="FF0000") 创建。它定义了边框的样式为细线,并且颜色为红色。

sheet["A3"].alignment = Alignment(horizontal="center")

设置单元格 A3 的文本水平居中对齐。

sheet["A3"].fill = PatternFill(fgColor="FFFF00", fill_type="solid")

设置单元格 A3 的填充样式。

fgColor="FFFF00":设置前景颜色为黄色(使用 RGB 十六进制代码)。

fill_type="solid":将填充类型设置为实心,这样整个单元格会被黄色填充。

6.数字格式化(使用Excel的格式化字符串)

sheet["A4"].value = 3.3333
sheet["A4"].number_format = "0.00"

sheet["A4"].value = 3.3333

 这行代码将单元格 A4 的值设置为浮点数 3.3333。通过这行代码,单元格 A4 将显示数字 3.3333

sheet["A4"] 访问工作表 sheet 中的单元格 A4.value 属性用于设置或获取单元格的值。

sheet["A4"].number_format = "0.00"

这行代码设置单元格 A4 的数值格式为 "0.00"

.number_format 属性用于设置或获取单元格的显示格式。

"0.00" 是一个格式代码,指示 Excel 以两位小数的形式显示该数值。这意味着,尽管单元格中的实际值是 3.3333,它将在 Excel 中显示为 3.33,因为格式代码限制了小数位数为两位。

7.日期格式化(使用Excel的格式化字符串)

sheet["A5"].value = dt.date(2016, 10, 13)
sheet["A5"].number_format = "mm/dd/yy"

sheet["A5"].value = dt.date(2016, 10, 13)

单元格 A5 将存储一个表示 2016 年 10 月 13 日的日期值。

sheet["A5"] 访问工作表 sheet 中的单元格 A5.value 属性用于设置或获取单元格的值。

dt.date(2016, 10, 13) 使用 Python 的 datetime 模块创建一个日期对象。

sheet["A5"].number_format = "mm/dd/yy"

.number_format 属性用于设置或获取单元格的显示格式。

"mm/dd/yy" 是一个格式代码,指示 Excel 以“月/日/年”的形式显示日期。

单元格 A5 中的日期将显示为 10/13/16,对应的格式是月/日/两位数的年份。

8.在 Excel 工作表的单元格中设置公式:必须使用以逗号分隔的英文公式名称

sheet["A6"].value = "=SUM(A4, 2)"

=SUM(A4, 2) 是一个 Excel 公式,被赋值给单元格 A6

在这个公式中,SUM(A4, 2) 的作用是计算单元格 A4 的值加上数字 2

9.在 Excel 工作表中的特定单元格插入一张图片

sheet.add_image(Image("images/python.png"), "C1")

.add_image() 是一个方法,用于在工作表中插入图片。

Image("images/python.png") 创建一个图片对象,这个对象表示磁盘上的一张图片文件。

"C1" 是 Excel 工作表中的目标单元格,图片将被插入到这个单元格的起始位置。

为什么插入的图片不在C1这个单元格,而是自由移动的状态?

在 Excel 中,插入的图片、形状和其他对象是作为“浮动”对象处理的。它们不依赖于单元格进行定位,而是可以在工作表上自由移动和调整。虽然可以指定一个起始单元格(如 C1),但这只是设置图片的初始锚点位置。图片本身仍然可以独立于单元格进行移动和调整。

10.二维列表(使用excel模块)

data = [[None, "North", "South"],["Last Year", 2, 5],["This Year", 3, 6]]
excel.write(sheet, data, "A10")

将一个二维数据列表 data 写入到 Excel 工作表的指定位置。

data 是一个包含数据的二维列表:

第一行:[None, "North", "South"],其中 None 表示该单元格可能为空。

第二行:["Last Year", 2, 5]

第三行:["This Year", 3, 6]

excel.write(sheet, data, "A10") 是将 data 列表中的内容写入到工作表 sheet 中,起始位置为单元格 A10

11.图表

chart = BarChart()
chart.type = "col"
chart.title = "Sales Per Region"
chart.x_axis.title = "Regions"
chart.y_axis.title = "Sales"
chart_data = Reference(sheet, min_row=11, min_col=1,max_row=12, max_col=3)
chart_categories = Reference(sheet, min_row=10, min_col=2,max_row=10, max_col=3)
chart.add_data(chart_data, titles_from_data=True, from_rows=True)
chart.set_categories(chart_categories)
sheet.add_chart(chart, "A15")

chart = BarChart()
chart.type = "col"
chart.title = "Sales Per Region"
chart.x_axis.title = "Regions"
chart.y_axis.title = "Sales"

chart = BarChart():创建一个 BarChart 对象实例。默认创建一个垂直柱状图。

chart.type = "col":设置图表类型为柱状图。在创建 BarChart 时默认就是柱状图,但这一行明确指定了图表类型。

chart.title = "Sales Per Region":设置图表的标题为 "Sales Per Region"。这将显示在图表顶部。

chart.x_axis.title = "Regions":设置 X 轴的标题为 "Regions"。这表示数据水平轴的分类标签。

chart.y_axis.title = "Sales":设置 Y 轴的标题为 "Sales"。这表示数据垂直轴的数值。

chart_data = Reference(sheet, min_row=11, min_col=1,max_row=12, max_col=3)

chart_data 引用了 Excel 表格中 A11:C12 这个区域的数据。

Reference:openpyxl.chart.reference.Reference 是用来定义 Excel 图表的数据范围的类。

sheet:表示引用的数据所在的工作表对象。

min_row=11, min_col=1:表示引用范围的起始单元格,从第 11 行的第 1 列开始(即 A11 单元格)。

max_row=12, max_col=3:表示引用范围的结束单元格,到第 12 行的第 3 列结束(即 C12 单元格)。

chart_data:保存了指定的单元格范围,最终这个范围会用作图表的数据源。

chart_categories = Reference(sheet, min_row=10, min_col=2,max_row=10, max_col=3)

因此,chart_categories 引用了 Excel 表格中 B10:C10 这个区域的数据。

min_row=10, min_col=2:表示引用范围的起始单元格,从第 10 行的第 2 列开始(即 B10 单元格)。

max_row=10, max_col=3:表示引用范围的结束单元格,到第 10 行的第 3 列结束(即 C10 单元格)。

chart_categories:保存了指定的单元格范围,通常用作图表的分类轴(如 X 轴的标签)。

chart.add_data(chart_data, titles_from_data=True, from_rows=True)
chart.set_categories(chart_categories)
sheet.add_chart(chart, "A15")

chart.add_data(chart_data, titles_from_data=True, from_rows=True):将数据添加到图表中。

补充:titles_from_data 和 from_rows 参数

假设数据如下:

titles_from_data=True 表示从数据中提取标题(通常是第一行),用作系列的名称。from_rows=True 表示数据是按行组织的。

titles_from_data=True, from_rows=True:

图表会从第 11 行提取标题,即 "X", "10", "20",并将它们用作系列名称或分类。每个系列对应一行数据,例如,一个系列名为 X,其值为 10, 20

titles_from_data=True, from_rows=False:

图表会从第 1 列提取标题,即 "X", "Y",并将它们用作分类轴标签。每个系列对应一列数据,例如,一个系列名为 B,其值为 10, 30

chart.set_categories(chart_categories):设置 X 轴标签。chart_categories 包含类别的数据。

sheet.add_chart(chart, "A15"):将图表添加到工作表中,并将其放置在单元格 A15。这指定了图表在工作表中的起始位置。

12.保存工作簿在磁盘上创建文件

book.save("openpyxl.xlsx")

3.使用 openpyxl 库创建一个 Excel 模板文件(.xltx 格式)

.xltx 是 Excel 模板文件的扩展名。保存为这种格式的文件可以在 Excel 中作为模板使用,用户可以基于此模板创建新的工作簿。

4.使用 OpenPyXL 编辑文件

OpenPyXL 首先会读取所有它可以理解的数据,然后再将文件数据从头到尾写回去,其间你做出的所有更改也会包含其中。

如果你的工作表中包含图表或者其他高级内容,那么 OpenPyXL 的功能就显得非常有限了,这些内容要么会被修改,要么会被直接丢弃。例如,在 OpenPyXLv3.0.5 版本中,图表会被重命名且标题会被丢弃。

1.编辑 Excel 文件的示例

2..xlsm 格式的文件处理

如何加载和修改一个包含 VBA 宏的 Excel 文件(.xlsm 格式),并在保存时保持其 VBA 宏功能。

使用 openpyxl.load_workbook() 加载一个已经存在的 Excel 文件 xl/macro.xlsm

keep_vba=True 参数告诉 openpyxl 在加载文件时要保留其 VBA 宏。因为在默认情况下openpyxl 不会加载或保留 VBA 代码。

.xlsm 文件格式是 Excel 启用宏的工作簿,可以包含 VBA 代码。

openpyxl 只能加载和保存包含 VBA 的文件,但不能创建或修改 VBA 代码。

补充:VBA 宏功能

VBA 宏功能是一种自动化工具,它允许用户通过编写代码来自动执行一系列在 Microsoft Office(如 Excel、Word、Access 等)中的操作。

宏是一个自动化任务的脚本,通过编写VBA代码创建。

相关文章:

  • 麒麟系统利用pycharm生成deb文件
  • 树莓派上的 TensorFlow Lite:从零开始的摄像头图像识别
  • 深入解析 React Diff 算法:原理、优化与实践
  • 如何逐步迭代衍生出一个网络安全产品
  • Podman 运行redis 报错
  • 警惕!Ollama大模型工具的安全风险及应对策略
  • DataWhale 大语言模型 - GPT和DeepSeek模型介绍
  • Android Studio搭建环境并运行项目
  • Debain-12.9使用xinference部署重排模型/rerank
  • 程序编译生成的文件
  • 面试常见概念区分:并发与并行、同步与异步、阻塞与非阻塞、线程同步与互斥
  • 【MySQL】基本操作 —— DML 与约束
  • HashMap ,HashTable , ConcurrentHashMap 面试
  • C++ primer plus 内存模型和命名空间下
  • OSC32IN与OSC32OUT对于无源晶振而言有区别吗?
  • 数字滤波器的设计实现及应用(论文+仿真)
  • 在教育领域的大模型知识引擎 × DeepSeek应用
  • 显示模组bonding缺划专案
  • RabbitMQ入门:从安装到高级消息模式
  • SWPU 2022 新生赛
  • 新疆巴音郭楞州和硕县发生4.6级地震,震源深度10千米
  • 优质文化资源下基层,上海各区优秀群文团队“文化走亲”
  • 证监会副主席李明:近期将出台深化科创板、创业板改革政策措施
  • 全中国最好的十个博物馆展陈选出来了!
  • 菲律宾选举委员会公布中期选举结果,马科斯阵营选情未达预期
  • 海外考古大家访谈|冈村秀典:礼制的形成与早期中国