使用Pandas导出DataFrame至Excel自动调整列宽,AWS部署后触发'Worksheet' object has no attribute 'set_column'错误
解决AWS环境下ExcelWriter Worksheet无set_column属性的问题
这个问题看起来有点诡异,但核心原因其实是Pandas在不同环境下默认使用的Excel引擎不一致——哪怕Python和Pandas版本完全相同,也会出现这种情况。
问题根源
你代码里的set_column是xlsxwriter库中Worksheet对象的专属方法,但如果AWS环境中Pandas默认使用的是openpyxl(或其他不支持该方法的引擎),那么writer.sheets[k]返回的就是openpyxl的Worksheet对象,自然没有set_column属性。
解决方案
1. 明确指定ExcelWriter使用xlsxwriter引擎
修改你的ExcelWriter初始化代码,显式指定engine='xlsxwriter',确保使用支持set_column的引擎:
from pandas import ExcelWriter # 初始化writer时指定引擎为xlsxwriter writer = ExcelWriter("output_file.xlsx", engine="xlsxwriter") final_1 = { ... } # 你的DataFrame字典 # 写入所有sheet for k, v in final_1.items(): v.to_excel(writer, sheet_name=k, index=False) # 调整列宽 for k, v in final_1.items(): worksheet = writer.sheets[k] for column in v: column_length = max(v[column].astype(str).map(len).max(), len(column)) col_idx = v.columns.get_loc(column) worksheet.set_column(col_idx, col_idx, column_length + 1) # 务必关闭writer完成写入 writer.close()
2. 确保AWS环境安装了xlsxwriter
本地环境可能已经装了xlsxwriter,但AWS部署时可能遗漏了这个依赖。在你的requirements.txt中添加:
xlsxwriter>=3.0.0
或者在部署脚本中执行pip install xlsxwriter,确保依赖库存在。
备选方案:如果想用openpyxl引擎
如果你更倾向于使用openpyxl,可以调整列宽的代码适配openpyxl的API(openpyxl通过column_dimensions来设置列宽):
from pandas import ExcelWriter from openpyxl.utils import get_column_letter writer = ExcelWriter("output_file.xlsx", engine="openpyxl") final_1 = { ... } # 你的DataFrame字典 for k, v in final_1.items(): v.to_excel(writer, sheet_name=k, index=False) for k, v in final_1.items(): worksheet = writer.sheets[k] for column in v: column_length = max(v[column].astype(str).map(len).max(), len(column)) col_idx = v.columns.get_loc(column) # openpyxl的列字母是从A开始,所以索引要+1 col_letter = get_column_letter(col_idx + 1) worksheet.column_dimensions[col_letter].width = column_length + 1 writer.close()
为什么本地正常?
因为你本地环境中xlsxwriter是默认引擎(或者Pandas优先找到了xlsxwriter),而AWS环境中可能默认使用了openpyxl,导致API不兼容。
内容的提问来源于stack exchange,提问作者Rahul Sharma
相关产品推荐
相关产品推荐

