openpyxl的使用

1 Excel的基本结构

Workbook:一个Excel电子表格文档被称为一个工作簿,一个工作簿保存在扩展名为 .xlsx 的文件中。

python openpyxl Hyperlink的用法 openpyxl详解_数据

Sheet:一个工作簿可以包含多张表(也称为工作表)。用户当前查看的表(或关闭Excel前最后查看的表),称为活动表

python openpyxl Hyperlink的用法 openpyxl详解_ide_02

Row:表格中的行,地址是从1开始的数字

Column:表格中的列,地址是从A开始的字母

Cell:单元格,特定的行和列组成的方格称为单元格。每个单元格都包含一个数字或文本值。单元格形成的网格和数据构成了表。

python openpyxl Hyperlink的用法 openpyxl详解_数据_03

2 安装openpyxl模块

Python没有自带openpyxl,所以需要单独进行安装才可正常使用。

Windows下打开命令行输入:

pip install openpyxl

Mac下打开终端输入:

pip3 install openpyxl

如果想要测试是否安装正确,可以在交互式环境下输入以下代码:

import openpyxl

如果该模块正确安装,则运行后不会返回任何错误消息

openpyxl官方文档链接:

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

3 读取一个已有的Excel表格

python openpyxl Hyperlink的用法 openpyxl详解_ide_04

简单示例

from openpyxl import load_workbook
# fileName 这里是指文件路径
fileName = "工作簿.xlsx"
# 以只读模式打开工作簿
wb = load_workbook(filename = fileName,read_only = True)
# sheetName 就是 sheet页的名称
sheetName = "Sheet1"
# 通过 工作表名 获取 工作表
ws = wb[sheetName]
# 按行读取 工作表的内容
for row in ws.rows:
    for cell in row:
        # 输出 单元格中的数据
        print(cell.value)

3.1 获取工作簿对象

在导入openpyxl模块后,就可以使用load_workbook()方法读取Excel文件。openpyxl.load_workbook()方法返回一个工作簿对象(也是一个workbook数据类型的值),为了方便后续的使用,我们通常将这个对象命名为wb。

注意:load_workbook()方法只能读取已有的Excel表格文件,无法创建新的Excel表格。

import openpyxl

wb = openpyxl.load_workbook(filename, read_only=False, keep_vba=False, data_only=False, keep_links=True)

openpyxl.load_workbook()方法可以接收多个参数进行读取设置

filename:字符串类型,读取Excel文件的文件路径,可使用相对路径或是绝对路径。

read_only:布尔类型,选择只读模式或是读写模式,选择只读模式可以提高查询速度,默认为False。

keep_vba:布尔类型,保留vba内容(这并不意味着可以使用它),默认为False。

data_only:布尔类型,如果设置为True则包含公式的单元格,显示最近计算结果或是None,如果设置为False 则单元格显示公式,默认为False。注意:data_only=False状态下打开,最后用save()函数保存了的话,原xlsx文件只剩下data_only=False的公式,如果想重新获取公式及结果,需要用Excel城西打开文件并保存。

keep_links:布尔类型,是否保留指向外部工作簿的链接。默认为True。

3.2 获取工作表对象

3.2.1 获取工作簿中的所有工作表

调用get_sheet_names()方法或者sheetnames属性可以取得工作簿中所有表名,返回为一个列表。

from openpyxl import load_workbook
# fileName 这里是指文件路径
fileName = "工作簿.xlsx"
# 以只读模式打开工作簿
wb = load_workbook(filename = fileName,read_only = True)
# 获取工作簿中所有的工作表,返回一个列表对象
wb.get_sheet_names()
wb.sheetnames
3.2.2 选中需要操作的工作表

每个工作表由一个Worksheet对象表示,可以通过类似字典的键或是方法来取得。最后,还可以通过wb.active获取活动表(关闭Excel前最后查看的表)

# 通过工作表名称去的工作表
sheet = wb.get_sheet_by_name('工作表名称')
sheet = wb['工作表名称']

