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 对象,或者直接使用十六进制字符串。

Summarizer
Summarizer

基于 AI 的文本段落摘要生成器

下载

最稳健的解决方案是,从预定义的 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

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

豆包大模型
豆包大模型

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

WorkBuddy
WorkBuddy

腾讯云推出的AI原生桌面智能体工作台

腾讯元宝
腾讯元宝

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

文心一言
文心一言

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

讯飞写作
讯飞写作

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

即梦AI
即梦AI

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

ChatGPT
ChatGPT

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

相关专题

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

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

1570

2023.10.24

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

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

761

2023.08.03

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

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

221

2023.09.04

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

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

1570

2023.10.24

字符串介绍
字符串介绍

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

651

2023.11.24

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

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

1229

2024.03.22

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

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

1205

2024.04.29

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

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

193

2025.07.29

TypeScript类型系统进阶与大型前端项目实践
TypeScript类型系统进阶与大型前端项目实践

本专题围绕 TypeScript 在大型前端项目中的应用展开,深入讲解类型系统设计与工程化开发方法。内容包括泛型与高级类型、类型推断机制、声明文件编写、模块化结构设计以及代码规范管理。通过真实项目案例分析,帮助开发者构建类型安全、结构清晰、易维护的前端工程体系,提高团队协作效率与代码质量。

69

2026.03.13

热门下载

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

精品课程

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

共4课时 | 22.5万人学习

Django 教程
Django 教程

共28课时 | 5万人学习

SciPy 教程
SciPy 教程

共10课时 | 1.9万人学习

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

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