查看: 144|回复: 3

Python xlwings批量打印Excel工作簿参数详解与异常处理

[复制链接]
发表于 2 小时前 | 显示全部楼层 |阅读模式
办公场景中,经常需要将多个Excel工作簿统一打印留档。手动打开每个文件按Ctrl+P的方式,在文件数量较大时效率极低且容易出错。通过Python+xlwings调用Excel底层打印能力,可以稳定实现批量打印。本文从基础流程到参数控制、异常处理,给出可直接运行的代码和注意事项。
  1. import os
  2. import xlwings as xw
  3. folder_path = r"e:\file"
  4. app = xw.App(visible=False, add_book=False)
  5. try:
  6.     for file_name in os.listdir(folder_path):
  7.         # 跳过Excel临时文件
  8.         if file_name.startswith("~$"):
  9.             continue
  10.         # 只处理Excel工作簿
  11.         if not file_name.lower().endswith((".xlsx", ".xls", ".xlsm")):
  12.             continue
  13.         full_path = os.path.join(folder_path, file_name)
  14.         wb = app.books.open(full_path)
  15.         # 调用Excel自身的打印能力
  16.         wb.api.PrintOut()
  17.         print(f"已发送打印任务:{file_name}")
  18.         wb.close()
  19. finally:
  20.     app.quit()
复制代码

此段代码执行流程:启动Excel隐藏实例 → 遍历文件夹 → 过滤临时文件和无关类型 → 打开工作簿 → 调用PrintOut → 关闭工作簿 → 最终退出Excel。建议首次使用时,在测试目录中只放1-2个文件验证,避免正式目录直接打印造成浪费。

PrintOut参数控制:默认打印整个工作簿,但可以通过传入常用参数实现更精确的控制。以下表格列出最常用的参数及其作用:
- From:从第几页开始打印(如From=1)
- To:打印到第几页(如To=2)
- Copies:打印份数(如Copies=2)
- Preview:是否先进入打印预览(Preview=True)
- ActivePrinter:指定打印机名称(例如ActivePrinter="Microsoft Print to PDF")
- Collate:是否逐份打印(Collate=True)

测试阶段强烈建议使用预览模式:
  1. wb.api.PrintOut(Preview=True)
复制代码
预览确认页面布局、分页、页眉页脚无误后,再切换到正式打印:
  1. wb.api.PrintOut()
复制代码

若需要指定打印机,应先确认Excel当前识别的默认打印机名称:
  1. print(app.api.ActivePrinter)
复制代码
然后传入相同字符串即可。企业环境中的共享打印机或Follow-Me Print可能存在名称差异,使用默认打印机更稳妥。

进阶需求:只打印指定工作表。很多工作簿包含“明细”“数据”“汇总”等多张表,实际只需打印“汇总”表。直接对整个工作簿打印会输出不需要的内容。正确的做法是先定位目标工作表,再对工作表对象调用PrintOut:
  1. import os
  2. import xlwings as xw
  3. folder_path = r"e:\file"
  4. target_sheet = "汇总"
  5. app = xw.App(visible=False, add_book=False)
  6. try:
  7.     for file_name in os.listdir(folder_path):
  8.         if file_name.startswith("~$"):
  9.             continue
  10.         if not file_name.lower().endswith((".xlsx", ".xls", ".xlsm")):
  11.             continue
  12.         full_path = os.path.join(folder_path, file_name)
  13.         wb = app.books.open(full_path)
  14.         sheet_names = [sheet.name for sheet in wb.sheets]
  15.         if target_sheet not in sheet_names:
  16.             print(f"跳过:{file_name},不存在工作表:{target_sheet}")
  17.             wb.close()
  18.             continue
  19.         sheet = wb.sheets[target_sheet]
  20.         sheet.api.PrintOut()
  21.         print(f"已打印:{file_name} -> {target_sheet}")
  22.         wb.close()
  23. finally:
  24.     app.quit()
复制代码

此代码在批量遍历中增加了工作表存在判断,避免因缺少目标表导致报错。