# 获取工作簿中的活动表
sheet = wb.active
# 获取活动表的表名称
sheet.title
3.2.3 获取表格中的一些属性
# 获取表格的大小(表格存在数据的大小)
sheet.dimensions
# 单独获取最大行或列
sheet.max_row or sheet.max_column
# 设置表格为隐藏状态
sheet.sheet_state = 'hidden'
# 设置表格为显示状态
sheet.sheet_state = 'visible'

3.3 获取单元格对象

3.3.1 获取单元格对象

有了表格对象,就可以按照坐标或行列数来获取单元格对象

# 通过固定的行列坐标获取单元格对象
cell = sheet['A1']
# 通过数字的行列获取单元格对象
cell = sheet.cell(row=1,column=1)
# 为单元格赋值
cell.value = 'A1'
3.3.3 获取单元格的一些属性
# 获取单元格的行
cell.row
# 获取单元格的列
cell.column
# 获取单元格的坐标
cell.coordinate
3.3.4取一行或是一列的单元格,返回一个元组对象

可以将表格对象切片,取得电子表格中一行、一列或一个矩形区域中的所有单元格对象。然后可以通过循环遍历取得切片中的所有单元格。

# 取一列单元格
cells = sheet['A']
# 取一行单元格
cells = sheet[1]
# 取表格当中的所有列,一列为一组
cells = sheet.columns
# 取表格当中的所有行,一行为一组
cells = sheet.rows
# 已知单元格矩形范围坐标时
cells = sheet['A1:C5']
# 已知单元格起始与终结的行列数时
cells = sheet.iter_cols(min_row=1, max_row=5, min_col=1, max_col=3)
cells = sheet.iter_rows(min_row=1, max_row=5, min_col=1, max_col=3)

4 创建一个新的Excel表格

4.1 创建一个新表格

创建一个新的Excel表格需要使用openpyxl.Workbook()方法,实际上Workbook方法调用的是openpyxl自带的Excel模板文件。

当修改Excel表格中的内容的时候,电子表格文件不会自动保存,直到我们使用 save()工作簿方法。

import openpyxl
# 打开一个工作簿,由于是创建一个新的,所以不需要添加路径参数
wb = openpyxl.Workbook(encodin='utf-8')
# 获取活动表
ws = wb.active
# 修改活动表明湖曾
ws.title = 'test1'
# 修改 A1 单元格数据
ws['A1'] = 'A1'
# 查看当前所有表格名称
wb.get_sheet_names()
# 保存Excel文件
wb.save('test1.xlsx')

4.2 对表格对象的一些操作

4.2.1 创建表格

create_sheet()方法返回一个新的表格对象,名为SheetX,默认为工作簿的最后一个工作表。或者,可以利用index和title参数,指定新工作表的索引及名称

# 使用工作簿对象创建一个新的表格,表格名称为test2
wb.create_sheet(index=None,title='test2')

index:整数类型,设置新工作表索引,默认为None即放在最后,如果设置为0,则表格放置在最前。

title:字符串类型,设置新工作表名称,如果新工作表名称已存在,新工作表名称会自动变为title1。

4.2.2 删除表格

remove()方法中接收一个表格对象而不是表格名称的字符串。

wb = openpyxl.load_workbook('test.xlsx')
# 使用工作簿对象删除表格
wb.remove(wb['test2'])
wb.save('test.xlsx')
4.2.3 复制表格

copy_worksheet()方法接收一个表格对象并将其复制粘贴

wb = openpyxl.load_workbook('test.xlsx')
sheet = wb.active
# 复制选中表格
wb.copy_worksheet(sheet)
wb.save('test.xlsx')
4.2.4 表格中插入删除行和列

插入行和列

wb = openpyxl.load_workbook('test.xlsx')
sheet = wb.active

# 插入行
# 在idx行上方插入数量为amount的行
sheet.insert_rows(idx=2, amout=2)

