首页Python【Python计算生态】O...

【Python计算生态】OpenPyXL——Excel文件操作库

Python受欢迎的原因之一就是其计算生态丰富,据不完全统计,Python 目前为止有约13万+的第三方库。

本系列将会陆续整理分享一些有趣、有用的第三方库。

文章配套代码获取有以下两种途径:
  • 通过百度网盘获取:
链接:https://pan.baidu.com/s/1FSGLd7aI_UQlCQuovVHc_Q?pwd=mnsj 提取码:mnsj
  • 前往GitHub获取
https://github.com/returu/Python_Ecosystem





01
简介

openpyxl是一个用于读写Excel 2010及以上版本文件的Python第三方库,即.xlsx.xlsm.xltx和 .xltm格式。支持对Excel 文件进行创建、修改、格式设置等操作,是处理Excel文件的常用库。
直接使用pip安装:
pip install openpyxl

02
使用


  • 2.1 创建工作簿:

使用openpyxl时,只需导入Workbook类即可开始操作,而无需在文件系统中创建文件。

工作簿在创建时至少包含一个工作表。可以通过 Workbook.active 属性获取它。active属性的默认值为0,除非修改该值,否则通该方法始终会获取第一个工作表。

from openpyxl import Workbook
wb = Workbook()
wb.active
# 输出:<Worksheet "Sheet">

可以使用 Workbook.create_sheet() 方法创建新的工作表。创建时会自动为工作表分配名称,按顺序编号(MySheet、MySheet1、MySheet2等)。

ws1 = wb.create_sheet("MySheet")  # 默认插入到最后
ws2 = wb.create_sheet("MySheet", 0)  # 插入到第一个位置
ws3 = wb.create_sheet("MySheet", -1)  # 插入到倒数第二个位置

可以通过 Worksheet.title 属性更改名称:

ws1.title = "NewSheet_1"
ws2.title = "NewSheet_2"
ws3.title = "NewSheet_3"

一旦为工作表命名,可以通过工作簿的键获取它:

ws3 = wb["NewSheet_3"]
ws3
# 输出:<Worksheet "NewSheet_3">

可以通过 Workbook.sheetnames 属性查看工作簿中所有工作表的名称:

print(wb.sheetnames)
# 输出:['NewSheet_2', 'Sheet', 'NewSheet_3', 'NewSheet_1']

可以遍历工作簿中的工作表:

for sheet in wb:
    print(sheet.title)
# 输出:NewSheet_2
#      Sheet
#      NewSheet_3
#      NewSheet_1```

使用Workbook.copy_worksheet()方法,可以在同一个工作簿内复制工作表。

仅复制单元格(包括值、样式、超链接和注释)以及某些工作表属性(包括尺寸、格式和属性)。其他工作簿/工作表属性不会被复制,例如图像和图表。此外,不能在工作簿之间复制工作表,如果工作簿处于只读或只写模式,也无法复制工作表。

source = wb.active
target = wb.copy_worksheet(source)


  • 2.2 操作数据:


  • 访问单个单元格:

可以通过工作表的键直接访问单元格,例如,ws[‘A4’] 将返回 A4 单元格的内容,如果该单元格尚不存在,则会创建一个。访问单元格时可以直接为单元格赋值。

也可以使用 Worksheet.cell() 方法,通过行和列编号访问单元格。

# 访问 A4 单元格,并赋值为10
ws['A4'] = 11

# 访问 B4 单元格,并赋值为10
d = ws.cell(row=4, column=2, value=10)

需要注意的是,在内存中创建工作表时,它不包含任何单元格,当首次访问时才会创建单元格。由于该特性,逐个访问单元格会将它们全部创建在内存中,即使没有为它们赋值。例如,下面的代码将在内存中创建一个 100×100 的单元格网格,但实际上没有任何值。

for x in range(1, 101):
    for y in range(1, 101):
        ws.cell(row=x, column=y))


  • 访问多个单元格:

可以通过切片语法访问单元格范围:

# 选取 A1 到 C2 区域的单元格
cell_range = ws['A1':'C2']

也可以通过类似的方式获取行或列的范围:

colC = ws['B']
col_range = ws['A:C']
row10 = ws[2]
row_range = ws[1:3]

还可以使用 Worksheet.iter_rows() 方法:

# 遍历工作表中第 1 行到第 2 行、第 1 列到第 3 列这个矩形区域内的所有单元格。
for row in ws.iter_rows(min_row=1, max_col=3, max_row=2):
    for cell in row:
        print(cell)

# 输出:<Cell 'Sheet'.A1>
#      <Cell 'Sheet'.B1>
#      <Cell 'Sheet'.C1>
#      <Cell 'Sheet'.A2>
#      <Cell 'Sheet'.B2>
#      <Cell 'Sheet'.C2>
类似地,Worksheet.iter_cols() 方法(需要注意的是,出于性能原因,该方法在只读模式下不可用)将返回列:
for col in ws.iter_cols(min_row=1, max_col=3, max_row=2):
    for cell in col:
        print(cell)
# 输出:<Cell 'Sheet'.A1>
#      <Cell 'Sheet'.A2>
#      <Cell 'Sheet'.B1>
#      <Cell 'Sheet'.B2>
#      <Cell 'Sheet'.C1>
#      <Cell 'Sheet'.C2>

如果需要遍历文件的所有行或列,可以使用 Worksheet.rows 属性:

