如何使用Python读取Excel多个工作表并转换保存为PDF
问题根源
你现有代码仅能读取第一个工作表,是因为pd.read_excel()的sheet_name参数默认值为0,默认只加载索引位置为0的首个工作表。
实现思路
- 修改
read_excel的sheet_name参数:传入None时会加载文件内所有工作表,返回结构为{工作表名称: 对应DataFrame}的字典;如果只需要加载指定工作表,传入工作表名称组成的列表即可,和你注释中写的写法一致,返回值同样是字典结构。 - 不要提前创建单个固定画布,遍历读取到的所有工作表,为每个工作表单独生成对应画布和表格,避免多个工作表内容挤在同一页。
- 复用同一个
PdfPages实例,依次将每个工作表生成的画布存入PDF,所有内容写入完成后统一关闭文件,就能得到包含所有工作表内容的多页PDF。 - 可以根据每个工作表的行数自适应调整画布高度,避免内容挤压、显示不全。
参考实现代码
import pandas as pd import matplotlib.pyplot as plt from matplotlib.backends.backend_pdf import PdfPages url = "https://exceltesting.xlsx" # 读取所有工作表返回字典;如果要读指定工作表,替换为sheet_name=['Technologies','Schedule']即可 sheet_dict = pd.read_excel(url, sheet_name=None) # 用上下文管理器自动处理PDF文件关闭,避免资源泄漏 with PdfPages("output.pdf") as pp: for sheet_name, df in sheet_dict.items(): # 按当前工作表行数自适应画布高度,避免内容挤压 row_count = len(df) fig, ax = plt.subplots(figsize=(12, 0.35 * (row_count + 2))) ax.axis('tight') ax.axis('off') # 添加工作表名称作为当前页标题 ax.set_title(f"工作表: {sheet_name}", fontsize=14, pad=20) # 绘制表格 ax.table( cellText=df.values, colLabels=df.columns, loc='center', cellLoc='center' ) # 将当前工作表内容存入PDF pp.savefig(fig, bbox_inches='tight') # 关闭当前画布释放内存 plt.close(fig)
补充说明
- 代码中画布高度的计算系数
0.35可以根据实际使用的字体大小、行高要求调整,保证表格显示清晰无重叠即可。 - 如果单工作表行数过百,matplotlib绘制表格的性能会明显下降,且单页无法容纳全部内容,此时可以按固定行数拆分DataFrame做分页,或者换用专门的文档处理库实现转换。
- 如果仅需要导出指定名称的工作表,仅需修改
sheet_name参数传入目标表名列表,后续遍历逻辑不需要做任何调整。
内容的提问来源于stack exchange,提问作者user13303557
相关产品推荐
相关产品推荐

