0

0

使用 Python openpyxl 库修改 Excel 字体颜色

碧海醫心

碧海醫心

发布时间:2025-08-04 17:24:11

|

495人浏览过

|

来源于php中文网

原创

使用 Python openpyxl 库修改 Excel 字体颜色

本文详细介绍了如何使用 Python 的 openpyxl 库在 Excel 文件中设置单元格字体颜色,特别是针对 Font 对象的 color 属性引发的 ValueError: Colors must be aRGB hex values 错误。文章解释了 openpyxl 中颜色表示的正确方式,并提供了通过提取预定义颜色对象的 ARGB 十六进制值来创建 Font 颜色的解决方案,确保颜色设置的准确性和兼容性。

1. openpyxl 库简介与 Excel 样式操作

openpyxl 是一个功能强大的 python 库,用于读取、写入和修改 .xlsx 格式的 excel 文件。它提供了丰富的 api 来操作工作簿、工作表、单元格以及各种样式属性,包括字体、填充、边框等。

在 openpyxl 中,单元格的样式可以通过 openpyxl.styles 模块进行控制。其中,Font 类用于定义字体样式,如字体名称、大小、粗细、斜体以及颜色。PatternFill 类用于定义单元格的背景填充。

2. 理解 Font 对象的颜色属性与常见错误

在使用 openpyxl 设置单元格字体颜色时,我们通常会用到 Font 类的 color 属性。例如,尝试将字体颜色设置为白色:

from openpyxl.styles import Font, colors

# ... 其他代码 ...
cell.font = Font(color=colors.WHITE, bold=True)
# ...

然而,上述代码在某些 openpyxl 版本或特定环境下可能会抛出 ValueError: Colors must be aRGB hex values 错误。这个错误明确指出,Font 对象的 color 属性期望接收一个 ARGB(Alpha, Red, Green, Blue)格式的十六进制颜色字符串,或者一个内部能够正确解析为 ARGB 十六进制值的 Color 对象。

虽然 openpyxl.styles.colors.WHITE 是一个预定义的 Color 对象,但直接将其作为 Font 的 color 参数传递时,可能未能正确地被 Font 构造函数解析为所需的 ARGB 十六进制格式。

立即学习Python免费学习笔记(深入)”;

3. 解决方案:确保颜色格式为 ARGB 十六进制

解决 ValueError 的关键在于确保传递给 Font(color=...) 的值是一个明确的 ARGB 十六进制颜色表示。openpyxl 的 Color 对象提供了 get_hex_color() 方法,可以获取其对应的 ARGB 十六进制字符串。我们可以利用这一点来构造正确的 Color 对象,或者直接使用十六进制字符串。

绿叶网络企业网站
绿叶网络企业网站

界面淡雅,从企业介绍、产品介绍、留言反馈、新闻发布、客户服务等方面,全方位、立体式的展示企业的各种情况,主要强调产品优势和售后服务,符合现在最新的营销理念(企业销售的不仅是产品,还有服务),“友情链接”栏目是为了企业开展网上营销的必要手段,后台采用新的编辑器,不但能修改网页的文字颜色、大小、字体、对齐方式(使用起来就象WORD),还能插入图片、FLASH动画

下载

最稳健的解决方案是,从预定义的 colors 对象中提取其 ARGB 十六进制值,然后用这个值来构造一个新的 Color 对象,并将其传递给 Font。

修正后的代码示例:

import openpyxl
from openpyxl import Workbook
from openpyxl.styles import Color, PatternFill, Font, Border
from openpyxl.styles import colors

# 假设文件 'file.xlsx' 存在
# 如果文件不存在,可以先创建一个空的 workbook
try:
    wb = openpyxl.load_workbook('file.xlsx', read_only=False)
