使用Python XlsxWriter无法修改Excel字体颜色,遇XML错误求解决
解决XlsxWriter条件格式不生效及XML错误问题
咱们来拆解下你代码里的几个关键问题,这些就是导致格式没效果、Excel报XML错误的根源:
问题分析
- 格式对象未初始化:你直接调用
cell_format.set_font_color,但没先通过workb.add_format()创建格式对象,这会导致格式没正确绑定到工作簿,进而引发XML结构错误。 - 条件逻辑完全颠倒:你把红色格式套在了“Data Matched!”的匹配规则上,和需求完全相反,还漏掉了“Data Not Matched!”的格式设置。
- 循环内重复添加条件格式:你在写数据的循环里反复执行
conditional_format,会给同一单元格范围重复添加相同规则,导致Excel的XML结构混乱,出现恢复提示。 - 字符串匹配语法错误:XlsxWriter的条件格式中,匹配字符串时需要用双引号包裹值(Excel公式里字符串必须加引号),否则无法正确识别目标内容。
修正后的完整代码
import xlsxwriter alldata = [ ['My Total', 'Data Matched!', '$824,499,658', '$824,499,658'], ['Second Total', 'Data Matched!', '$824,532,682.20', '$824,532,682.20'], ['Featured Articles', 'Data Matched!', '$391,153,610.55', '$391,153,610.55'], ['Ads Revenue', 'Data Not Matched!', '$825,513,740.17', '$825,582,419.92'], ['Company 1 Revenue', 'Data Not Matched!', '$824,765,286.03', '$824,833,965.78'], ['Company 2 Revenue', 'Data Not Matched!', '$176,767,751.61', '$239,939,801.89'] ] workb = xlsxwriter.Workbook('Newexcel1.xlsx') worksheet1 = workb.add_worksheet("Sheet 1") # 分别创建绿色、红色的格式对象 matched_format = workb.add_format({'font_color': 'green'}) not_matched_format = workb.add_format({'font_color': 'red'}) # 批量写入数据 for row, row_data in enumerate(alldata): worksheet1.write_row(row + 1, 1, row_data) # 给"Data Matched!"设置绿色格式 worksheet1.conditional_format('C2:C7', { 'type': 'cell', 'criteria': '==', 'value': '"Data Matched!"', # 字符串必须用双引号包裹 'format': matched_format }) # 给"Data Not Matched!"设置红色格式 worksheet1.conditional_format('C2:C7', { 'type': 'cell', 'criteria': '==', 'value': '"Data Not Matched!"', 'format': not_matched_format }) # 必须关闭工作簿,确保所有内容写入完成 workb.close()
关键修正点说明
- 初始化格式对象:通过
workb.add_format()创建独立的格式,确保格式和工作簿正确关联,避免XML结构错误。 - 拆分条件规则:为两种文本分别设置条件格式,逻辑清晰,完全匹配你的需求。
- 修正字符串匹配语法:在
value里用双引号包裹目标字符串(比如'"Data Matched!"'),遵循Excel公式的字符串标识规则。 - 移出循环的条件格式调用:把条件格式设置放在循环外,避免重复添加规则导致XML混乱。
- 强制关闭工作簿:最后调用
workb.close()是XlsxWriter写入文件的必要步骤,缺失可能导致文件损坏。
这样修改后,生成的Excel就不会有XML错误,“Data Matched!”会显示绿色,“Data Not Matched!”会显示红色啦。
内容的提问来源于stack exchange,提问作者Girish venkata




