Python使用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_A2B、Pdf_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 输出效果,注意以下几点:
页面设置
- 根据内容特点选择合适的页面方向(横向或纵向)
- 使用
FitToPagesWide和FitToPagesTall控制分页 - 适当设置页边距,避免内容过于拥挤
字体和格式
- 确保使用的字体在目标系统上可用
- 检查特殊字符和符号是否正确显示
- 验证颜色和图片在 PDF 中的呈现效果
性能考虑
- 大文件转换时考虑内存使用情况
- 批量处理时使用循环而非一次性加载所有文件
- 转换完成后及时调用
Dispose()释放资源
常见问题与解决方案
问题 1:转换后的 PDF 内容被截断
解决方案:启用 SheetFitToPage 或设置 FitToPagesWide 和 FitToPagesTall 属性,确保内容适配页面。
问题 2:中文或其他特殊字符显示异常
解决方案:确保 Excel 文件中使用了正确的字体,并且在转换环境中安装了这些字体。可以在转换前检查字体嵌入设置。
问题 3:转换速度慢
解决方案:对于大型工作簿,可以考虑只转换必要的工作表,或者先将数据拆分到多个小文件中再分别转换。
总结
掌握这些技能后,你可将其无缝应用于自动化报表生成、文档管理系统及数据归档等场景。通过灵活控制转换细节,不仅能大幅提升办公自动化效率,更能确保输出文档的专业与规范,让数据呈现更加高效、精准。
以上就是Python使用Spire.XLS for Python实现将Excel转换为PDF的详细内容,更多关于Python Excel转PDF的资料请关注脚本之家其它相关文章!
相关文章
pip已经安装好第三方库但pycharm中import时还是标红的解决方案
这篇文章主要介绍了python中pip已经安装好第三方库但pycharm中import时还是标红的问题,本文给大家分享解决方法,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下2020-10-10
Python判断一个list中是否包含另一个list全部元素的方法分析
这篇文章主要介绍了Python判断一个list中是否包含另一个list全部元素的方法,结合实例形式对比分析了Python针对列表list元素包含关系的相关转换、判断操作技巧,需要的朋友可以参考下2018-12-12
解决Pycharm下面出现No R interpreter defined的问题
今天小编就为大家分享一篇解决Pycharm下面出现No R interpreter defined的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧2018-10-10


最新评论