使用Pandas+XlsxWriter生成的Excel文件打开报错且丢失格式求助
我之前也碰到过一模一样的情况,这种“文件内容存在问题”的报错,本质是Excel生成的XML结构有损坏,除了你已经尝试的strings_to_formulas=False,还有几个关键的排查方向和解决方案:
务必确保Workbook对象被正确关闭
这是最常见的坑!如果写完数据后没有调用close()方法,或者程序在写入过程中异常中断,Excel文件的结构就会不完整,打开时就会触发修复,顺带丢失格式。正确的写法应该是:import pandas as pd workbook_name = "Z:/python/data/20201219.xlsx" writer = pd.ExcelWriter(workbook_name, engine='xlsxwriter') # 写入你的多个工作表 df_sheet1.to_excel(writer, sheet_name='sheet1') df_sheet2.to_excel(writer, sheet_name='sheet2') # ...其他工作表的写入代码 # 一定要调用close()完成文件写入 writer.close()如果用的是
xlsxwriter.Workbook直接创建对象,同样要记得在最后调用workbook.close()。清洗单元格里的非法内容
Excel对单元格内容有隐藏限制,比如:- 开头是
=但不是合法公式的字符串(哪怕你设了strings_to_formulas=False,也可能有漏网的特殊场景) - 包含ASCII控制字符(比如
\x00到\x1F这类不可见字符,除了换行和制表符)
可以给所有字符串列做个清洗:
import re def clean_cell_content(content): if isinstance(content, str): # 移除ASCII控制字符 return re.sub(r'[\x00-\x08\x0B\x0C\x0E-\x1F]', '', content) return content # 对DataFrame的所有单元格应用清洗 df = df.applymap(clean_cell_content)- 开头是
检查是否有重复的工作表名称
Excel不允许同一个工作簿里有重复的sheet名,XlsxWriter可能不会主动抛出错误,但会偷偷搞坏文件结构。一定要确保你设置的sheet_name都是唯一的。升级Pandas和XlsxWriter到最新版
旧版本的库可能存在已知的XML生成bug,升级到稳定版往往能解决很多奇怪的问题:pip install --upgrade pandas xlsxwriter避免错误的格式批量设置
如果是循环逐个单元格设置格式时出了问题,比如重复创建格式对象、格式参数错误,建议改用批量设置的方式,比如用set_column或set_row来统一设置列/行格式:worksheet = writer.sheets['sheet1'] # 创建格式对象 header_format = writer.book.add_format({'bold': True, 'bg_color': '#F2F2F2'}) # 批量设置A到Z列的格式 worksheet.set_column('A:Z', None, header_format)
如果试了这些方法还是不行,可以先写一个极简的测试文件——比如只写入一个几行几列的小DataFrame到单个工作表——看看是否还会报错。如果测试文件正常,那问题大概率出在你的原始数据或者复杂的格式设置逻辑里,可以逐步排查定位。
内容的提问来源于stack exchange,提问作者user10364931

