Python使用Spire.XLS for Python实现将Excel转换为PDF

 更新时间:2026年05月19日 11:29:26   作者:Metaphor692  
在日常办公和数据处理工作中,将 Excel 电子表格转换为 PDF 格式是一项常见且重要的需求,下面我们就来看如何使用 Spire.XLS for Python 库将 Excel 工作簿转换为 PDF 格式吧

在日常办公和数据处理工作中,将 Excel 电子表格转换为 PDF 格式是一项常见且重要的需求。PDF 格式具有跨平台兼容性、不易被修改、保持固定布局等优势,使其成为分享报表、发票、数据汇总等文档的理想选择。通过程序化方式实现 Excel 到 PDF 的转换,可以大幅提升工作效率,特别是在需要批量处理大量文件时。

本文将详细介绍如何使用 Spire.XLS for Python 库将 Excel 工作簿转换为 PDF 格式。我们将涵盖基本转换、页面适配设置、指定范围转换、以及批量处理等多种场景,帮助你构建完整的 Excel 转 PDF 解决方案。

环境准备

在开始之前,你需要安装 Spire.XLS for Python 库。可以使用 pip 命令进行安装:

pip install Spire.XLS

安装完成后,你就可以在 Python 项目中使用该库来操作 Excel 文档并进行格式转换了。

Excel 转 PDF 的应用场景

在实际工作中,Excel 转 PDF 有多种典型应用场景:

  • 报表分发:将财务报表、销售数据转换为 PDF 后发送给相关人员
  • 文档归档:将重要电子表格存档为不可篡改的 PDF 格式
  • 打印准备:确保在不同设备上打印时保持一致的布局和格式
  • 客户交付:向客户提供格式固定的发票、报价单或对账单
  • 合规要求:某些行业要求以 PDF/A 等标准格式保存文档

Spire.XLS for Python 提供了丰富的 API 来满足这些不同的转换需求,让你能够灵活控制转换过程中的各种参数。

基本的 Excel 转 PDF 转换

最基础的转换操作是将整个 Excel 工作簿保存为 PDF 格式。以下示例展示了如何完成这一基本任务:

from spire.xls import *
from spire.xls.common import *

def ConvertExcelToPDF():
    """将 Excel 工作簿转换为 PDF"""
    inputFile = "/input/Population.xlsx"
    outputFile = "/output/ToPDF.pdf"
    
    # 创建工作簿对象
    workbook = Workbook()
    
    # 加载 Excel 文件
    workbook.LoadFromFile(inputFile)
    
    # 设置工作表适配页面(确保内容完整显示)
    workbook.ConverterSetting.SheetFitToPage = True
    
    # 保存为 PDF 格式
    workbook.SaveToFile(outputFile, FileFormat.PDF)
    workbook.Dispose()
    
if __name__ == "__main__":
    ConvertExcelToPDF()

在这个示例中,我们首先创建一个 Workbook 对象并加载 Excel 文件。关键的一步是设置 ConverterSetting.SheetFitToPage = True,这个选项会确保工作表内容自动适配到 PDF 页面中,避免内容被截断。最后调用 SaveToFile() 方法并指定 FileFormat.PDF 即可完成转换。

这种基本转换适用于大多数常规场景,能够快速将整个工作簿(包括所有工作表)转换为单个 PDF 文件。

优化页面布局:自适应宽度转换

当 Excel 工作表包含较多列时,直接转换可能导致内容被分割到多个页面上。为了避免这种情况,我们可以设置页面布局,让所有内容在宽度上适配到一页内,而高度则根据内容自动延伸。以下是具体实现:

from spire.xls import *
from spire.xls.common import *

def FitWidthWhenConvertToPDF():
    """转换时让内容宽度适配到一页"""
    inputFile = "./Demos/Data/SampleB_2.xlsx"
    outputFile = "FitWidthWhenConvertToPDF.pdf"
    
    # 加载 Excel 文件
    workbook = Workbook()
    workbook.LoadFromFile(inputFile)
    
    # 遍历所有工作表,设置页面适配
    for sheet in workbook.Worksheets:
        # 设置高度不限制(0 表示自动)
        sheet.PageSetup.FitToPagesTall = 0
        # 设置宽度适配到 1 页
        sheet.PageSetup.FitToPagesWide = 1
    
    # 保存为 PDF
    workbook.SaveToFile(outputFile, FileFormat.PDF)
    workbook.Dispose()
    
    print(f"宽度适配转换完成,PDF 文件已保存至: {outputFile}")

if __name__ == "__main__":
    FitWidthWhenConvertToPDF()

这个示例的关键在于设置每个工作表的 PageSetup 属性。FitToPagesWide = 1 表示将所有列压缩到一页宽度内,而 FitToPagesTall = 0 表示高度不受限制,会根据内容自动分页。这种设置特别适合宽表格的转换,能够确保每行数据完整显示在同一页上,提高可读性。

