办公场景中,经常需要将多个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)
复制代码 预览确认页面布局、分页、页眉页脚无误后,再切换到正式打印:
若需要指定打印机,应先确认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 = [sheet.name for sheet in wb.sheets]
- if target_sheet not in sheet_names:
- print(f"跳过:{file_name},不存在工作表:{target_sheet}")
- wb.close()
- continue
- sheet = wb.sheets[target_sheet]
- 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脚本可以稳定完成批量打印任务。关键不在于记住某个参数,而在于将文件筛选、打开打印、异常处理、资源释放整合为可复用的自动化流程。 |