很多 Excel 文件在屏幕上看着没问题,一到打印预览就暴露出细节:内容被截断、表头只在第一页、横向报表挤不下 A4 纸。与其把这些问题留到人工调整阶段,不如在 Python 生成文件时就把页面布局一起设好。下面按实际打印场景拆开说明 Spire.XLS for Python 的常用页面参数,包括边距、方向、纸张、打印范围、标题行列和缩放方式,最后再给出一份可直接复用的综合配置示例,方便判断不同报表该怎么选。
环境准备:先安装 Spire.XLS
这篇文章使用的是 Spire.XLS for Python。如果本地环境还没安装,可以先执行:
pip install Spire.XLS
后续示例都围绕工作表的 PageSetup 对象展开。页面布局、打印区域和缩放等参数,基本都通过这个对象完成设置。
页面基础设置:边距、方向和纸张大小怎么配
打印是否整齐,首先取决于页面基础参数。常见的三个维度分别是页边距、页面方向和纸张大小,它们决定了内容在纸上的可用空间。

页边距:控制内容离纸边多远
页边距本质上是在控制打印内容与纸张边缘之间的距离。边距过大会浪费页面空间,边距过小则容易让报表显得拥挤,甚至影响裁切和装订。Spire.XLS 通过 TopMargin、BottomMargin、LeftMargin、RightMargin 四个属性分别设置上下左右边距,单位为英寸。
from spire.xls import *
from spire.xls.common import *
workbook = Workbook()
workbook.LoadFromFile("input.xlsx")
sheet = workbook.Worksheets[0]
pageSetup = sheet.PageSetup
# 设置页边距(单位:英寸)
pageSetup.TopMargin = 3
pageSetup.BottomMargin = 2
pageSetup.LeftMargin = 1
pageSetup.RightMargin = 1
workbook.Sa veToFile("SetMargins.xlsx", ExcelVersion.Version2010)
workbook.Dispose()
这段代码把上边距设为 3 英寸、下边距设为 2 英寸、左右边距各为 1 英寸。具体数值没有统一模板,要看表格密度、装订要求以及打印版式来定。
页面方向:列多时优先考虑横向
当报表字段较多、列数明显偏宽时,默认纵向页面很容易导致右侧内容超出纸张范围。这种情况下,直接切到横向通常比后续反复缩放更有效。

