>>返回Python系列文章目录<<
xlrd和xlwt模块分别用于读写excel文件,xlrd可以读xls和xlsx格式(对xlsx格式只能读取数据,不能读取字体颜色等信息),但是xlwt只能写xls格式
openpyxl库用于读写xlsx格式的数据和字体等信息,不支持xls格式
xlrd和xlwt模块读写效率比openpyxl快一倍,但是要求单个sheet不能超过65535行,不超过256列。openpyxl支持任意大小的文件
xlrd和xlwt模块对数据类型的定义不同,所以(xlrd+xlwt)没有办法打开一个已经存在的文件直接追加数据,但是openpyxl可以
openpyxl模块包含了几乎excel软件的所有功能,分成多个子模块。
模块安装方式如下:
pip install openpyxl
openpyxl包含中3种类型,Workbook,Worksheet和Cell,对应excel中的工作簿、工作表和单元格
进一步学习可参考以下博客:
Python自动化办公:openpyxl教程(基础).
Python自动化办公:openpyxl教程(进阶).
Python自动化办公:openpyxl绘制图表.
类的地址是:
openpyxl.workbook.workbook.Workbook()
**Workbook()中Worksheet()**按顺序排列。可以按sheet_name查找,也可以按sheet_index查找。sheet_index从0开始。
① 读取Excel文件为Workbook数据
from openpyxl import load_workbook
独立方法 | 说明 |
---|---|
load_workbook(file) -> Workbook |
读取xlsx文件,返回Workbook类 |
② 创建新的Workbook数据
wb = Workbook()
③ 保存Workbook数据
self=Workbook类 | 说明 |
---|---|
self.save(file) |
保存文件file ->字符串 |
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 |
类的地址是:
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 |
self=Worksheet类 | 说明 |
---|---|
self.title -> strself.title = str |
读写sheetnamet名称,字符串类型 |
self.max_row -> num |
读取最大列,从1 开始,返回数字 |
self.min_row -> num |
读取最小列,从1 开始,返回数字 |
self.max_column -> num |
读取最大行,从1 开始,返回数字 |
self.min_column -> num |
读取最小列,从1 开始,返回数字 |
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)
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 |
按行分割,每行为一个元组
for row in ws.rows
for cell in row
# code
按列分割,每列为一个元组
for col in ws.cols
for cell in col
# code
self=Worksheet类 | 说明 |
---|---|
self.cell(row, column) -> Cell |
按行列号创建Cell,返回Cell类 |
self[coordinate] -> Cellself[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 |
指定对角单元格切片,返回二维元组,每行一个元组,包含首尾
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>))
指定区间,按行排列,得到迭代器。迭代器内每行为一个元组
最小值缺省为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)]
① 合并单元格 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")
③ 读取单元格是否被合并
类的地址是:
openpyxl.cell.cell.Cell(parent)
Cell是单元格,属性为:
Cell.value: 单元格内容
Cell.coordinate: 单元格坐标,从‘A1’开始
Cell.row: 单元格行号,从1开始
Cell.column: 单元格列号,从1开始
Cell.column_letter: 单元格列坐标,从‘A’开始
self=Cell类 | 说明 |
---|---|
self.value -> strself.value = str |
读写内容,字符串类型或数字类型 |
self.row -> num |
读取行号,返回数字类型 |
self.column -> num |
读取列号,返回数字类型 |
self.column_letter -> str |
读取列坐标,返回string类型 |
self.coordinate -> str |
读取坐标,返回string类型 |
创建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') # 保存文件
读取文件,添加一列数据
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') # 保存文件
读取文件,将转速是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()
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)
① 设置字体样式
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) # 字体颜色 返回颜色类型和相关参数
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)
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)
>>返回Python系列文章目录<<