如何用Python批量将文件夹中指定工作表的.xlsx文件转PDF?
批量导出Excel指定工作表为独立PDF的解决方案
我来帮你搞定这个批量转换的需求,先梳理下你现有代码里的几个关键问题,然后给你修正后的完整代码:
现有代码的问题点
- 内层循环
for file in range(len(filename))完全逻辑错误,这是在遍历文件名的字符个数,根本不是处理工作表 - PDF文件名生成错误,直接拼接会出现类似
xxx.xlsx\.pdf的无效路径 - 没有指定目标工作表名称,而是固定取第2个工作表(Excel索引从1开始)
- 没有关闭工作簿和清理Excel进程,容易导致后台残留Excel进程
- 没有过滤文件夹里的非Excel文件,可能触发报错
修正后的完整代码
import os from win32com import client # 配置路径 source_folder = r"C:\Users\user1\.spyder-py3\QAR" output_folder = r"C:\Users\user1\.spyder-py3\QAR" # 初始化Excel应用,设置为后台运行(不显示界面) xl_app = client.Dispatch("Excel.Application") xl_app.Visible = False xl_app.DisplayAlerts = False # 关闭保存提示等弹窗 # 定义需要导出的工作表名称 target_sheets = ["Page 1", "Page 2"] # 遍历文件夹里的所有.xlsx文件 for filename in os.listdir(source_folder): # 只处理xlsx文件 if filename.lower().endswith(".xlsx"): file_path = os.path.join(source_folder, filename) print(f"正在处理文件: {filename}") try: # 打开工作簿 workbook = xl_app.Workbooks.Open(file_path) # 遍历目标工作表 for sheet_name in target_sheets: try: # 获取指定工作表 worksheet = workbook.Worksheets(sheet_name) # 生成PDF文件名:原文件名去掉扩展名 + 工作表名 + .pdf base_name = os.path.splitext(filename)[0] pdf_filename = f"{base_name}_{sheet_name.replace(' ', '_')}.pdf" pdf_path = os.path.join(output_folder, pdf_filename) # 导出为PDF worksheet.ExportAsFixedFormat( Type=0, # 0表示PDF格式 Filename=pdf_path, Quality=0 # 0表示标准质量 ) print(f"已导出: {pdf_filename}") except Exception as e: print(f"文件{filename}中找不到工作表{sheet_name},错误信息: {str(e)}") # 关闭工作簿,不保存更改(因为只是导出PDF,不需要修改原文件) workbook.Close(SaveChanges=False) except Exception as e: print(f"处理文件{filename}时出错: {str(e)}") # 退出Excel应用,清理进程 xl_app.Quit() # 释放COM对象,避免残留进程 del xl_app print("批量转换任务完成!")
关键说明
- 文件过滤:通过
filename.lower().endswith(".xlsx")确保只处理Excel文件,避免误操作其他格式文件 - 工作表定位:直接通过名称
Worksheets(sheet_name)获取目标工作表,比用索引更可靠,不会因为工作表顺序变化出错 - PDF命名规则:用
os.path.splitext去掉原文件扩展名,将工作表名的空格替换为下划线,避免路径格式问题 - 进程清理:最后调用
Quit()和del xl_app彻底关闭Excel进程,不会在后台残留占用资源 - 错误处理:加入双层try-except块捕获可能的错误(比如找不到工作表、文件损坏打不开等),避免程序中途崩溃
内容的提问来源于stack exchange,提问作者Wendtb
相关产品推荐
相关产品推荐

