You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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("批量转换任务完成!")

关键说明

  1. 文件过滤:通过filename.lower().endswith(".xlsx")确保只处理Excel文件,避免误操作其他格式文件
  2. 工作表定位:直接通过名称Worksheets(sheet_name)获取目标工作表,比用索引更可靠,不会因为工作表顺序变化出错
  3. PDF命名规则:用os.path.splitext去掉原文件扩展名,将工作表名的空格替换为下划线,避免路径格式问题
  4. 进程清理:最后调用Quit()和del xl_app彻底关闭Excel进程,不会在后台残留占用资源
  5. 错误处理:加入双层try-except块捕获可能的错误(比如找不到工作表、文件损坏打不开等),避免程序中途崩溃

内容的提问来源于stack exchange,提问作者Wendtb

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 08:34:02