Python-Excel读写:openpyxl模块

Python-Excel读写:openpyxl模块

  • 0 前言
  • 1 openpyxl模块(第三方库)
  • 2 Workbook
    • 2.1 Excel文件读写创建
    • 2.2 对Worksheet的操作
  • 3 Worksheet
    • 3.1 对标题、行列数的操作
    • 3.2 对行高列宽的操作
    • 3.3 按行或按列操作
      • 3.3.1 示例:按一行一列迭代
    • 3.4 对Cell的遍历和定位
      • 3.4.1 示例:用单元格名称切片迭代
      • 3.4.2 示例:按单元格行列号迭代
    • 3.5 对合并单元格的操作
  • 5 Cell
    • 5.1 单元格的值和坐标
      • 5.1.1 示例:新建文件
      • 5.1.2 示例 :编辑文件
      • 5.1.3 示例:读取文件
    • 5.2 单元格格式
      • 5.2.1 数字格式 number_format
      • 5.2.2 单元格对齐
      • 5.2.3 单元格字体 Font
      • 5.3.4 单元格边框样式 Side
      • 5.4.5 单元格填充样式 PatternFill
      • 5.4.6 单元格保护

0 前言

>>返回Python系列文章目录<<

Python-Excel读写:openpyxl模块_第1张图片

xlrdxlwt模块分别用于读写excel文件,xlrd可以读xls和xlsx格式(对xlsx格式只能读取数据,不能读取字体颜色等信息),但是xlwt只能写xls格式

openpyxl库用于读写xlsx格式的数据和字体等信息,不支持xls格式

xlrdxlwt模块读写效率比openpyxl快一倍,但是要求单个sheet不能超过65535行,不超过256列。openpyxl支持任意大小的文件

xlrdxlwt模块对数据类型的定义不同,所以(xlrd+xlwt)没有办法打开一个已经存在的文件直接追加数据,但是openpyxl可以

1 openpyxl模块(第三方库)

openpyxl模块包含了几乎excel软件的所有功能,分成多个子模块。

模块安装方式如下:

pip install openpyxl

openpyxl包含中3种类型,WorkbookWorksheetCell,对应excel中的工作簿、工作表和单元格

进一步学习可参考以下博客:

Python自动化办公:openpyxl教程(基础).

Python自动化办公:openpyxl教程(进阶).

Python自动化办公:openpyxl绘制图表.

2 Workbook

类的地址是:

openpyxl.workbook.workbook.Workbook()

**Workbook()Worksheet()**按顺序排列。可以按sheet_name查找,也可以按sheet_index查找。sheet_index从0开始。

2.1 Excel文件读写创建

① 读取Excel文件为Workbook数据

from openpyxl import load_workbook
独立方法 说明
load_workbook(file) -> Workbook 读取xlsx文件,返回Workbook类

② 创建新的Workbook数据

wb = Workbook()

③ 保存Workbook数据

self=Workbook类 说明
self.save(file) 保存文件
file->字符串

2.2 对Worksheet的操作

self=Workbook类 说明
self.active -> Worksheet 读取当前激活的Worksheet,返回Worksheet类
self.create_sheet(sheetname, index) -> Worksheet 创建sheet, index可省略,返回Worksheet类
index从0开始,省略值为最后
self.copy_worksheet(Worksheet) -> Worksheet 复制sheet,返回Worksheet类,默认名称是原名 Copy
只能复制同一个Workbook下的Worksheet
self[sheetname] -> Worksheet 选中指定Worksheet,返回Worksheet类
self.sheetnames -> list of str 返回sheetname组成的列表
self.worksheets -> list of Worksheet 返回Worksheet类组成的列表
self.remove(sheetname) 删除指定Worksheet
del self[sheetname] 删除指定Worksheet

3 Worksheet

类的地址是:

openpyxl.worksheet.worksheet.Worksheet(parent)

属性为:

Worksheet.title: 表名称
Worksheet.max_row, max_column, min_row, min_column: 有内容的最大最小行列号,从1开始

Worksheet()可以定位其中的Cell()

  • 可以按行号row列号column定位,行列号都从1开始
  • 也可以按坐标coordinate定位:Worksheet['A1']
  • 也可以按坐标范围coordinate_range定位多个Cell()Worksheet['A']Worksheet['A:B']Worksheet['A1:C4']

模块提供转换函数

不属于任何类的方法 说明
get_column_letter(index) -> str 输入列序号,返回列名。3 -> ‘C’
column_index_from_string(str) -> index 输入列名,返回列序号。 ‘C’ -> 3

3.1 对标题、行列数的操作

