如何用Python XlsxWriter实现多工作表页脚的独立页码(Page x of n)
问题:XlsxWriter生成PDF时各工作表页码无法独立从1开始计数
我用Python写了个程序,循环处理包含多案例的DataFrame,生成Excel后转PDF。核心代码如下:
创建工作簿:
file_stream = io.BytesIO() writer = pd.ExcelWriter(file_stream, engine='xlsxwriter') workbook = writer.book
遍历DataFrame创建工作表并设置页脚:
for index, row in case_df.iterrows(): for column in case_df.columns: if row['Case No']!=current_case_no: current_case_no=row['Case No'] footer=f'&C{agency} - Case No. {current_case_no} Page &P of &N' worksheet = workbook.add_worksheet(f'{current_case_no}') worksheet.set_paper('Letter') worksheet.set_margins(top=.5, bottom=.5, left=.5, right=.5) worksheet.set_column(0, 15, 12) worksheet.set_default_row(13) worksheet.set_footer(footer)
写入数据后转PDF:
writer.close() # RESET THE FILE STREAM TO THE BEGINNING file_stream.seek(0) pdf_stream = excel_to_pdf_stream(file_stream)
现在生成的PDF里,所有工作表的页码是连续递增的,而不是每个工作表从第1页开始计数。想要通过XlsxWriter设置,让每个新工作表的页码重新从1开始,而且不用手动统计行数和页数。
解决方案
要实现每个工作表页码独立从1开始,只需做以下调整:
在创建每个工作表后,添加一行设置工作表起始页码的代码:
worksheet.set_page_setup('first_page_number', 1)这个设置会强制当前工作表的页码从1开始计数,页脚中的
&P会显示该工作表的当前页码,&N会自动读取该工作表的总页数,完全不需要手动统计行数或计算页数。优化循环逻辑(可选):原代码里的内层
for column in case_df.columns:属于无效循环,会重复执行Case No判断,建议改成按Case No分组遍历,提升效率:current_case_no = None for case_no, group_df in case_df.groupby('Case No'): if case_no != current_case_no: current_case_no = case_no footer=f'&C{agency} - Case No. {current_case_no} Page &P of &N' worksheet = workbook.add_worksheet(f'{current_case_no}') # 设置页码起始为1 worksheet.set_page_setup('first_page_number', 1) # 格式设置 worksheet.set_paper('Letter') worksheet.set_margins(top=.5, bottom=.5, left=.5, right=.5) worksheet.set_column(0, 15, 12) worksheet.set_default_row(13) worksheet.set_footer(footer) # 写入当前案例的数据 group_df.to_excel(writer, sheet_name=f'{current_case_no}', index=False)
调整后,每个工作表的页码都会从1开始,转PDF时各工作表的页码序列完全独立,页脚的Page X of Y也会准确对应当前工作表的页码和总页数。
内容的提问来源于stack exchange,提问作者CentennialJim
相关产品推荐
相关产品推荐