转换指定的单元格范围

有时你只需要将 Excel 中的特定区域转换为 PDF,而不是整个工作表。这种情况下,可以先将目标区域复制到新工作表,然后仅转换该工作表。以下示例演示了这一技巧:

from spire.xls import *
from spire.xls.common import *

def ConvertSelectedRangeToPDF():
    inputFile = "/input/Population.xlsx"
    outputFile = "/output/SelectedRangeToPDF.pdf"
    
    # 加载原始 Excel 文件
    source_workbook = Workbook()
    source_workbook.LoadFromFile(inputFile)
    source_sheet = source_workbook.Worksheets[0] # 获取第一个工作表
    
    # 创建一个全新的、干净的临时 Workbook
    target_workbook = Workbook()
    target_workbook.CreateEmptySheets(1) # 严格控制:只创建 1 个工作表
    target_sheet = target_workbook.Worksheets[0]
    
    # 复制指定区域 (A4:E9) 到新 Workbook 的 A4:E9
    source_sheet.Range["A4:E9"].Copy(
        target_sheet.Range["A4:E9"], 
        False,  # 不复制公式
        True    # 复制格式
    )
    
    # 自动调整列宽
    target_sheet.Range["A4:E9"].AutoFitColumns()
    
    # 保存这个单独的 Workbook 为 PDF
    target_workbook.SaveToFile(outputFile, FileFormat.PDF)
    
    source_workbook.Dispose()
    target_workbook.Dispose()

if __name__ == "__main__":
    ConvertSelectedRangeToPDF()

这个方法通过以下步骤实现范围转换:首先创建一个新工作表作为临时容器,然后将目标区域复制过去,接着自动调整列宽以确保内容正确显示,最后仅转换这个新工作表。这种方式非常灵活,你可以轻松修改复制的区域范围来满足不同的需求。

将每个工作表转换为独立的 PDF 文件

在某些场景下,你可能需要将一个 Excel 文件中的每个工作表分别转换为单独的 PDF 文件。这在处理包含多个独立报表的工作簿时特别有用。以下是实现方法:

from spire.xls import *
from spire.xls.common import *

def ConvertEachWorksheetToSeparatePDF():
    """将每个工作表转换为独立的 PDF 文件"""
    inputFile = "./Demos/Data/EachWorksheetToDifferentPDFSample.xlsx"
    
    # 加载 Excel 文件
    workbook = Workbook()
    workbook.LoadFromFile(inputFile)
    
    # 遍历所有工作表
    for sheet in workbook.Worksheets:
        # 使用工作表名称作为 PDF 文件名
        FileName = sheet.Name + ".pdf"
        
        # 将当前工作表单独保存为 PDF
        sheet.SaveToPdf(FileName)
        
        print(f"工作表 '{sheet.Name}' 已转换为 {FileName}")
    
    workbook.Dispose()
    print("所有工作表转换完成")

if __name__ == "__main__":
    ConvertEachWorksheetToSeparatePDF()

这个示例展示了如何使用 sheet.SaveToPdf() 方法直接将单个工作表转换为 PDF。通过遍历 workbook.Worksheets 集合,我们可以为每个工作表生成独立的 PDF 文件,并以工作表名称命名输出文件。这种方法非常适合批量处理包含多个独立报表的工作簿。

转换为 PDF/A 标准格式

对于需要长期归档或符合特定行业标准的文档,PDF/A 格式是一个更好的选择。PDF/A 是 ISO 标准化的 PDF 子集,专为电子文档的长期保存而设计。以下是如何将 Excel 转换为 PDF/A-1B 格式的示例:

from spire.xls import *
from spire.xls.common import *

def ConvertToPDFA1B():
    """将 Excel 转换为 PDF/A-1B 标准格式"""
    inputFile = "./Demos/Data/ToPDF_A1BExample.xlsx"
    outputFile = "ToPDFA1B.pdf"
    
    # 创建工作簿并加载文件
    workbook = Workbook()
    workbook.LoadFromFile(inputFile)
    
    # 设置 PDF 一致性级别为 PDF/A-1B
    workbook.ConverterSetting.PdfConformanceLevel = PdfConformanceLevel.Pdf_A1B
    
    # 保存为 PDF
    workbook.SaveToFile(outputFile, FileFormat.PDF)
    workbook.Dispose()
    
    print(f"PDF/A-1B 文件已保存至: {outputFile}")

if __name__ == "__main__":
    ConvertToPDFA1B()

通过设置 ConverterSetting.PdfConformanceLevel 属性,你可以指定输出的 PDF 遵循的标准。Pdf_A1B 是最常用的 PDF/A 级别之一,它确保文档在所有兼容的阅读器中都能正确显示,并且适合长期存档。其他可用的选项还包括 Pdf_A2BPdf_A3B 等,你可以根据具体需求选择合适的标准。

