You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python中win32com循环打印Excel仅输出单页的问题

问题原因

你的循环仅执行一次的核心问题:

  • 第一次循环里调用了workbook.close(),后续循环中的worksheet已经是已关闭的工作簿对象,无法再修改单元格内容,执行时会触发未被捕获的异常,导致循环直接终止。
  • 每次循环重复创建Excel COM实例,不仅效率低下,还容易残留无用的Excel进程。
修正后的代码

方案1:复用工作簿与COM实例(减少文件IO)

# 提前打开工作簿,放在循环外部
workbook = openpyxl.load_workbook(r'employee_list.xlsx')
worksheet = workbook["Template"]

# 仅初始化一次Excel COM实例
o = win32com.client.Dispatch('Excel.Application')
o.visible = False

for i in range(len(employee_list)):
    # 修改单元格内容
    worksheet.cell(row=1, column=2).value = employee_list[i][1]
    worksheet.cell(row=6, column=3).value = employee_list[i][4]
    worksheet.cell(row=7, column=3).value = employee_list[i][2]
    worksheet.cell(row=8, column=3).value = employee_list[i][3]

    # 保存当前修改
    workbook.save(r'employee_list.xlsx')

    # 打开工作簿并打印
    wb = o.Workbooks.Open(r'employee_list.xlsx')
    ws = wb.Worksheets("Template")
    ws.PrintOut()
    wb.Close(False)

# 循环结束后统一释放资源
workbook.close()
o.Quit()
del o

方案2:全程用win32com处理(更高效,无需跨库操作)

o = win32com.client.Dispatch('Excel.Application')
o.visible = False
wb = o.Workbooks.Open(r'employee_list.xlsx')
ws = wb.Worksheets("Template")

for emp in employee_list:
    # 直接修改单元格,无需额外保存(打印后可选择最终保存)
    ws.Cells(1, 2).Value = emp[1]
    ws.Cells(6, 3).Value = emp[4]
    ws.Cells(7, 3).Value = emp[2]
    ws.Cells(8, 3).Value = emp[3]
    
    ws.PrintOut()

wb.Close(True)  # True表示保存最终修改,False则丢弃
o.Quit()
del o
关键优化点
  • 工作簿对象与Excel COM实例仅初始化一次,避免重复创建/关闭引发的资源冲突。
  • 方案2直接通过win32com完成修改与打印,省去了不同库之间的文件读写操作,效率更高。

内容的提问来源于stack exchange,提问作者george99gr

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 23:32:59