from spire.xls import *
from spire.xls.common import *
workbook = Workbook()
workbook.LoadFromFile("input.xlsx")
sheet = workbook.Worksheets[0]
# 设置页面方向为横向
sheet.PageSetup.Orientation = PageOrientationType.Landscape
workbook.Sa veToFile("SetOrientation.xlsx", ExcelVersion.Version2010)
workbook.Dispose()
PageOrientationType 枚举常用的只有两个值:Portrait 表示纵向,Landscape 表示横向。默认通常是纵向,如果报表明显“横着长”,就应尽早切换。
纸张大小:A4 不是唯一选择
页面方向确定之后,还要同步确认纸张规格。普通办公文档多数使用 A4,但如果表格列宽较大、信息密度较高,A3 可能更适合。设置方式是通过 PageSetup.PaperSize 指定纸张类型。
from spire.xls import *
from spire.xls.common import *
workbook = Workbook()
sheet = workbook.Worksheets[0]
# 设置纸张大小为 A4
sheet.PageSetup.PaperSize = PaperSizeType.PaperA4
workbook.Sa veToFile("SetPaperSize.xlsx", ExcelVersion.Version2013)
workbook.Dispose()
PaperSizeType 支持多种常见规格,例如 PaperA3、PaperA4、PaperA5、PaperLetter、PaperLegal 等。这里除了考虑版面,也要和实际打印机支持的纸型保持一致。
输出范围控制:只打印需要的内容
很多工作表既包含正式报表,也夹杂辅助计算、临时列或备注区。如果整张表直接送去打印,结果往往既浪费纸张,也让版面失去重点。更稳妥的方式,是明确指定打印区域。
打印区域:用单元格范围限定输出
通过 PageSetup.PrintArea,可以把打印内容限制在指定单元格区域内,写法就是 Excel 常见的地址字符串。
from spire.xls import *
from spire.xls.common import *
workbook = Workbook()
workbook.LoadFromFile("input.xlsx")
sheet = workbook.Worksheets[0]
pageSetup = sheet.PageSetup
# 指定打印区域为 A1 到 E5
pageSetup.PrintArea = "A1:E5"
workbook.Sa veToFile("SetPrintArea.xlsx", ExcelVersion.Version2010)
workbook.Dispose()
设置为 "A1:E5" 后,打印时只会输出这一块内容,区域外的数据不会进入打印结果。对于数据源和展示区共存在一张表中的场景,这个功能尤其有用。
标题行和标题列:跨页打印时保持可读性
当报表跨越多页时,第一页之外如果没有表头,阅读成本会明显上升。Spire.XLS 支持重复打印标题行;如果是横向翻页较多,也可以让关键列在每页重复出现。
from spire.xls import *
from spire.xls.common import *
workbook = Workbook()
workbook.LoadFromFile("input.xlsx")
sheet = workbook.Worksheets[0]
pageSetup = sheet.PageSetup
# 设置第 1 行和第 2 行为打印标题行(每页重复打印)
pageSetup.PrintTitleRows = "$1:$2"
# 设置 A 列和 B 列为打印标题列(每页重复打印)
pageSetup.PrintTitleColumns = "$A:$B"
workbook.Sa veToFile("SetPrintTitles.xlsx", ExcelVersion.Version2010)
workbook.Dispose()
这里要注意引用格式必须带 $。例如 $1:$2 表示第 1 到第 2 行,$A:$B 表示 A 到 B 列。这种写法和 Excel 的绝对引用规则一致,适合直接按表头范围填写。
缩放与适应页面:避免内容被截断
当表格本身就比单页更大时,单靠调整方向或纸张未必能完全解决问题。这时需要用缩放策略来控制打印结果,核心目标通常不是“缩得最小”,而是“保证关键宽度不溢出”。
FitToPagesTall 和 FitToPagesWide 的作用
Spire.XLS 通过 FitToPagesTall 和 FitToPagesWide 两个属性分别控制内容在垂直方向和水平方向适配到多少页。
from spire.xls import *
from spire.xls.common import *
workbook = Workbook()
workbook.LoadFromFile("input.xlsx")
sheet = workbook.Worksheets[0]
pageSetup = sheet.PageSetup
# 将所有内容缩放到 1 页高、1 页宽
pageSetup.FitToPagesTall = 1
pageSetup.FitToPagesWide = 1
workbook.Sa veToFile("FitToPage.xlsx", ExcelVersion.Version2010)
workbook.Dispose()
如果两个属性都设为 1,表示把全部内容尽量压缩到一页纸内。这在内容不多、但稍微超宽或超长的表格里很方便;但对于行数特别多的数据表,强行压到一页往往会让字号和内容可读性明显下降。
常见取舍:保宽度,放高度
实际业务中更常见的做法,是控制宽度不要超出页面,而允许高度自然分页。例如数据列较多但行数非常长时,可以把宽度限制为 1 页,同时不限制高度页数:
也就是把 FitToPagesWide 设为 1,而 FitToPagesTall 设为更大的数值,或者直接设为 0。这样做的好处是每页横向结构保持一致,用户不会因为列被截断而来回对照。
完整示例:一份可直接复用的页面布局配置
如果你面对的是常见的横向报表场景,前面的参数通常不会单独使用,而是组合配置。下面这段代码把页边距、页面方向、纸张大小、打印区域、标题行和缩放规则集中到一起:
from spire.xls import *
from spire.xls.common import *
workbook = Workbook()
workbook.LoadFromFile("input.xlsx")
sheet = workbook.Worksheets[0]
pageSetup = sheet.PageSetup
# 页边距
pageSetup.TopMargin = 2.5
pageSetup.BottomMargin = 2
pageSetup.LeftMargin = 1
pageSetup.RightMargin = 1
# 页面方向与纸张大小
pageSetup.Orientation = PageOrientationType.Landscape
pageSetup.PaperSize = PaperSizeType.PaperA4
# 打印区域
pageSetup.PrintArea = "A1:H50"
# 打印标题行(每页重复第 1 行)
pageSetup.PrintTitleRows = "$1:$1"
# 缩放适应页面
pageSetup.FitToPagesTall = 0
pageSetup.FitToPagesWide = 1
workbook.Sa veToFile("FullPageSetup.xlsx", ExcelVersion.Version2010)
workbook.Dispose()
这套配置适合比较典型的 A4 横向报表:左右边距适中,打印范围限定在 A1:H50,第一页表头会在后续页面继续重复,宽度强制控制在单页内,而高度允许自动分页。对批量生成清单、统计报表、出库单之类的文档来说,这种写法已经覆盖了大部分常见需求。
可以怎么判断参数是否合理
如果你的表格主要问题是“列太多”,优先考虑横向 + 限制宽度为 1 页;如果问题是“杂项数据太多”,先划定 PrintArea;如果问题出在跨页阅读,就重点设置 PrintTitleRows 和 PrintTitleColumns。换句话说,页面设置不是机械套模板,而是围绕打印时最容易出问题的那一项优先处理。
总结:把打印规则前置到生成阶段
用 Python 自动生成 Excel 时,页面布局和打印设置最好不要留给最终用户手工修补。通过 Spire.XLS for Python 的 PageSetup,可以提前把页边距、方向、纸张、打印区域、标题行列以及页面缩放规则统一下来,让同一类报表输出更稳定。
如果只是做简单导出,可能只需要设置方向和打印区域;如果要做正式发放或归档的报表,标题重复和页面适应通常也应该一并配置。这样生成出来的文件不仅能看,还能直接打印。













