Python Excel设置打印区域页眉页脚:打印前一键排版
用openpyxl设置print_area打印区域、页眉页脚内容、纸张方向和缩放,导出的表直接打印不用再调页面。
场景痛点
表里有几十列,领导要打印出来开会用。手动点「页面布局」调打印区域、加页眉公司名、加页脚页码,每张表都点一遍。用 openpyxl 在导出时把这些页面设置一起写进去,打开直接 Ctrl+P 就能打,不用再调。
用到的库
pip install openpyxl
完整代码
from openpyxl import load_workbook
from openpyxl.worksheet.page import PageMargins
def setup_print(file_path: str) -> None:
wb = load_workbook(file_path)
ws = wb.active
# 1) 设置打印区域:只打印 A1 到最后一列最后一行
last_col = ws.cell(row=1, column=ws.max_column).column_letter
ws.print_area = f"A1:{last_col}{ws.max_row}"
# 2) 纸张方向横向、A4、适应一页宽
ws.page_setup.orientation = ws.ORIENTATION_LANDSCAPE
ws.page_setup.paperSize = ws.PAPERSIZE_A4
ws.page_setup.fitToWidth = 1 # 缩放到 1 页宽
ws.page_setup.fitToHeight = 0 # 高度自动多页
ws.sheet_properties.pageSetUpPr.fitToPage = True
# 3) 页眉:左边公司名,中间标题,右边日期
ws.oddHeader.left.text = "XX科技有限公司"
ws.oddHeader.left.size = 10
ws.oddHeader.center.text = "销售明细报表"
ws.oddHeader.center.size = 12
ws.oddHeader.center.bold = True
ws.oddHeader.right.text = "&D" # &D 是 Excel 内置日期变量
# 4) 页脚:中间页码 / 总页数
ws.oddFooter.center.text = "第 &P 页 / 共 &N 页"
ws.oddFooter.right.text = "机密"
# 5) 每页都打印表头(打印标题行)
ws.print_title_rows = "1:1"
# 6) 页边距
ws.page_margins = PageMargins(left=0.5, right=0.5, top=0.75,
bottom=0.75, header=0.3, footer=0.3)
wb.save(file_path)
print("打印设置已写入")
if __name__ == "__main__":
setup_print(r"D:\reports\销售明细.xlsx")
代码讲解
ws.print_area = "A1:G100"限定打印范围,范围外的格子不会被打印。ws.page_setup.orientation = ws.ORIENTATION_LANDSCAPE横向打印;PAPERSIZE_A4指定 A4 纸。fitToWidth=1, fitToHeight=0把所有列缩放到一页宽,行数不够再自动多页;记得fitToPage = True才生效。oddHeader.left/center/right分别控制页眉左中右;oddFooter同理。- 页眉页脚里
&D是日期、&P当前页、&N总页数、&A工作表名,这些是 Excel 内置变量。 ws.print_title_rows = "1:1"让每一页顶部都重复打印第 1 行表头,长表打印必备。PageMargins设页边距,单位是英寸。
运行结果
打开文件,Ctrl+P 预览:横向 A4,所有列缩在一页宽,每页顶部都有表头;页眉显示公司名和报表标题,页脚显示「第 X 页 / 共 N 页」。
注意事项
fitToPage必须设成True,否则fitToWidth、fitToHeight不生效。- 页眉页脚里的特殊变量以
&开头,不要写错成中文符号。 - 打印区域如果包含空列空行,预览会出现空白页,先跑一遍「删除空行空列」再设打印区域。
- 页眉页脚字体大小通过
.size设置,颜色、加粗同理。 - WPS 和 Excel 都能识别这些设置,但个别旧版 WPS 对
fitToPage支持略有差异,打印前预览一眼最稳。

更新时间:2026-09-15 09:04:18