# 插入列
# 在idx列左侧插入数量为amount的行
sheet.insert_cols(idx=2, amout=2)

wb.save('test.xlsx')

删除行和列

wb = openpyxl.load_workbook('test.xlsx')
sheet = wb.active

# 删除行
# 从idx行开始向下删除amount数量的行,包括idx这一行
sheet.delete_rows(idx=2, amout=2)

# 删除列
# 从idx列开始向右删除amount数量的列,包括idx这一列
sheet.delete_cols(idx=2, amout=2)

wb.save('test.xlsx')
4.2.5 为表格新增数据

新增数据即在已有表格中添加数据,只能使用load_workbook()方法读取Excel电子表格。

append()方法接收一个可变参数,包括但不限于列表、范围或生成器或字典

如果传入一个列表:从第一列开始顺序添加所有值,列表元素对应每一行

如果传入一个字典:值被分配给键(数字或字母)指示的列

注意:append一次只能添加一行的数据,如果想要多行添加,需要与循环或其他方法相结合实现。

wb = openpyxl.load_workbook('test.xlsx')
sheet = wb.active
# 在当前工作表数据的底部追加一组值
sheet.append(iterable)
# 追加数据
sheet.append([1,2,3])
sheet.append({'A':'这是A1'})

4.3 对单元格的一些操作

4.3.1 修改单元格数据及定义公式
wb = openpyxl.load_workbook('test.xlsx')
sheet = wb.active
cell = sheet['A1']
# 修改单元格数据
cell.value = 'A1'
# 在单元格中添加公式
cell.value = '=SUM(A2:C4)'
wb.save('test.xlsx')

# 查看openpyxl支持的公式
from openpyxl.utils import FORMULAE
FORMULAE
4.3.2 移动单元格

使用move_range()方法移动单元格

sheet.move_range(cell_range, rows=0, cols=0, translate=False)

wb = openpyxl.load_workbook('test.xlsx')
sheet = wb.active

# 将A1:C2范围的单元格,向下移动一行,向右移动2列
sheet.move_range('A1:C2', rows=1, cols=2)
4.3.3 冻结窗格

对于数据量过多而不能一屏显示的Excel电子表格,冻结需要的行或列是非常有帮助的。

使用freeze_panes属性,可以设置一个单元格坐标的字符串,冻结单元格坐标上方及左侧的行和列,但是单元格本身所在的行和列不会被冻结。

# 冻结行1
sheet.freeze_panes = 'A2'
# 冻结列A
sheet.freeze_panes = 'B1'
# 冻结列A和列B,行1
sheet.freeze_panes = 'C2'
# 不会冻结窗格
sheet.freeze_panes = 'A1'

5 单元格样式修改

设置某些单元格行或列的字体风格,可以帮助你强调电子表格中的重点区域。

这里需要使用openpyxl.styles中的Font()方法

注:下面几种样式(字体、填充、边框、位置等)实例一旦被创建实例的属性就不可更改,只能重新创建实例。

5.1 获取单元格字体风格

import openpyxl
wb = openpyxl.load_workbook('test.xlsx')
sheet = wb.active
cell = sheet['A1']
# 获取单元格字体所有属性
cell.font
# 获取字体对象
font = cell.font
# 获取字体名称
font.name
# 获取字体大小
font.size
# 字体是否加粗
font.bold
# 字体是否为斜体
font.italic

5.2 设置单元格字体风格

Font()方法可以设置单元格的字体风格,下面是一些常用的参数设置

# 导入需要的方法
from openpyxl.styles import Font
from openpyxl import load_workbook
# 加载一个Excel电子表格
wb = load_workbook('test.xlsx')
sheet = wb.active
cell = sheet['A1']
cell.value = 'CSDN'

# 设置一个字体风格,宋体,字号20,加粗,斜体,颜色为红色
font = Font(name='宋体',size=20, bold=True,italic=True,color='FF0000')
# 设置选中单元格的字体风格
cell.font = font
wb.save('test.xlsx')

