导出Excel中文乱码主因是上游数据编码错误,非to_excel所致;需确保数据库连接charset=utf8mb4或CSV读取用encoding='utf-8-sig';to_excel不接受encoding参数;筛选须前置;格式定制需openpyxl后处理;大数据量优先选xlsxwriter或改用parquet。
导出 Excel 时中文乱码?检查 openpyxl 和 pandas 的编码逻辑
excel 文件本身不带编码声明,pandas 用 openpyxl 引擎写入时默认按 unicode 处理,但如果你从数据库或 csv 读取数据时用了错误的解码方式,导出后打开仍可能显示乱码——这不是导出环节的问题,而是上游数据已损坏。
- 用
pandas.read_sql从 MySQL 读取,确保连接字符串含charset=utf8mb4,否则中文可能被截断或转成? - 若从 CSV 加载,必须显式指定
encoding='utf-8-sig'(尤其 Windows 下 Excel 默认识别 BOM),否则to_excel无法“挽救”乱码内容 -
to_excel不接受encoding参数——它不是文本文件,别试图传encoding='gbk',会报TypeError: to_excel() got an unexpected keyword argument 'encoding'
按条件筛选后导出:别在 to_excel 里写逻辑,先过滤再导出
to_excel 是纯写入函数,不处理条件。常见错误是想用参数控制“只导出某几列”或“只导出 status=1 的行”,结果翻文档找半天没找到对应选项。
- 列筛选:用
df[['col_a', 'col_b']]或df.filter(regex='^user_')提前选好列,再调.to_excel() - 行筛选:用布尔索引,比如
df[df['score'] >= 60]或df.query("category in @valid_cats"),确认len(df)变小了再导出 - 避免链式赋值陷阱:不要写
df[df['x']>0].to_excel(...),应拆成两步,否则可能触发SettingWithCopyWarning并导出空表
自定义表头、冻结首行、设置列宽:用 openpyxl 操作工作表对象
pandas.to_excel 能设 sheet 名、是否写 index,但格式控制(如列宽、字体、冻结窗格)必须导出后用 openpyxl 补充操作。
- 导出时加
engine='openpyxl',并保留返回的ExcelWriter对象 - 用
writer.sheets['Sheet1']获取 worksheet,再调.column_dimensions['A'].width = 20或.freeze_panes = 'A2' - 注意:
openpyxl的行列索引从 1 开始,ws.cell(row=1, column=1)才是左上角;别用 0-based 写错位置 - 如果导出多 sheet,每个
writer.sheets[...]都要单独处理,不能共用一个ws变量
大数据量导出卡死或内存爆掉?换 xlsxwriter 或分块写入
openpyxl 把整个工作表加载进内存,10 万行以上就容易 OOM;xlsxwriter 是流式写入,更轻量,但不支持读取已有文件或复杂样式。
- 纯导出场景优先用
engine='xlsxwriter',配合df.to_excel(..., engine='xlsxwriter') - 若需边计算边写(比如查 50 万条日志,每 5 万行写一个 sheet),用
pd.ExcelWriter(..., engine='openpyxl', mode='a')追加,但注意openpyxl的mode='a'仅支持追加 sheet,不能追加行 - 真正超大表(>100 万行),放弃 Excel,改用
to_parquet或压缩 CSV,Excel 本质不是大数据载体
df 本身对不对”,而不是急着调 to_excel。










