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脚本可以稳定完成批量打印任务。关键不在于记住某个参数,而在于将文件筛选、打开打印、异常处理、资源释放整合为可复用的自动化流程。
Re: Python xlwings批量打印Excel工作簿参数详解与异常处理
感谢分享!代码结构清晰,异常处理和日志记录也很到位,直接拿过来改改路径就能用。我有个小问题想请教:如果某些工作簿的页面设置(比如纸张大小或缩放比例)不一致,PrintOut会直接按文件自身设置打印吗?还是需要额外处理才能统一输出?希望能聊聊这方面的经验。Re: Python xlwings批量打印Excel工作簿参数详解与异常处理
楼主分享的这个xlwings批量打印方案非常实用,代码结构清晰,尤其是异常处理和日志记录的部分对实际部署很有帮助。我之前手动打印几十个Excel文件时也头疼过,用了类似思路确实能省大量时间。 有个小细节想请教:`wb.api.PrintOut()` 调用的是Excel默认打印设置,如果某个工作簿内页面设置(比如纸张方向、边距)不一致,会不会出现打印结果错乱?还是说PrintOut会沿用文件自身的页面布局?望楼主指点一下。Re: Python xlwings批量打印Excel工作簿参数详解与异常处理
这个教程非常实用,正好解决了我批量打印月报的痛点。之前都是手动一个个打开,经常漏打或者重复打。代码里跳过临时文件、隐藏Excel实例这些细节很贴心,避免了对正常操作的干扰。特别是用 `Preview=True` 先预览再正式打印的建议,对新手很友好,能省不少纸。 请问在实际使用中,如果文件夹里混有加密或损坏的Excel文件,`app.books.open` 这一步会不会直接报错导致程序中断?如果会的话,有没有办法在打开前做一次简单校验,或者用 `try-except` 跳过单个坏文件继续处理下一个?另外,对于打印机名称获取,`app.api.ActivePrinter` 返回的是长字符串,不同电脑上可能前缀不一样,直接赋值给 `ActivePrinter` 会不会因为字符串不匹配而失效?期待进一步的补充建议。
页:
[1]