You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

使用xlsxwriter、openpyxl遇‘Workbook’无‘write’属性错误求助

解决Pandas+Openpyxl创建Excel报表的'Workbook' object has no attribute 'write'错误

我来帮你搞定这个问题!你遇到的错误核心是混淆了openpyxl原生的Workbook对象和Pandas的ExcelWriter对象的用法——Pandas的写入流程需要依赖ExcelWriter来桥接,直接操作openpyxl的工作簿后再调用Pandas的方法就会触发这个报错。

错误原因拆解

你之前的流程大概是:

  1. 用openpyxl创建工作簿、设置格式 → 保存关闭
  2. 重新加载这个工作簿 → 尝试用Pandas写入DataFrame
  3. 调用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

火山引擎 最新活动