self=Worksheet类 说明
self.title -> str
self.title = str
读写sheetnamet名称,字符串类型
self.max_row -> num 读取最大列,从1开始,返回数字
self.min_row -> num 读取最小列,从1开始,返回数字
self.max_column -> num 读取最大行,从1开始,返回数字
self.min_column -> num 读取最小列,从1开始,返回数字

3.2 对行高列宽的操作

sheet.row_dimensions.height = 整表行高
sheet.column_dimensions.width = 整表列宽

sheet.row_dimensions[行编号].height = 行高
sheet.column_dimensions[列编号].width = 列宽
from openpyxl import load_workbook

workbook = load_workbook(filename)
sheet = workbook.active
# 将整个表的行高设置为 50,列宽设置为 30;
sheet.row_dimensions.height = 50 
sheet.column_dimensions.width = 30 
# 设置第 1 行的高度
sheet.row_dimensions[1].height = 50
# 设置 B 列的宽度
sheet.column_dimensions["B"].width = 20

workbook.save(filename)

3.3 按行或按列操作

self=Worksheet类 说明
self.append(list) 追加一行写入内容
list->字符串的列表
self.delete_rows(idx, amount=1) idx行起删除amount行,idx从1开始
self.delete_cols(idx, amount=1) idx列起删除amount列,idx从1开始
self.insert_rows(idx, amount=1) idx行前插入amount行,idx从1开始
self.insert_cols(idx, amount=1) idx列前插入amount列,idx从1开始
self.rows -> Iter(tuple(Cell)) 将所有行打包用于迭代,返回迭代器
self.columns -> Iter(tuple(Cell)) 将所有列打包用于迭代,返回迭代器
self.iter_rows(min_row, max_row, min_col,
max_col, valuse_only=False) -> Iter(tuple(Cell))
self.iter_rows(min_row, max_row, min_col,
max_col, valuse_only=True) -> Iter(tuple(value))
在指定范围生成行迭代器
参数都可省略,返回迭代器
min_row/col默认为1,max_row/col默认为max
self.iter_cols(min_row, max_row, min_col,
max_col, valuse_only=False) -> Iter(tuple(Cell))
self.iter_cols(min_row, max_row, min_col,
max_col, valuse_only=True) -> Iter(tuple(value))
在指定范围生成列迭代器
参数都可省略,返回迭代器
min_row/col默认为1,max_row/col默认为max

3.3.1 示例:按一行一列迭代

按行分割,每行为一个元组

for row in ws.rows
    for cell in row
        # code    

按列分割,每列为一个元组

for col in ws.cols
    for cell in col
        # code

3.4 对Cell的遍历和定位

self=Worksheet类 说明
self.cell(row, column) -> Cell 按行列号创建Cell,返回Cell类
self[coordinate] -> Cell
self[coordinate_range] -> tuple(Cell)
检索Cell,可切片,返回Cell类型或元组
self.values -> Iter(tuple(value)) 将所有内容打包用于迭代,返回迭代器
self.iter_rows(min_row, max_row, min_col,
max_col, valuse_only=False) -> Iter(tuple(Cell))
self.iter_rows(min_row, max_row, min_col,
max_col, valuse_only=True) -> Iter(tuple(value))
在指定范围生成行迭代器
参数都可省略,返回迭代器
min_row/col默认为1,max_row/col默认为max
self.iter_cols(min_row, max_row, min_col,
max_col, valuse_only=False) -> Iter(tuple(Cell))
self.iter_cols(min_row, max_row, min_col,
max_col, valuse_only=True) -> Iter(tuple(value))
在指定范围生成列迭代器
参数都可省略,返回迭代器
min_row/col默认为1,max_row/col默认为max

3.4.1 示例:用单元格名称切片迭代

指定对角单元格切片,返回二维元组,每行一个元组,包含首尾

work_area = ws['A2':'B3']
print(work_area)

####### 结果 ######
((<Cell '外特性图'.A2>, <Cell '外特性图'.B2>), 
(<Cell '外特性图'.A3>, <Cell '外特性图'.B3>))

指定行名,返回一维元组

work_area = ws[2]
print(work_area)

####### 结果 ######
(<Cell '外特性图'.A2>, <Cell '外特性图'.B2>, <Cell '外特性图'.C2>)

指定行区间,返回二维元组,每行一个元组,包含首尾

work_area = ws[2:3]
print(work_area)

####### 结果 ######
((<Cell '外特性图'.A2>, <Cell '外特性图'.B2>, <Cell '外特性图'.C2>),
 (<Cell '外特性图'.A3>, <Cell '外特性图'.B3>, <Cell '外特性图'.C3>))

指定列名,返回一维元组

work_area = ws['A']
print(work_area)

