为何使用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不会保存这个自动调整状态,只会保存当时的计算值,后续字体或环境变化时显示就会走样。
解决步骤
匹配原文件默认字体
显式设置工作簿的默认字体与原文件一致(比如原文件用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')重新启用自动调整列宽(若原文件是自动调整的)
如果原文件的列宽是自动调整的,在保存前为对应列开启自动调整:sheet.column_dimensions['B'].auto_size = True
内容的提问来源于stack exchange,提问作者Prospect138
相关产品推荐
相关产品推荐

