如何用Python动态写入Excel多列内容,解决AA列及之后写入报错问题
问题原因
- 原有列名生成逻辑仅支持A-Z的单字母列名,当列索引≥26时,
chr(ord('A') + i)得到的不是合法的Excel列名字符,导致xlsxwriter解析列名失败抛出错误。 - 原有代码逻辑存在顺序问题:先调用
workbook.close()再调用writer.save()会导致重复操作报错,writer.save()本身会自动处理workbook的关闭,无需手动调用workbook.close()。
解决方法
可以使用xlsxwriter自带的xl_col_to_name工具函数,它支持自动将0开始的列索引转换为Excel风格的列名(0对应A、26对应AA、27对应AB,以此类推),完美适配超过26列的使用场景。如果不想处理列名转换,也可以直接使用列索引调用相关方法,写法更简洁。
修改后完整代码(列名转换写法)
import pandas as pd # 导入列索引转列名的工具函数 from xlsxwriter.utility import xl_col_to_name writer = pd.ExcelWriter("Sharath.xlsx", engine='xlsxwriter') df1 = pd.DataFrame() df1.to_excel(writer, sheet_name='Sheet1', header=True, index=False) workbook = writer.book worksheet = writer.sheets['Sheet1'] merge_format = workbook.add_format({ 'bold': True, 'text_wrap': True, 'border': 2, 'align': 'center', 'valign': 'vcenter'}) # 要写入多少列就修改range的结束值即可,比如100列就改为range(0,100) for col_idx in range(0, 50): col_name = xl_col_to_name(col_idx) columnmerge = f"{col_name}{{}}:{col_name}{{}}" worksheet.set_column(f"{col_name}:{col_name}", 20) worksheet.merge_range(columnmerge.format(2, 4), "Test", merge_format) writer.save() print("Excel file is saved") print("Report generation completed")
更简洁的索引写法(无需转列名)
xlsxwriter的set_column、merge_range方法本身支持直接传入数字索引作为参数,不需要转换为列名字符串,写法更简单:
import pandas as pd writer = pd.ExcelWriter("Sharath.xlsx", engine='xlsxwriter') df1 = pd.DataFrame() df1.to_excel(writer, sheet_name='Sheet1', header=True, index=False) workbook = writer.book worksheet = writer.sheets['Sheet1'] merge_format = workbook.add_format({ 'bold': True, 'text_wrap': True, 'border': 2, 'align': 'center', 'valign': 'vcenter'}) for col_idx in range(0, 50): # set_column参数:(起始列索引, 结束列索引, 列宽) worksheet.set_column(col_idx, col_idx, 20) # merge_range参数:(起始行索引, 起始列索引, 结束行索引, 结束列索引, 内容, 格式) # Excel行号从1开始,xlsxwriter行索引从0开始,原需求合并2-4行对应索引1-3 worksheet.merge_range(1, col_idx, 3, col_idx, "Test", merge_format) writer.save() print("Excel file is saved") print("Report generation completed")
内容的提问来源于stack exchange,提问作者kgsharathkumar
相关产品推荐
相关产品推荐