####### 结果 ######
(<Cell '外特性图'.A1>, <Cell '外特性图'.A2>, <Cell '外特性图'.A3>, <Cell '外特性图'.A4>, <Cell '外特性图'.A5>, <Cell '外特性图'.A6>, <Cell '外特性图'.A7>, <Cell '外特性图'.A8>, <Cell '外特性图'.A9>)

指定列区间,返回二维元组,每列一个元组,包含首尾

work_area = ws['B:C']
print(work_area)

####### 结果 ######
((<Cell '外特性图'.B1>, <Cell '外特性图'.B2>, <Cell '外特性图'.B3>, <Cell '外特性图'.B4>, <Cell '外特性图'.B5>, <Cell '外特性图'.B6>, <Cell '外特性图'.B7>, <Cell '外特性图'.B8>, <Cell '外特性图'.B9>), 
(<Cell '外特性图'.C1>, <Cell '外特性图'.C2>, <Cell '外特性图'.C3>, <Cell '外特性图'.C4>, <Cell '外特性图'.C5>, <Cell '外特性图'.C6>, <Cell '外特性图'.C7>, <Cell '外特性图'.C8>, <Cell '外特性图'.C9>))

3.4.2 示例:按单元格行列号迭代

指定区间,按行排列,得到迭代器。迭代器内每行为一个元组
最小值缺省为1,最大值缺省为max,values_only缺省为False

work_area = ws.iter_rows(min_row=2, max_row=4, max_col=2, values_only=True)
print(list(work_area))

####### 结果 ######
[('转速', '扭矩'), ('1/min', 'Nm'), (1000, 116.6)]

指定区间,按列排列,得到迭代器。迭代器内每列为一个元组
最小值缺省为1,最大值缺省为max,values_only缺省为False

work_area = ws.iter_cols(min_row=4, max_row=5, max_col=2, values_only=True)
print(list(work_area))

####### 结果 ######
[(1000, 1250), (116.6, 168.4)]

3.5 对合并单元格的操作

① 合并单元格 merge_cells
若合并的多个单元格中均有内容,只保留第一个单元格中的内容

sheet.merge_cells(待合并的格子编号)
sheet.merge_cells(start_row=起始行号,start_column=起始列号,end_row=结束行号,end_column=结束列号)
from openpyxl import load_workbook

workbook = load_workbook(filename)
sheet = workbook.active

sheet.merge_cells("C1:D2")
sheet.merge_cells(start_row=7,start_column=1,end_row=8,end_column=3)

workbook.save(filename)

② 取消合并单元格 unmerge_cells
取消合并单元格,不能恢复合并单元格所丢失的数据

sheet.unmerge_cells(待合并的格子编号)
sheet.unmerge_cells(start_row=起始行号,start_column=起始列号,end_row=结束行号,end_column=结束列号)
from openpyxl import load_workbook

workbook = load_workbook(filename)
sheet = workbook.active

sheet.unmerge_cells("C1:D2")
sheet.unmerge_cells(start_row=7,start_column=1,end_row=8,end_column=3)

workbook.save(filename="./testCase.xlsx")

③ 读取单元格是否被合并

5 Cell

类的地址是:

openpyxl.cell.cell.Cell(parent)

Cell是单元格,属性为:

Cell.value: 单元格内容
Cell.coordinate: 单元格坐标,从‘A1’开始
Cell.row: 单元格行号,从1开始
Cell.column: 单元格列号,从1开始
Cell.column_letter: 单元格列坐标,从‘A’开始

5.1 单元格的值和坐标

self=Cell类 说明
self.value -> str
self.value = str
读写内容,字符串类型或数字类型
self.row -> num 读取行号,返回数字类型
self.column -> num 读取列号,返回数字类型
self.column_letter -> str 读取列坐标,返回string类型
self.coordinate -> str 读取坐标,返回string类型

5.1.1 示例:新建文件

创建EXCEL文件,写入两列数据

from openpyxl import Workbook

wb = Workbook()             # 实例化,默认创建第一个Worksheet‘Sheet’
ws1 = wb.active              # 激活第一个Worksheet
ws1.title = '外特性图'        # 修改worksheet名称

ws['A1'] = '外特性图'        # 通过Cell名称定位
ws.append(['转速', '扭矩'])  # 在最后一行后面追加内容
ws.append(['1/min', 'Nm'])

SPEED_LIST = [1000, 1250, 1500, 1750, 2000, 2250, 2500]
TORQUE_LIST = [116.6, 168.4, 201.4, 204.4, 203.8, 203.2, 203.9]

for i in range(4, 10):
    ws.cell(row=i, column=1, value=SPEED_LIST[i-4])  # 通过cell(row, colum, value)定位
    ws.cell(row=i, column=2, value=TORQUE_LIST[i-4])

