使用openpyxl如何给单元格填充颜色?

77

我目前在使用Python 2.7的openpyxl v2.2.2,并且想要对单元格设置颜色。我已经使用了以下导入语句:

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(或任何其他单元格)的颜色吗?


你能提供完整的追踪回溯吗? - The6thSense
8个回答

76

我认为问题在于你试图将一个填充对象赋值给样式。

ws['A1'].fill = redFill 应该可以正常工作。


4
谢谢Charlie。我对Python还很陌生,openpyxl文档没有清楚地说明如何将填充应用于单元格。你的回答解决了这个问题。 - Ahmed Rashad
4
可以将此应用于某些列的选择,例如A1:A5吗? - Callam Delaney
@CallamDelaney 请看我的回答 https://dev59.com/El0a5IYBdhLWcg3wTHJt#66074706 - Umair Ayub

17

样式的 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十六进制颜色。您可以将其作为默认alpha值为00的'rrggbb'传递,或使用'aarrggbb'指定alpha。如果您需要快速获取颜色,则在openpyxl.styles.colors中定义了许多颜色常量。


1
my_fill = openpyxl.styles.fills.PatternFill(patternType='solid', fgColor=my_red)我的填充 = openpyxl.styles.fills.PatternFill(patternType='solid', fgColor=my_red) - Gourav Chawla

9

这对我有用。他们更改了一些内容,从我看到的情况来看,互联网上大部分帮助都是针对openpyxl库的旧版本。

# Change background color 
xls_cell.style = Style(fill=PatternFill(patternType='solid',
                                        fill_type='solid', 
                                        fgColor=Color('C4C4C4')))

3
需要注意的是,如果您对单元格进行多次更改,则之前的更改将被最近的更改覆盖。如果您想进行六次更改,必须在同一命令中完成所有六次更改,不能逐个更改。如果您只更改最后一项,则只会保留最后一个更改。 - M T Head

7

在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


1
要让PatternFill起作用,您需要使用from openpyxl.styles import PatternFill - Shane S

6
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)

结果 - 输入图像描述


5

对于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必须是十六进制颜色。

4
为了填写一系列行/列,请执行以下操作:
for cell in ws['A1:A100']:
   cell[0].fill = redFill

填充列的所有行

for cell in ws['A1:{}'.format(ws.max_row)]:
   cell[0].fill = redFill

3

使用嵌套的 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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接