tuple(ws.rows)
# 输出:((<Cell 'Sheet'.A1>, <Cell 'Sheet'.B1>, <Cell 'Sheet'.C1>),
#       (<Cell 'Sheet'.A2>, <Cell 'Sheet'.B2>, <Cell 'Sheet'.C2>),
#       (<Cell 'Sheet'.A3>, <Cell 'Sheet'.B3>, <Cell 'Sheet'.C3>),
#       (<Cell 'Sheet'.A4>, <Cell 'Sheet'.B4>, <Cell 'Sheet'.C4>))

或者使用 Worksheet.columns 属性(需要注意的是,出于性能原因,该属性在只读模式下不可用):

tuple(ws.columns)
# 输出:((<Cell 'Sheet'.A1>, <Cell 'Sheet'.A2>, <Cell 'Sheet'.A3>, <Cell 'Sheet'.A4>),
#        (<Cell 'Sheet'.B1>, <Cell 'Sheet'.B2>, <Cell 'Sheet'.B3>, <Cell 'Sheet'.B4>),
#        (<Cell 'Sheet'.C1>, <Cell 'Sheet'.C2>, <Cell 'Sheet'.C3>, <Cell 'Sheet'.C4>))


  • 仅获取值:

如果只需要从工作表中获取值,可以使用 Worksheet.values 属性。它会迭代工作表中的所有行,但仅返回单元格的值:

for row in ws.values:
    for value in row:
        print(value)
# 输出:None
#       None
#       None
#       None
#       None
#       None
#       None
#       None
#       None
#       11
#       10
#       None

另外,Worksheet.iter_rows()Worksheet.iter_cols()都可以接受 values_only参数,仅返回单元格的值:

for row in ws.iter_rows(min_row=1, max_col=3, max_row=4, values_only=True):
    print(row)
# 输出:(None, None, None)
#       (None, None, None)
#       (None, None, None)
#       (11, 10, None)

一旦获取了 Cell 对象,可以通过value属性为其赋值:

c = ws['B2']
c.value = 'hello,world'
print(c.value)
# 'hello, world'

d = ws.cell(row=2, column=1, value=10)
d.value = 3.14
print(d.value)
#3.14


  • 2.3 保存到文件:

保存工作簿的最简单和最安全的方式是使用 Workbook.save() 方法:

wb.save('test.xlsx')


03
示例:

在该示例中,将数据添加到工作表中,然后将其绘制成图表,并设置单元格样式。
from openpyxl import Workbook

# ===== 1、创建一个新的工作簿,获取活动工作表 =====
wb = Workbook()
ws = wb.active
# 待添加的数据
treeData = [["Type""Leaf Color""Height"], ["Maple""Red", 549], ["Oak""Green", 783], ["Pine""Green", 1204]]
# =====================


# ===== 2、将数据输入到工作表中 =====
# 由于是一个列表的列表,可以简单地使用 Worksheet.append()方法,该方法会自动将列表中的元素按顺序填充到工作表的下一行。
for row in treeData:
    ws.append(row)
# =====================


# ==== 3、单元格样式设置 =====
# 导入 Font、Alignment 和 PatternFill 类,用于设置单元格的字体、对齐方式和填充样式
from openpyxl.styles import Font,Alignment,PatternFill

# 创建一个 Font 对象,设置字体为 Arial,字号为 12,加粗并设置颜色为红色
ft = Font(name="Arial", size=12, bold=True, color="FF0000")
# 创建一个 Alignment 对象,设置水平对齐方式为居中
alignment = Alignment(horizontal="center")
# 创建一个 PatternFill 对象,设置填充颜色为黄色(十六进制代码 FFFF00),填充类型为实心填充。
fill = PatternFill(start_color="FFFF00", fill_type="solid")
# 应用样式到表头行
for row in ws["A1:C1"]:
    for cell in row:
        cell.font = ft
        cell.alignment = alignment
        cell.fill = fill
# =====================


# ===== 4、创建图表 =====
# 导入 BarChart 和 Reference 类,BarChart 用于创建柱状图,Reference 用于引用工作表中的数据范围
from openpyxl.chart import BarChart, Reference
# 创建图表对象并设置属性
chart = BarChart() # 创建一个柱状图对象
chart.type = "col"# 设置图表类型为列柱状图
chart.title = "Tree Height"# 设置图表的标题
chart.y_axis.title = 'Height (cm)'# 设置图表的 Y 轴标题
chart.x_axis.title = 'Tree Type'# 设置图表的 X 轴标题
chart.legend = None # 不显示图表的图例
# =====================

# ==== 5、引用数据并添加到图表 =====
# 使用 Reference 类引用工作表中第 3 列(即 'Height' 列)从第 2 行到第 4 行的数据,作为图表的数值数据
data = Reference(ws, min_col=3, min_row=2, max_row=4, max_col=3)
# 使用 Reference 类引用工作表中第 1 列(即 'Type' 列)从第 2 行到第 4 行的数据,作为图表的类别数据
categories = Reference(ws, min_col=1, min_row=2, max_row=4, max_col=1)
# 将引用的数据添加到图表中
chart.add_data(data)
# 设置图表的类别数据
chart.set_categories(categories)
# =====================


# ===== 6、将图表添加到工作表中并保存工作簿 =====
# 将创建好的图表添加到工作表中,图表的左上角位置为单元格 E1
ws.add_chart(chart, "E1")
# 将工作簿保存为名为 TreeData.xlsx 的 Excel 文件
wb.save("TreeData.xlsx")

创建的 Excel 工作簿如下图所示


更多内容可以前往官方文档查看:

https://openpyxl.readthedocs.io/en/stable/

本篇文章来源于微信公众号: 码农设计师

RELATED ARTICLES

欢迎留下您的宝贵建议

Please enter your comment!
Please enter your name here

- Advertisment -

Most Popular

Recent Comments