except FileNotFoundError:
    print("文件 'file.xlsx' 不存在,将创建一个新的工作簿。")
    wb = Workbook()
    # 确保至少有一个 sheet,例如 sheet1
    if 'Sheet' not in wb.sheetnames:
        wb.create_sheet('Sheet') # openpyxl 默认会创建 'Sheet'
    wb.save('file.xlsx')
    wb = openpyxl.load_workbook('file.xlsx', read_only=False) # 重新加载以确保所有默认sheet都已加载

keep_sheets = ['sheet3','sheet2','sheet1'] # 示例中的 sheet 名称

# 确保示例中的 sheet 存在,如果不存在则创建
for sheet_name in keep_sheets:
    if sheet_name not in wb.sheetnames:
        wb.create_sheet(sheet_name)

print("当前工作表名称:", wb.sheetnames)

for sheetName in wb.sheetnames:
    if sheetName in keep_sheets:
        ws = wb[sheetName]
        print(f"正在处理工作表: {ws.title}")

        # 定义填充样式
        fill_pattern = PatternFill(start_color='4F81BD', # 注意:十六进制颜色值不需要 # 前缀
                                   end_color='4F81BD',
                                   fill_type='solid')

        # 遍历第一行(假设处理前10列)
        # range(1, 11) 对应 A 到 J 列
        for col_idx in range(1, 11):
            cell = ws.cell(row=1, column=col_idx)
            cell.fill = fill_pattern

            # 修正字体颜色设置:
            # 从 colors.WHITE 获取 ARGB 十六进制值,然后用它来创建新的 Color 对象
            cell.font = Font(color=Color(colors.WHITE.get_hex_color()), bold=True)
            # 或者更简洁地直接使用十六进制字符串 (例如 'FFFFFFFF' 代表白色)
            # cell.font = Font(color='FFFFFFFF', bold=True)
            # 或者使用 colors.WHITE.rgb
            # cell.font = Font(color=colors.WHITE.rgb, bold=True)

            # 示例:为单元格写入内容
            cell.value = f"Header {col_idx}"


# 保存更改到新文件
output_filename = 'updated_file.xlsx'
wb.save(output_filename)
print(f"文件已成功保存为: {output_filename}")

解释修正:

  1. Color(colors.WHITE.get_hex_color()): 这是解决问题的核心。colors.WHITE 本身是一个 Color 对象,通过调用其 get_hex_color() 方法,我们可以获取到代表白色的 ARGB 十六进制字符串(例如 'FFFFFFFF')。然后,我们使用这个十六进制字符串作为参数,重新构造一个新的 Color 对象。这种方式确保了 Font 对象的 color 属性接收到一个明确且符合其内部要求的 Color 实例。
  2. 十六进制颜色值格式: openpyxl 期望的十六进制颜色值是 8 位 ARGB 格式(例如,'FFFFFFFF' 代表不透明的白色,'FF000000' 代表不透明的黑色)。在 PatternFill 中,通常使用 6 位 RGB 格式(例如 '4F81BD'),但 Font 的 color 属性通常更严格地要求 ARGB。
  3. PatternFill 的颜色: 注意 PatternFill 的 start_color 和 end_color 属性通常接受 6 位 RGB 十六进制字符串,不需要 # 前缀。如果需要透明度,则需要 8 位 ARGB。

4. 注意事项与最佳实践

  • 颜色格式一致性: 始终注意 openpyxl 中不同样式属性对颜色格式的要求。Font 的 color 属性通常更偏向于 ARGB 十六进制或通过 ARGB 十六进制构建的 Color 对象。
  • 预定义颜色: openpyxl.styles.colors 模块提供了许多预定义的颜色常量(如 colors.BLACK, colors.RED, colors.BLUE 等)。在设置字体颜色时,如果遇到 ValueError,请尝试使用 Color(预定义颜色.get_hex_color()) 的模式。
  • 自定义颜色: 如果需要使用自定义颜色,可以直接提供 8 位 ARGB 十六进制字符串给 Font(color='AARRGGBB'),或者使用 Color('AARRGGBB') 构造 Color 对象。
  • 性能考量: 大规模修改单元格样式时,考虑性能。openpyxl 在写入大量数据和样式时可能会消耗较多内存和时间。
  • 错误处理: 在加载或保存 Excel 文件时,建议添加 try-except 块来处理 FileNotFoundError 等潜在错误。

