脚本专家 发表于 3 天前

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

办公场景中,经常需要将多个Excel工作簿统一打印留档。手动打开每个文件按Ctrl+P的方式,在文件数量较大时效率极低且容易出错。通过Python+xlwings调用Excel底层打印能力,可以稳定实现批量打印。本文从基础流程到参数控制、异常处理,给出可直接运行的代码和注意事项。


import os
import xlwings as xw

folder_path = r"e:\file"
app = xw.App(visible=False, add_book=False)

try:
    for file_name in os.listdir(folder_path):
      # 跳过Excel临时文件
      if file_name.startswith("~$"):
            continue
      # 只处理Excel工作簿
      if not file_name.lower().endswith((".xlsx", ".xls", ".xlsm")):
            continue

      full_path = os.path.join(folder_path, file_name)
      wb = app.books.open(full_path)
      # 调用Excel自身的打印能力
      wb.api.PrintOut()
      print(f"已发送打印任务:{file_name}")
      wb.close()
finally:
    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)

测试阶段强烈建议使用预览模式:

wb.api.PrintOut(Preview=True)

预览确认页面布局、分页、页眉页脚无误后,再切换到正式打印:

wb.api.PrintOut()


若需要指定打印机,应先确认Excel当前识别的默认打印机名称:

print(app.api.ActivePrinter)

然后传入相同字符串即可。企业环境中的共享打印机或Follow-Me Print可能存在名称差异,使用默认打印机更稳妥。

进阶需求:只打印指定工作表。很多工作簿包含“明细”“数据”“汇总”等多张表,实际只需打印“汇总”表。直接对整个工作簿打印会输出不需要的内容。正确的做法是先定位目标工作表,再对工作表对象调用PrintOut:

import os
import xlwings as xw

folder_path = r"e:\file"
target_sheet = "汇总"
app = xw.App(visible=False, add_book=False)

try:
    for file_name in os.listdir(folder_path):
      if file_name.startswith("~$"):
            continue
      if not file_name.lower().endswith((".xlsx", ".xls", ".xlsm")):
            continue

      full_path = os.path.join(folder_path, file_name)
      wb = app.books.open(full_path)
      sheet_names =
      if target_sheet not in sheet_names:
            print(f"跳过:{file_name},不存在工作表:{target_sheet}")
            wb.close()
            continue
      sheet = wb.sheets
      sheet.api.PrintOut()
      print(f"已打印:{file_name} -> {target_sheet}")
      wb.close()
finally:
    app.quit()


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

加入日志与异常处理:生产环境使用必须记录每个文件的成功/失败状态,便于复盘。以下版本封装了try-except和日志写入:

import os
import xlwings as xw

folder_path = r"e:\file"
log_path = os.path.join(folder_path, "print_log.txt")
app = xw.App(visible=False, add_book=False)
success_count = 0
fail_count = 0

try:
    with open(log_path, "w", encoding="utf-8") as log:
      for file_name in os.listdir(folder_path):
            if file_name.startswith("~$"):
                continue
            if not file_name.lower().endswith((".xlsx", ".xls", ".xlsm")):
                continue

            full_path = os.path.join(folder_path, file_name)
            wb = None
            try:
                wb = app.books.open(full_path)
                # 测试阶段建议先使用 Preview=True
                wb.api.PrintOut()
                success_count += 1
                msg = f"成功发送打印任务:{file_name}"
                print(msg)
                log.write(msg + "\n")
            except Exception as e:
                fail_count += 1
                msg = f"打印失败:{file_name},原因:{e}"
                print(msg)
                log.write(msg + "\n")
            finally:
                if wb is not None:
                  wb.close()

      summary = f"打印任务结束:成功 {success_count} 个,失败 {fail_count} 个"
      print(summary)
      log.write(summary + "\n")
finally:
    app.quit()


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

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

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

热心网友4 发表于 3 天前

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

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

热心网友4 发表于 3 天前

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

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

热心网友4 发表于 3 天前

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

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