使用xlsxwriter、openpyxl遇‘Workbook’无‘write’属性错误求助
解决Pandas+Openpyxl创建Excel报表的
'Workbook' object has no attribute 'write'错误 我来帮你搞定这个问题!你遇到的错误核心是混淆了openpyxl原生的Workbook对象和Pandas的ExcelWriter对象的用法——Pandas的写入流程需要依赖ExcelWriter来桥接,直接操作openpyxl的工作簿后再调用Pandas的方法就会触发这个报错。
错误原因拆解
你之前的流程大概是:
- 用openpyxl创建工作簿、设置格式 → 保存关闭
- 重新加载这个工作簿 → 尝试用Pandas写入DataFrame
- 调用
writer.save()时出错
问题出在:你加载后的writer其实是openpyxl的Workbook实例,而不是Pandas的ExcelWriter对象。Workbook没有write方法,自然会报错。
正确的两种实现方案
方案1:从头创建带格式的报表(推荐)
直接用Pandas的ExcelWriter结合openpyxl设置格式,全程用一套对象操作,不用反复保存加载:
import pandas as pd from openpyxl.styles import Font, Alignment, Border, Side, PatternFill # 1. 准备测试数据 df = pd.DataFrame({ '姓名': ['张三', '李四', '王五'], '年龄': [28, 32, 25], '部门': ['研发部', '市场部', '人事部'] }) # 2. 创建ExcelWriter(指定openpyxl引擎) writer = pd.ExcelWriter('员工报表.xlsx', engine='openpyxl') workbook = writer.book worksheet = workbook.create_sheet('员工数据') # 创建新工作表 # 3. 定义表头样式 header_font = Font(bold=True, color='FFFFFF') header_fill = PatternFill(start_color='2E75B5', end_color='2E75B5', fill_type='solid') header_align = Alignment(horizontal='center', vertical='center') thin_border = Border(left=Side(style='thin'), right=Side(style='thin'), top=Side(style='thin'), bottom=Side(style='thin')) # 4. 写入表头并应用样式 headers = df.columns for col_idx, header in enumerate(headers, 1): cell = worksheet.cell(row=1, column=col_idx, value=header) cell.font = header_font cell.fill = header_fill cell.alignment = header_align cell.border = thin_border # 5. 写入DataFrame(从第2行开始,不自带表头) df.to_excel(writer, sheet_name='员工数据', startrow=1, header=False, index=False) # 6. 设置数据区域样式 for row in worksheet.iter_rows(min_row=2, max_row=len(df)+1, min_col=1, max_col=len(headers)): for cell in row: cell.alignment = Alignment(horizontal='center', vertical='center') cell.border = thin_border # 7. 调整列宽(可选优化) for col in worksheet.columns: max_length = 0 col_name = col[0].column_letter # 获取列字母(如A、B) for cell in col: try: if len(str(cell.value)) > max_length: max_length = len(str(cell.value)) except: pass adjusted_width = max_length + 2 worksheet.column_dimensions[col_name].width = adjusted_width # 8. 保存并关闭 writer.close()
方案2:先创建格式模板,再写入DataFrame
如果你已经有了设置好格式的空模板文件,想直接写入数据,可以用ExcelWriter的追加模式:
import pandas as pd from openpyxl import load_workbook # 1. 准备数据 df = pd.DataFrame({ '姓名': ['赵六', '孙七'], '年龄': [30, 27], '部门': ['财务部', '行政部'] }) # 2. 以追加模式打开模板文件,指定overlay覆盖已有工作表内容 writer = pd.ExcelWriter('员工报表模板.xlsx', engine='openpyxl', mode='a', if_sheet_exists='overlay') # 3. 写入DataFrame(从第2行开始,跳过表头) df.to_excel(writer, sheet_name='员工数据', startrow=1, header=False, index=False) # 4. 保存关闭 writer.close()
关键注意点
- 始终用
pd.ExcelWriter作为Pandas写入Excel的入口,不要直接操作openpyxl的Workbook对象来配合Pandas的to_excel - 当需要修改已有文件时,必须指定
engine='openpyxl'和mode='a',同时设置if_sheet_exists='overlay'(Pandas 1.4.0+支持)来覆盖工作表内容,而不是创建新表
内容的提问来源于stack exchange,提问作者quinn




