4 设置单元格属性
4.1 字体
在 openpyxl 中,通过 Font 对象来设置单元格的字体样式,在Font对象中,可以配置字体的类型,字体样式(粗体、斜体、下划线)、大小和颜色等。例如:
import openpyxl
from openpyxl.styles import Font
wb = openpyxl.load_workbook('./test.xlsx')
ws = wb.active
my_font1 = Font(name='仿宋', size=12, bold=True, italic=False, color='FF0000')
ws['A1']=value='红色仿宋'
ws['A1'].font=my_font1
my_font2 = Font(name='黑体', size=12, bold=False, italic=True,
underline='single', color='0000FF')
ws['A2']=value='蓝色黑体'
ws['A2'].font=my_font2
wb.save('./test.xlsx')
wb.close()
以上代码创建了两个Font对象,分别设置了单元格A1和A2的字体样式,运行效果如下:
4.2 宽度和高度
由于工作表的某一列的所有单元格具有同样的列宽,某一行的所有单元格具有同样的行高,因此,实际上是通过工作表的 column_dimensions 和 row_dimensions 属性来设置其某列的宽度和行的高度。以前面的文件为例,以下是如何设置列宽和行高的示例:
import openpyxl
wb = openpyxl.load_workbook('./test.xlsx')
ws = wb.active
# column width
ws.column_dimensions['A'].width = 20
ws.column_dimensions['B'].width = 30
# row height
ws.row_dimensions[1].height = 30
ws.row_dimensions[2].height = 40
wb.save('./test.xlsx')
wb.close()
运行脚本后,效果如下:
可以看到第1,2行的行高和第1,2列的列宽产生了变化。
再次强调: openpyxl 无法直接设置单元格的高度,只能设置行的高度。同样,列的宽度是针对整个列的,而不是单个单元格。
另外,在 openpyxl 中,行高和列宽的单位有所不同:
列宽(Column Width)单位是字符宽度。默认情况下,列宽的单位是基于默认字体(通常是 Calibri 字体,大小为 11)的字符宽度。例如,ws.column_dimensions['A'].width = 20 表示列 A 的宽度为 20 个 Calibri 字体大小为 11 的字符宽度。
行高(Row Height)单位是点(points)。点是一个常见的长度单位,在打印和数字文档中广泛使用。例如,ws.row_dimensions[1].height = 30 表示第 1 行的高度为 30 点。
4.3 边框
在 openpyxl 中,通过 Border 对象来设置单元格的边框样式。通过Border 对象及Side对象可以定义单元格边框的上、下、左、右四边的样式,包括边框的种类和颜色。
新建一个test.xlsx的文件,运行如下脚本:
import openpyxl
from openpyxl.styles import Border, Side
wb = openpyxl.load_workbook('./test.xlsx')
ws = wb.active
# set border for cell B2
cell = ws['B2']
cell.border = Border(left=Side(border_style='thin',color='ff0000'),
right=Side(border_style='double',color='00ff00'),
top=Side(border_style='thick',color='0000ff'),
bottom=Side(border_style='dashDot',color='ff00ff'))
wb.save('./test.xlsx')
wb.close()
运行效果如下:
可以看到B2单元格的四个边框样式和颜色都不一样了。
其中,参数border_style可以是:‘dotted’, ‘medium’, ‘dashed’, ‘mediumDashDot’, ‘hair’, ‘thin’, ‘double’, ‘slantDashDot’, ‘thick’, ‘dashDot’, ‘mediumDashed’, ‘dashDotDot’, ‘mediumDashDotDot’中之一。
4.4 填充单元格
Openpyxl支持三种方式填充单元格:
1. 纯色填充
2. 图案填充
3. 渐变色填充
通过向单元格的fill属性提供一个openpyxl.styles模块下的填充对象,即可完成对单元格的填充,分别介绍如下。
4.4.1 纯色填充
纯色填充是最简单的一种,在PatternFill对象中指定填充样式为solid,起始和结束的颜色一样,就可以实现纯色填充:
import openpyxl
from openpyxl.styles import PatternFill
wb = openpyxl.load_workbook('./test.xlsx')
ws = wb.active
cell = ws['A3']
# fill this cell with solid yellow
cell.fill = PatternFill(start_color='ffff00', end_color='ffff00', fill_type='solid')
wb.save('./test.xlsx')
wb.close()
运行效果如下:
4.4.2 图案填充
图案填充也是使用PattenFill对象,但是填充的类型不是solid,而是其他类型,例如下面的代码:
import openpyxl
from openpyxl.styles import PatternFill
wb = openpyxl.load_workbook('./test.xlsx')
ws = wb.active
cell = ws['A3']
cell.fill = PatternFill(patternType='darkVertical',
fgColor='00FF00', bgColor='0000FF')
wb.save('./test.xlsx')
wb.close()
会在绿色背景上绘制蓝色的额垂直线条,执行效果如下:
可供使用的类型有:'solid', 'darkUp', 'darkVertical', 'lightHorizontal', 'darkDown', 'lightDown', 'lightGrid', 'lightTrellis', 'mediumGray', 'darkGrid', 'lightUp', 'gray125', 'darkHorizontal', 'lightVertical', 'lightGray', 'darkGray', 'darkTrellis', 'gray0625'。
4.4.3 渐变色填充
渐变色填充可以使用GradientFill,常见的线性渐变色填充示例如下:
import openpyxl
from openpyxl.styles import GradientFill
wb = openpyxl.load_workbook('./test.xlsx')
ws = wb.active
cell = ws['A3']
# fill this cell with solid yellow
cell.fill = GradientFill(type='linear',stop=("ffff00", "ff0000"))
wb.save('./test.xlsx')
wb.close()
运行效果如下:
可以看到单元格是从左到右,颜色黄色向红色线性渐变的。如果调整degree的值,则可以实现不同方向的渐变,例如上下:
cell.fill = GradientFill(type='linear',degree=-90, stop=("ffff00", "ff0000"))
则填充的效果如下:
另外,type参数可以指定为path,并提供四个角的距离,可以按路径填充,修改一行代码,效果如下:
cell.fill = GradientFill(type='path',
stop=("ff0000", "ffffff"),
left=0.5,right=0.5,top=0.5,bottom=0.5)
则效果如下:
甚至还可以通过stop传递多种颜色,例如一个彩虹色的渐变色:
rainbow_colors = ("FF0000", "FFA500", "FFFF00",
"00FF00", "0000FF", "4B0082", "800080")
cell.fill = GradientFill(type='linear', stop=rainbow_colors)
运行效果如下:
4.5 对齐方式
在 openpyxl 中可以通过 Alignment 对象来设置单元格的对齐方式。Alignment 对象可以控制文本在单元格中的水平和垂直对齐方式,以及其他对齐选项。例如:
import openpyxl
from openpyxl.styles import Alignment
wb = openpyxl.load_workbook('./test.xlsx')
ws = wb.active
cell = ws['A2']
cell.value = 'align!'
cell.alignment = Alignment(
horizontal='center', # 水平居中对齐
vertical='center', # 垂直居中对齐
text_rotation=0, # 文本旋转角度,0 表示不旋转
wrap_text=False, # 是否自动换行
shrink_to_fit=False, # 是否缩小以适应单元格
indent=0 # 缩进级别
)
wb.save('./test.xlsx')
wb.close()
运行效果如下:
可以看到,在手动调节单元格宽度或者高度时,对齐方式一直是居中的。
上例的参数中,可以发现除了控制水平和垂直的对齐方式外,还有文本的旋转角度,以及是否缩进、自动换行等选项,此处不一一说明。
4.6 备注
注释可以用于提供额外的信息或说明,这些信息不会显示在单元格中,但可以通过鼠标悬停在单元格上查看。openpyxl 支持为单元格添加备注(注释),通过使用Comment对象即可。
以下是如何为单元格添加备注的示例代码:
import openpyxl
from openpyxl.comments import Comment
wb = openpyxl.load_workbook('./test.xlsx')
ws = wb.active
cell = ws['A2']
cell.value = 'comment'
cell.comment=Comment('This is a comment', 'Castor')
wb.save('./test.xlsx')
wb.close()
运行效果如下,可以看到有备注的单元格在右上角有个红色的小三角形,鼠标悬停或点击该单元格,则会显示备注,如下图所示: