官方指南:https://openpyxl.readthedocs.io/en/stable/styles.html
基本文件操作
#创建新的xlsx文件
import openpyxl
#创建工作簿
wb = openpyxl.Workbook()
#工作簿总是会带有至少一个worksheet,通过Workbook.active可以选中第一个sheet
ws = wb.active
#保存文件(会覆盖已有文件而且没有任何提示)
wb.save('sample.xlsx')
#打开已有xlsx文件
wb2 = load_workbook('test.xlsx')
#保存模板
wb = load_workbook('document.xlsx')
wb.template = True
wb.save('document_template.xltx')
#关闭Workbook
wb.close()
sheet操作
#创建sheet: Workbook.create_sheet(),不带参数创建会使用sheet1这样的名称,并且sheet默认是追加到末尾
ws1 = wb.create_sheet()
#也可以在创建的时候指定sheet的名称或者位置(位置表示数值和list[]使用很类似),例如:
ws2 = wb.create_sheet('Mysheet1',0)
ws3 = wb.create_sheet('Mysheet2',-1)
#修改已有的sheet名称
ws3.title = 'New Title'
#设置sheet页签背景,(默认是白色), 设置属性Worksheet.sheet_properties.tabColor, 颜色是以"RRGGBB"的格式描述
ws3.sheet_properties.tabColor = "1072BA"
#引用sheet,如果知道sheet的名称,可以直接通过workbook获取,查看所有的sheet,可以通过WorkBook.sheetnames获取
ws3 = wb['Sheet1']
#复制sheet
source = wb.active
target = wb.copy_worksheet(sourrce)
数据操作/单元格操作
#获取单元格和其值
c = ws['A4']
c.value
#指定单元的值
ws['A1'] = 42
#通过Worksheet.cell()以row和column的方式访问。默认创建的sheet是没有任何内容的,当访问cell的时候,这个cell才会被创建,所以如果cell方法不带alue值,则会在指定的row-column创建一个空的单元格
d = ws.cell(row=4, column=2, value=10)
#范围访问单元格(通过指定左上角和右下角的单元个位置),返回一个按照行/列分布的元组
cell_range = ws['A1':'C2']
#获取指定列中的所有单元格(一直到没有创建的单元格为止)
colC = ws['C']
col_range = ws['C':'D']
#获取指定行中的所有单元格()
row10 = ws[10]
row_range = ws[5:10]
#通过Worksheet.iter_rows()指定获取的行范围和列宽
for row in ws.iter_rows(min_row=1, max_col=3, max_row=2):
... for cell in row:
... print(cell)
#类似的方法Worksheet.iter_cols(),差别在于iter_rows先横向取行,iter_cols先纵向取列(官方:这个方法在只读模式下不可用)
for col in ws.iter_cols(min_row=1, max_col=3, max_row=2):
... for cell in col:
... print(cell)
#还有一种方法可以取到所有的行或者列(官方:在只读模式下Worksheet.columns不可用)
tuple(ws.rows)
tuple(ws.columns)
#获取所有数据
for row in ws.values:
for value in row:
print(value)
#Worksheet.iter_rows() 和 Worksheet.iter_cols()也支持只获取值
ws.iter_rows(min_row=1, max_col=3, max_row=2, value_only=True)
#通过获取单元对象写入数据
c.value = 'hello, world'
#合并/取消合并
ws.merge_cells('A2:D2')
ws.unmerge_cells('A2:D2')
#或者
ws.merge_cells(start_row=2, start_column=1, end_row=4, end_column=4)
ws.unmerge_cells(start_row=2, start_column=1, end_row=4, end_column=4)
插入图片
wb = openpyxl.Workbook()
ws = wb.active
ws['A1'] = 'You should see three logos below'
img = openpyxl.drawing.image.Image('logo.png')
ws.add_image(img,'A1')
wb.save('logo.xlsx')
样式
定义字体样式
ft = openpyxl.styles.Font(color=openpyxl.styles.colors.RED)
ft = openpyxl.styles.Font(color='FFBB00')
ft = openpyxl.styles.Font(color=openpyxl.styles.colors.Color(indexed=32))
ft = openpyxl.styles.Font(color=openpyxl.styles.colors.Color(theme=6, tint=0.5))#复制样式
ft2 = copy(ft)
定义边框样式
thin = openpyxl.styles.Side(border_style="thin", color="000000")
double = openpyxl.styles.Side(border_style="double", color="ff0000")
bd = openpyxl.styles.Border(top=double, left=thin, right=thin, bottom=double)
设置边框和字体颜色样式
a1 = ws['A1']
a1.font = ft
a1.border = bda1.fill = openpyxl.styles.PatternFill("solid", fgColor="DDDDDD")
a1.fill = openpyxl.styles.GradientFill(stop=("000000", "FFFFFF"))
命名样式
from openpyxl.styles import NamedStyle, Font, Border, Side
highlight = NamedStyle(name="highlight")
highlight.font = Font(bold=True, size=20)
bd = Side(style='thick', color="000000")
highlight.border = Border(left=bd, top=bd, right=bd, bottom=bd)wb.add_named_style(highlight)
a1.style=highlight
a1.style='highlight'