使用 openpyxl 用颜色填充单元格?

问题描述 投票:0回答:9

我目前正在使用 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(或任何其他单元格)的颜色有什么想法吗?

python openpyxl
9个回答
81
投票

我认为问题在于您正在尝试将填充对象分配给样式。

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


21
投票

样式 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
中将一堆颜色定义为常量。


10
投票

这对我有用。 他们改变了一些东西,你在互联网上看到的大部分帮助都是针对旧版本的 openpyxl 库,据我所知。

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

8
投票
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)

结果 - enter image description here


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


6
投票

要填充一定范围的行/列,请执行以下操作

for cell in ws['A1:A100']:
   cell[0].fill = redFill

填充一列的所有行

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

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 循环来填充二维范围。

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

0
投票

我在 Excel 中创建了一个工作簿,其中包含三个不同的单元格:

  1. 有自定义 RGB
    Background color
  2. 有自定义 RGB
    Pattern color
    Pattern style
    ,但是
    Background color: No Color
    )
  3. 有背景颜色和带有颜色设置的图案。

使用 openpyxl 3.1.5 打开此工作簿并检查我看到的单元格:

  1. 仅填充颜色:
    • bgFill.fgColor == Color(rgb='ff112233')
      (前景!?)
    • bgFill.bgColor == Color(indexed=64)
      (系统背景)
    • bgFill.patternType == 'solid'
  2. 仅图案:
    • patFill.fgColor == Color(rgb='ff998877')
    • patFill.bgColor == Color(rgb='00000000')
    • patFill.patternType == 'lightHorizontal'
  3. 填充颜色和图案:
    • 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)                 
© www.soinside.com 2019 - 2024. All rights reserved.