通过遵循上述指导和示例代码,您可以有效地使用 openpyxl 库来控制 Excel 单元格的字体颜色,避免常见的颜色格式错误,并创建专业且美观的 Excel 报告。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
java基础知识汇总
java基础知识汇总

java基础知识有Java的历史和特点、Java的开发环境、Java的基本数据类型、变量和常量、运算符和表达式、控制语句、数组和字符串等等知识点。想要知道更多关于java基础知识的朋友,请阅读本专题下面的的有关文章,欢迎大家来php中文网学习。

1498

2023.10.24

js 字符串转数组
js 字符串转数组

js字符串转数组的方法:1、使用“split()”方法;2、使用“Array.from()”方法;3、使用for循环遍历;4、使用“Array.split()”方法。本专题为大家提供js字符串转数组的相关的文章、下载、课程内容,供大家免费下载体验。

298

2023.08.03

js截取字符串的方法
js截取字符串的方法

js截取字符串的方法有substring()方法、substr()方法、slice()方法、split()方法和slice()方法。本专题为大家提供字符串相关的文章、下载、课程内容,供大家免费下载体验。

212

2023.09.04

java基础知识汇总
java基础知识汇总

java基础知识有Java的历史和特点、Java的开发环境、Java的基本数据类型、变量和常量、运算符和表达式、控制语句、数组和字符串等等知识点。想要知道更多关于java基础知识的朋友,请阅读本专题下面的的有关文章,欢迎大家来php中文网学习。

1498

2023.10.24

字符串介绍
字符串介绍

字符串是一种数据类型,它可以是任何文本,包括字母、数字、符号等。字符串可以由不同的字符组成,例如空格、标点符号、数字等。在编程中,字符串通常用引号括起来,如单引号、双引号或反引号。想了解更多字符串的相关内容,可以阅读本专题下面的文章。

623

2023.11.24

java读取文件转成字符串的方法
java读取文件转成字符串的方法

Java8引入了新的文件I/O API,使用java.nio.file.Files类读取文件内容更加方便。对于较旧版本的Java,可以使用java.io.FileReader和java.io.BufferedReader来读取文件。在这些方法中,你需要将文件路径替换为你的实际文件路径,并且可能需要处理可能的IOException异常。想了解更多java的相关内容,可以阅读本专题下面的文章。

592

2024.03.22

php中定义字符串的方式
php中定义字符串的方式

php中定义字符串的方式:单引号;双引号;heredoc语法等等。想了解更多字符串的相关内容,可以阅读本专题下面的文章。

587

2024.04.29

go语言字符串相关教程
go语言字符串相关教程

本专题整合了go语言字符串相关教程,阅读专题下面的文章了解更多详细内容。

170

2025.07.29

Python 自然语言处理(NLP)基础与实战
Python 自然语言处理(NLP)基础与实战

本专题系统讲解 Python 在自然语言处理(NLP)领域的基础方法与实战应用,涵盖文本预处理(分词、去停用词)、词性标注、命名实体识别、关键词提取、情感分析,以及常用 NLP 库(NLTK、spaCy)的核心用法。通过真实文本案例,帮助学习者掌握 使用 Python 进行文本分析与语言数据处理的完整流程,适用于内容分析、舆情监测与智能文本应用场景。

9

2026.01.27

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
最新Python教程 从入门到精通
最新Python教程 从入门到精通

共4课时 | 21.8万人学习

Django 教程
Django 教程

共28课时 | 3.5万人学习

SciPy 教程
SciPy 教程

共10课时 | 1.3万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号