实用技巧与高级应用

从 CSV 文件转换为 PDF

除了标准的 Excel 文件格式,Spire.XLS 还支持直接从 CSV 文件转换为 PDF。这在处理导出数据时非常有用:

from spire.xls import *
from spire.xls.common import *

def ConvertCSVToPDF():
    """将 CSV 文件转换为 PDF"""
    inputFile = "./Demos/Data/CSVSample.csv"
    outputFile = "CSVToPDF.pdf"
    
    # 创建工作簿并加载 CSV 文件
    workbook = Workbook()
    # 加载 CSV,指定分隔符为逗号,起始行为 1,起始列为 1
    workbook.LoadFromFile(inputFile, ",", 1, 1)
    
    # 设置工作表适配页面
    workbook.ConverterSetting.SheetFitToPage = True
    
    # 获取第一个工作表
    sheet = workbook.Worksheets[0]
    
    # 自动调整所有列的宽度
    i = 1
    while i < sheet.Columns.Length:
        sheet.AutoFitColumn(i)
        i += 1
    
    # 保存为 PDF
    workbook.SaveToFile(outputFile, FileFormat.PDF)
    workbook.Dispose()
    
    print(f"CSV 转 PDF 完成,文件已保存至: {outputFile}")

if __name__ == "__main__":
    ConvertCSVToPDF()

这个示例展示了如何加载 CSV 文件并进行格式化处理后转换为 PDF。LoadFromFile() 方法的第二个参数指定分隔符(这里是逗号),后面两个参数指定数据的起始行和起始列。加载后,通过 AutoFitColumn() 方法自动调整每列的宽度,确保内容完整显示。

批量转换工具类

在实际项目中,你可能需要批量处理多个 Excel 文件。以下是一个实用的批量转换工具类:

import os
from spire.xls import *
from spire.xls.common import *

class ExcelToPdfConverter:
    """Excel 转 PDF 批量转换器"""
    
    def __init__(self, output_folder=None):
        self.output_folder = output_folder or "./PDF_Output"
        
        # 创建输出文件夹
        if not os.path.exists(self.output_folder):
            os.makedirs(self.output_folder)
    
    def convert_single_file(self, input_file, output_file=None, fit_to_page=True):
        """转换单个 Excel 文件为 PDF"""
        try:
            workbook = Workbook()
            workbook.LoadFromFile(input_file)
            
            if fit_to_page:
                workbook.ConverterSetting.SheetFitToPage = True
            
            if output_file is None:
                base_name = os.path.splitext(os.path.basename(input_file))[0]
                output_file = os.path.join(self.output_folder, f"{base_name}.pdf")
            
            workbook.SaveToFile(output_file, FileFormat.PDF)
            workbook.Dispose()
            
            print(f"✓ 转换成功: {os.path.basename(input_file)}")
            return True
            
        except Exception as e:
            print(f"✗ 转换失败 {os.path.basename(input_file)}: {str(e)}")
            return False
    
    def batch_convert(self, input_folder, file_extension=".xlsx"):
        """批量转换文件夹中的所有 Excel 文件"""
        excel_files = []
        
        # 查找所有 Excel 文件
        for filename in os.listdir(input_folder):
            if filename.lower().endswith(file_extension):
                excel_files.append(os.path.join(input_folder, filename))
        
        if not excel_files:
            print(f"在 {input_folder} 中未找到 {file_extension} 文件")
            return
        
        print(f"找到 {len(excel_files)} 个文件,开始转换...")
        
        success_count = 0
        fail_count = 0
        
        for excel_file in excel_files:
            if self.convert_single_file(excel_file):
                success_count += 1
            else:
                fail_count += 1
        
        print(f"\n转换完成!")
        print(f"成功: {success_count} 个文件")
        print(f"失败: {fail_count} 个文件")
        print(f"输出目录: {self.output_folder}")
    
    def convert_with_custom_settings(self, input_file, output_file, 
                                     fit_wide=True, fit_tall=0):
        """使用自定义页面设置进行转换"""
        workbook = Workbook()
        workbook.LoadFromFile(input_file)
        
        # 设置页面适配
        for sheet in workbook.Worksheets:
            sheet.PageSetup.FitToPagesWide = 1 if fit_wide else 0
            sheet.PageSetup.FitToPagesTall = fit_tall
        
        workbook.SaveToFile(output_file, FileFormat.PDF)
        workbook.Dispose()
        
        print(f"自定义设置转换完成: {output_file}")