wb.save('MyExcel.xlsx')   # 保存文件

Python-Excel读写:openpyxl模块_第2张图片

5.1.2 示例 :编辑文件

读取文件,添加一列数据

from openpyxl import load_workbook

wb = load_workbook('MyExcel.xlsx')
ws = wb['外特性图']

ws['C2'] = '功率'
ws['C3'] = 'kW'

work_area = ws['A4':'C9']   # 创建由Cell组成的列表
for i in range(6):
    work_area[i][2].value = work_area[i][0].value * work_area[i][1].value / 9550

wb.save('MyExcel.xlsx')   # 保存文件

Python-Excel读写:openpyxl模块_第3张图片

5.1.3 示例:读取文件

读取文件,将转速是500倍数的行写入text文件

from openpyxl import load_workbook

wb = load_workbook('MyExcel.xlsx')
ws = wb['外特性图']

work_area = ws.iter_rows(min_row=4, values_only=True)
f = open('my.text', 'w', encoding='UTF-8')
for i in work_area:
    if i[0]%500 == 0:
        f.write('   '.join([str(i[0]), str(i[1]), str(i[2])]))
        f.write('\n')
f.close()

Python-Excel读写:openpyxl模块_第4张图片

5.2 单元格格式

单元格格式与以下excel界面选项一一对应
Python-Excel读写:openpyxl模块_第5张图片

5.2.1 数字格式 number_format

5.2.2 单元格对齐

Alignment(
    horizontal=水平对齐模式,
    vertical=垂直对齐模式,
    text_rotation=旋转角度,
    wrap_text=是否自动换行)

horizontal代表水平方向
    左对齐left,
    居中center,
    右对齐right,
    分散对齐distributed,
    跨列居中centerContinuous,
    两端对齐justify,填充fill,
    常规general

vertical代表垂直方向
    居中center,
    还可以靠上top,
    靠下bottom,
    两端对齐justify,
    分散对齐distributed
workbook = load_workbook(filename)
sheet = workbook.active

cell = sheet["A3"]
alignment = Alignment(horizontal="center",vertical="center",text_rotation=45,wrap_text=True)
cell.alignment = alignment
workbook.save(filename)

5.2.3 单元格字体 Font

① 设置字体样式

Font(
    name=字体名称,
    size=字体大小,
    bold=是否加粗,
    italic=是否斜体,
    color=字体颜色)
from openpyxl.styles import Font
from openpyxl import load_workbook

workbook = load_workbook(filename)
sheet = workbook.active
cell = sheet["A1"]
font = Font(name="微软雅黑", size=20, bold=True, italic=True, color="000000")
cell.font = font
workbook.save(filename)

② 获得字体样式 font

from openpyxl.styles import Font
from openpyxl import load_workbook


workbook = load_workbook(filename="../excelDemo/testCase.xlsx")
sheet = workbook.active

cell = sheet["A1"]
font = cell.font
print(font.name) # 字体名称
print(font.size) # 字体大小
print(font.bold) # 是否加粗 返回的是布尔值
print(font.italic) # 是否斜体 返回的是布尔值
print(font.color) # 字体颜色 返回颜色类型和相关参数

5.3.4 单元格边框样式 Side

Side(style=边线样式,color=边线颜色)
style 参数的种类: 
    'double', 
    'mediumDashDotDot', 
    'slantDashDot', 
    'dashDotDot',
    'dotted',
    'hair', 
    'mediumDashed', 
    'dashed', 
    'dashDot', 
    'thin', 
    'mediumDashDot',
    'medium', 
    'thick'
 
Border(left=左边线样式,right=右边线样式,top=上边线样式,bottom=下边线样式)
from openpyxl.styles import Side,Border
from openpyxl import load_workbook

workbook = load_workbook(filename)
sheet = workbook.active

cell = sheet["D6"]
side1 = Side(style="thin",color="FF0000")
side2 = Side(style="thick",color="FFFF0000")
border = Border(left=side1,right=side1,top=side2,bottom=side2)
cell.border = border

workbook.save(filename)

5.4.5 单元格填充样式 PatternFill

PatternFill(
    fill_type=填充样式,
    fgColor=填充颜色)
from openpyxl.styles import PatternFill,GradientFill
from openpyxl import load_workbook

workbook = load_workbook(filename)
sheet = workbook.active

cell = sheet["B9"]
fill = PatternFill(fill_type="solid",fgColor="99ccff")
cell.fill = fill
workbook.save(filename)

5.4.6 单元格保护

>>返回Python系列文章目录<<

你可能感兴趣的:(Python,python,excel)