我目前正在使用 openpyxl v2.2.2 for Python 2.7,我想为单元格设置颜色。我使用了以下进口
import openpyxl,
from openpyxl import Workbook
from openpyxl.styles import Color, PatternFill, Font, Border
from openpyxl.styles import colors
from openpyxl.cell import Cell
以下是我尝试使用的代码:
wb = openpyxl.Workbook()
ws = wb.active
redFill = PatternFill(start_color='FFFF0000',
end_color='FFFF0000',
fill_type='solid')
ws['A1'].style = redFill
但我收到以下错误:
Traceback (most recent call last)
self.font = value.font.copy()
AttributeError: 'PatternFill' object has no attribute 'font'
关于如何使用 openpyxl 设置单元格 A1(或任何其他单元格)的颜色有什么想法吗?
我认为问题在于您正在尝试将填充对象分配给样式。
ws['A1'].fill = redFill
应该可以正常工作。
样式 API 再次发生变化。 对我有用的是
my_red = openpyxl.styles.colors.Color(rgb='00FF0000')
my_fill = openpyxl.styles.fills.PatternFill(patternType='solid', fgColor=my_red)
cell.fill = my_fill
颜色是 alpha RGB 十六进制颜色。您可以将其作为
'rrggbb'
传递,默认 alpha 为 00,或者使用 'aarrggbb'
指定 alpha。如果您需要快速获取一种颜色,则在 openpyxl.styles.colors
中将一堆颜色定义为常量。
这对我有用。 他们改变了一些东西,你在互联网上看到的大部分帮助都是针对旧版本的 openpyxl 库,据我所知。
# Change background color
xls_cell.style = Style(fill=PatternFill(patternType='solid',
fill_type='solid',
fgColor=Color('C4C4C4')))
from openpyxl import Workbook, load_workbook
from openpyxl.styles import PatternFill
_file_name = "Test.xlsx"
_sheet_name = "Test_Sheet"
def new_workbook(_file_name, _sheet_name):
wb = Workbook() # Workbook Object
ws = wb.active # Gets the active worksheet
ws.title = _sheet_name # Name the active worksheet
# Writing the header columns
ws['A1'] = 'Name'
ws['B1'] = 'Class'
ws['C1'] = 'Section'
ws['D1'] = 'Marks'
ws['E1'] = 'Age'
col_range = ws.max_column # get max columns in the worksheet
# formatting the header columns, filling red color
for col in range(1, col_range + 1):
cell_header = ws.cell(1, col)
cell_header.fill = PatternFill(start_color='FF0000', end_color='FF0000', fill_type="solid") #used hex code for red color
wb.save(_file_name) # save the workbook
wb.close() # close the workbook
if __name__ == '__main__':
new_workbook(_file_name, _sheet_name)
在Python 3.x中
wb = openpyxl.Workbook()
ws = wb.active
redFill = PatternFill(start_color='FFFF0000',
end_color='FFFF0000',
fill_type='solid')
ws['A1'].fill = redFill
可以工作,但我不知道在 python 2.x 中我希望工作 只要放
ws['A1'].fill=redFill
要填充一定范围的行/列,请执行以下操作
for cell in ws['A1:A100']:
cell[0].fill = redFill
填充一列的所有行
for cell in ws['A1:{}'.format(ws.max_row)]:
cell[0].fill = redFill
我会为 Excel 做的是这样的:
from openpyxl import Workbook, load_workbook
from openpyxl.styles import PatternFill
wb = load_workbook("test.xlsx")
ws = wb.active
ws["A1"].fill = PatternFill("solid", start_color="FFA500")
您可以将“A1”替换为另一个单元格,并且 start_color 必须是十六进制颜色。
使用嵌套的 for 循环来填充二维范围。
Python 3.9
import openpyxl as op
fill_gen = op.styles.PatternFill(fill_type='solid',
start_color='FFFFFF',
end_color='FFFFFF')
for row in ws["A1:BB50"]:
for cell in row:
cell.fill = fill_gen
我在 Excel 中创建了一个工作簿,其中包含三个不同的单元格:
Background color
集Pattern color
和 Pattern style
,但是 Background color: No Color
)使用 openpyxl 3.1.5 打开此工作簿并检查我看到的单元格:
bgFill.fgColor == Color(rgb='ff112233')
(前景!?)bgFill.bgColor == Color(indexed=64)
(系统背景)bgFill.patternType == 'solid'
patFill.fgColor == Color(rgb='ff998877')
patFill.bgColor == Color(rgb='00000000')
patFill.patternType == 'lightHorizontal'
bothFill.fgColor == Color(rgb='ff998877')
bothFill.bgColor == Color(rgb='ff112233')
bothFill.patternType == 'lightHorizontal'
外卖:
fgColor
(不是 bgColor
)并将图案设置为 'solid'
。fgColor
并将模式设置为您想要的字符串,如 openpyxl.styles.fills.fills
fgColor
设置为图案颜色,将 bgColor
设置为填充颜色(并设置图案字符串)。None
作为patternType
。import openpyxl
from openpyxl.styles import PatternFill
CLEAR = openpyxl.styles.Color(rgb='00000000')
LEGAL_PATTERNS = openpyxl.styles.fills.fills
def create_fill(*,
fill_color: str | None = None,
pattern: str | None = None,
pattern_color: str | None = None) -> PatternFill:
"""
Create the correct PatternFill for combinations of:
fill color, pattern, and pattern color (all-optional)
"""
if pattern and pattern not in LEGAL_PATTERNS:
raise ValueError(f"pattern_type must be one of: {', '.join(LEGAL_PATTERNS)}")
if fill_color or pattern:
return PatternFill(
patternType = pattern or 'solid',
fgColor = (pattern_color or CLEAR) if pattern else fill_color,
bgColor = (pattern and fill_color) or CLEAR,
)
else:
# solid/clear/clear isn't the same as an empty background :/
return PatternFill(None)