def main():
    # 示例 1: 批量转换
    converter = ExcelToPdfConverter("./PDF_Output")
    converter.batch_convert("./Excel_Files", ".xlsx")
    
    # 示例 2: 单个文件转换
    # converter.convert_single_file("./Data/Report.xlsx")
    
    # 示例 3: 自定义设置转换
    # converter.convert_with_custom_settings(
    #     "./Data/WideTable.xlsx",
    #     "./Output/WideTable.pdf",
    #     fit_wide=True,
    #     fit_tall=0
    # )

if __name__ == "__main__":
    main()

这个工具类提供了多种转换方法,支持单文件转换、批量转换以及自定义页面设置。你可以根据实际需求选择合适的方法,并将其集成到自动化工作流中。

转换质量优化建议

为了获得最佳的 PDF 输出效果,注意以下几点:

页面设置

  • 根据内容特点选择合适的页面方向(横向或纵向)
  • 使用 FitToPagesWideFitToPagesTall 控制分页
  • 适当设置页边距,避免内容过于拥挤

字体和格式

  • 确保使用的字体在目标系统上可用
  • 检查特殊字符和符号是否正确显示
  • 验证颜色和图片在 PDF 中的呈现效果

性能考虑

  • 大文件转换时考虑内存使用情况
  • 批量处理时使用循环而非一次性加载所有文件
  • 转换完成后及时调用 Dispose() 释放资源

常见问题与解决方案

问题 1:转换后的 PDF 内容被截断

解决方案:启用 SheetFitToPage 或设置 FitToPagesWideFitToPagesTall 属性,确保内容适配页面。

问题 2:中文或其他特殊字符显示异常

解决方案:确保 Excel 文件中使用了正确的字体,并且在转换环境中安装了这些字体。可以在转换前检查字体嵌入设置。

问题 3:转换速度慢

解决方案:对于大型工作簿,可以考虑只转换必要的工作表,或者先将数据拆分到多个小文件中再分别转换。

总结

掌握这些技能后,你可将其无缝应用于自动化报表生成、文档管理系统及数据归档等场景。通过灵活控制转换细节,不仅能大幅提升办公自动化效率,更能确保输出文档的专业与规范,让数据呈现更加高效、精准。

以上就是Python使用Spire.XLS for Python实现将Excel转换为PDF的详细内容,更多关于Python Excel转PDF的资料请关注脚本之家其它相关文章!

相关文章

  • 浅谈python中requests模块导入的问题

    浅谈python中requests模块导入的问题

    今天小编就为大家分享一篇浅谈python中requests模块导入的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-05-05
  • Python实现SQL注入检测插件实例代码

    Python实现SQL注入检测插件实例代码

    这篇文章主要给大家介绍了关于Python实现SQL注入检测插件的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-02-02
  • pip已经安装好第三方库但pycharm中import时还是标红的解决方案

    pip已经安装好第三方库但pycharm中import时还是标红的解决方案

    这篇文章主要介绍了python中pip已经安装好第三方库但pycharm中import时还是标红的问题,本文给大家分享解决方法,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-10-10
  • Python判断一个list中是否包含另一个list全部元素的方法分析

    Python判断一个list中是否包含另一个list全部元素的方法分析

    这篇文章主要介绍了Python判断一个list中是否包含另一个list全部元素的方法,结合实例形式对比分析了Python针对列表list元素包含关系的相关转换、判断操作技巧,需要的朋友可以参考下
    2018-12-12
  • 理解python中装饰器的作用

    理解python中装饰器的作用

    python装饰器就是用于拓展原来函数功能的一种函数,这个函数的特殊之处在于它的返回值也是一个函数,使用python装饰器的好处就是在不用更改原函数的代码前提下给函数增加新的功能
    2021-07-07
  • Python多线程编程(一):threading模块综述

    Python多线程编程(一):threading模块综述

    这篇文章主要介绍了Python多线程编程(一):threading模块综述,本文讲解了threading模块、Thread类、Queue提供的类等内容,需要的朋友可以参考下
    2015-04-04
  • Python实现数据地址实体抽取

    Python实现数据地址实体抽取

    大家好,本篇文章主要讲的是Python实现数据地址实体抽取,感兴趣的同学赶快来看一看吧,对你有帮助的话记得收藏一下
    2022-02-02
  • 解决Pycharm下面出现No R interpreter defined的问题

    解决Pycharm下面出现No R interpreter defined的问题

    今天小编就为大家分享一篇解决Pycharm下面出现No R interpreter defined的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-10-10
  • Python内置函数input()示例详解

    Python内置函数input()示例详解

    input()函数是Python中用于获取用户输入的一个简单而强大的工具,它在创建需要用户交互的程序时非常有用,这篇文章主要介绍了Python内置函数input()详解,需要的朋友可以参考下
    2024-04-04
  • VSCode中自动为Python文件添加头部注释

    VSCode中自动为Python文件添加头部注释

    这篇文章主要介绍了VSCode中自动为Python文件添加头部注释,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-11-11

最新评论