You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何使用openpyxl加载保存Excel后列宽会发生改变?

问题:openpyxl保存后Excel列宽与原文件不一致

环境:

  • Python 3.11
  • Windows 10系统
  • openpyxl 3.1.2(也曾尝试3.0.7版本)

执行代码:

from openpyxl import load_workbook

if __name__ == '__main__':
    book = load_workbook('test_units.xlsx')
    sheet = book.active
    print(sheet.column_dimensions['B'].width)
    print(sheet.row_dimensions[3].height)
    book.save('test_units1.xlsx')

现象:加载原Excel文件并直接保存为新文件后,新文件的列宽比原文件更宽,预期两个文件的行列维度完全一致,但实际不符。


原因与解决方法

核心原因

openpyxl处理列宽时,与Excel的显示单位逻辑不匹配:

  • Excel的列宽实际基于默认字体(通常是Calibri 11)的字符数计算显示宽度;
  • openpyxl读取的column_dimensions.width是Excel内部存储的原始值,但保存时如果工作簿的默认字体与原文件不一致,会导致Excel重新计算显示宽度,出现偏差;
  • 如果原文件的列宽是通过「自动调整列宽」设置的,openpyxl不会保存这个自动调整状态,只会保存当时的计算值,后续字体或环境变化时显示就会走样。

解决步骤

  1. 匹配原文件默认字体
    显式设置工作簿的默认字体与原文件一致(比如原文件用Calibri 11),确保Excel计算显示宽度时用相同基准:

    from openpyxl import load_workbook
    
    if __name__ == '__main__':
        book = load_workbook('test_units.xlsx')
        # 按原文件实际字体调整,示例为Calibri 11
        book.default_style.font.name = "Calibri"
        book.default_style.font.size = 11
        sheet = book.active
        print(sheet.column_dimensions['B'].width)
        print(sheet.row_dimensions[3].height)
        book.save('test_units1.xlsx')
    
  2. 重新启用自动调整列宽(若原文件是自动调整的)
    如果原文件的列宽是自动调整的,在保存前为对应列开启自动调整:

    sheet.column_dimensions['B'].auto_size = True
    

内容的提问来源于stack exchange,提问作者Prospect138

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 06:50:14