加入日志与异常处理:生产环境使用必须记录每个文件的成功/失败状态,便于复盘。以下版本封装了try-except和日志写入:
  1. import os
  2. import xlwings as xw
  3. folder_path = r"e:\file"
  4. log_path = os.path.join(folder_path, "print_log.txt")
  5. app = xw.App(visible=False, add_book=False)
  6. success_count = 0
  7. fail_count = 0
  8. try:
  9.     with open(log_path, "w", encoding="utf-8") as log:
  10.         for file_name in os.listdir(folder_path):
  11.             if file_name.startswith("~$"):
  12.                 continue
  13.             if not file_name.lower().endswith((".xlsx", ".xls", ".xlsm")):
  14.                 continue
  15.             full_path = os.path.join(folder_path, file_name)
  16.             wb = None
  17.             try:
  18.                 wb = app.books.open(full_path)
  19.                 # 测试阶段建议先使用 Preview=True
  20.                 wb.api.PrintOut()
  21.                 success_count += 1
  22.                 msg = f"成功发送打印任务:{file_name}"
  23.                 print(msg)
  24.                 log.write(msg + "\n")
  25.             except Exception as e:
  26.                 fail_count += 1
  27.                 msg = f"打印失败:{file_name},原因:{e}"
  28.                 print(msg)
  29.                 log.write(msg + "\n")
  30.             finally:
  31.                 if wb is not None:
  32.                     wb.close()
  33.         summary = f"打印任务结束:成功 {success_count} 个,失败 {fail_count} 个"
  34.         print(summary)
  35.         log.write(summary + "\n")
  36. finally:
  37.     app.quit()
复制代码

脚本执行完后,检查日志文件可知具体失败原因。注意:日志只能记录脚本层异常,打印机缺纸、卡纸等设备问题需结合打印队列确认。

批量打印最容易忽略的问题是临时文件(文件名以~$开头),脚本中必须过滤;同时要确认每个工作簿的页面布局、打印区域、纸张方向在打印前已设置正确。批量打印不是盲目执行,建议遵循“先预览一个文件 → 试打2-3个文件 → 全量执行”三步流程,降低出错风险。

通过xlwings的.api接口调用Excel原生的PrintOut方法,Python脚本可以稳定完成批量打印任务。关键不在于记住某个参数,而在于将文件筛选、打开打印、异常处理、资源释放整合为可复用的自动化流程。
回复

使用道具 举报

发表于 2 小时前 | 显示全部楼层

Re: Python xlwings批量打印Excel工作簿参数详解与异常处理

感谢分享!代码结构清晰,异常处理和日志记录也很到位,直接拿过来改改路径就能用。我有个小问题想请教:如果某些工作簿的页面设置(比如纸张大小或缩放比例)不一致,PrintOut会直接按文件自身设置打印吗?还是需要额外处理才能统一输出?希望能聊聊这方面的经验。
回复 支持 反对

使用道具 举报

发表于 2 小时前 | 显示全部楼层

Re: Python xlwings批量打印Excel工作簿参数详解与异常处理

楼主分享的这个xlwings批量打印方案非常实用,代码结构清晰,尤其是异常处理和日志记录的部分对实际部署很有帮助。我之前手动打印几十个Excel文件时也头疼过,用了类似思路确实能省大量时间。 有个小细节想请教:`wb.api.PrintOut()` 调用的是Excel默认打印设置,如果某个工作簿内页面设置(比如纸张方向、边距)不一致,会不会出现打印结果错乱?还是说PrintOut会沿用文件自身的页面布局?望楼主指点一下。
回复 支持 反对

使用道具 举报

发表于 2 小时前 | 显示全部楼层

Re: Python xlwings批量打印Excel工作簿参数详解与异常处理

这个教程非常实用,正好解决了我批量打印月报的痛点。之前都是手动一个个打开,经常漏打或者重复打。代码里跳过临时文件、隐藏Excel实例这些细节很贴心,避免了对正常操作的干扰。特别是用 `Preview=True` 先预览再正式打印的建议,对新手很友好,能省不少纸。 请问在实际使用中,如果文件夹里混有加密或损坏的Excel文件,`app.books.open` 这一步会不会直接报错导致程序中断?如果会的话,有没有办法在打开前做一次简单校验,或者用 `try-except` 跳过单个坏文件继续处理下一个?另外,对于打印机名称获取,`app.api.ActivePrinter` 返回的是长字符串,不同电脑上可能前缀不一样,直接赋值给 `ActivePrinter` 会不会因为字符串不匹配而失效?期待进一步的补充建议。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

指导单位

江苏省公安厅

江苏省通信管理局

浙江省台州刑侦支队

DEFCON GROUP 86025

Hacking Group 021A

旗下站点

态势感知中心

应急响应中心

红盟安全

联系我们

官方QQ群:112851260

官方邮箱:security#ihonker.org(#改成@)

官方核心成员

关注微信公众号

Archiver|手机版|小黑屋| ( 沪ICP备2021026908号 )

GMT+8, 2026-7-10 12:59 , Processed in 0.031493 second(s), 18 queries , Gzip On, Redis On.

Powered by ihonker.com

Copyright © 2015-现在.

  • 返回顶部