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
相关产品推荐
相关产品推荐