name:字符串类型,传入所需设置的字体名称。

size:正整数类型,设置字体的大小。

bold:布尔类型,True表示粗体。

italic:布尔类型,True表示斜体。

color:字符串类型,传入十六进制颜色色号(HEX),如‘FFFFFF’表示白色。

5.3 设置单元格格式分类

可以通过设置单元格的风格来设置单元格格式分类

# 设置单元格分类为百分比
cell.style = '百分比'
cell.style = '常规'

# 常规单元格
cell.number_format = 'General'
# 百分比单元格
cell.number_format = '0.00%'
# 科学计数法
cell.number_format = '0.00E+00'

openpyxl所支持的excel的单元格格式

https://openpyxl.readthedocs.io/en/stable/_modules/openpyxl/styles/numbers.html?highlight=openpyxl.styles.numbers

5.4 单元格对齐格式设置

# 导入所需模块
from openpyxl.styles import Alignment
# 设置单元格对齐样式
alignment = Alignment(horizontal='center', vertical='center', wrap_text=True)

# 应用样式
cell.alignment = alignment

Alignment中可以传入多个参数:

horizontal:字符串类型,水平对齐,对应Excel助攻对齐格式

"general", "left", "center", "right", "fill", "justify", "centerContinuous",
    "distributed"

vertical:字符串类型,垂直对齐,对应Excel助攻对齐格式

"top", "center", "bottom", "justify", "distributed",

wrap_text:布尔类型,设置是否自动换行

textRotation:整数类型,设置文本旋转角度,最大值180

官方文档链接:

https://openpyxl.readthedocs.io/en/latest/_modules/openpyxl/styles/alignment.html

5.5 设置颜色填充样式

5.5.1 纯色填充
# 导入所需模块
from openpyxl.styles import PatternFill
# 设置颜色填充样式
pattern_fill = PatternFill(fill_type='solid',fgColor='00B0F0')

# 应用样式
cell.fill = pattern_fill

fill_type:字符串类型,设置填充的样式,常用的是 solid

fgColor:字符串类型,输入HEX十六进制颜色色号

注:官方文档中写明, fill_type 若没有特别指定类型,则后续的参数都无效

5.5.2 渐变颜色填充
# 导入所需模块
from openpyxl.styles import GradientFill
# 设置颜色填充样式
gradient_fill = GradientFill(stop=('FFFFFF', '99CCFF', '000000'))

# 应用样式
cell.fill = gradient_fill

stop:传入一个元组,从起始颜色色号至终止颜色色号,同样是十六进制HEX的格式

5.6 设置边框样式

# 导入所需模块
from openpyxl.styles import Side, Border
# 设置边框线样式
side = Side(style='thin', color='000000')
border = Border(left=side, right=side, top=side, bottom=side)

Side 设置具体的边框线格式

style:传入格式,样式有以下

‘dashDot’,‘dashDotDot’,‘dashed’,‘dotted’,‘double’,
‘hair’,‘medium’,‘mediumDashDot’,‘mediumDashDotDot’,
‘mediumDashed’,‘slantDashDot’,‘thick’,‘thin’

color:HEX颜色色号

Border 设置边框线应用的范围,常用的为上下左右

ll = gradient_fill

stop:传入一个元组,从起始颜色色号至终止颜色色号,同样是十六进制HEX的格式

### 5.6 设置边框样式

```python
# 导入所需模块
from openpyxl.styles import Side, Border
# 设置边框线样式
side = Side(style='thin', color='000000')
border = Border(left=side, right=side, top=side, bottom=side)

Side 设置具体的边框线格式

style:传入格式,样式有以下

‘dashDot’,‘dashDotDot’,‘dashed’,‘dotted’,‘double’,
‘hair’,‘medium’,‘mediumDashDot’,‘mediumDashDotDot’,
‘mediumDashed’,‘slantDashDot’,‘thick’,‘thin’

color:HEX颜色色号

Border 设置边框线应用的范围,常用的为上下左右