在常见的自动化场景中,我们经常需要用脚本直接生成一份全新的 Excel 文件------无论是按固定模板生成的日常报表、从 API 接口落盘的统计数据,还是供后续系统读取的中间文件。与其手动新建表格再逐个填入,不如用几行 Python 代码交由程序自动完成。
本文将以 Spire.XLS for Python 为例,演示如何从零开始创建工作簿、写入数据、设置样式并保存文件,带你快速掌握 Python 生成标准 Excel 文档的完整流程。
环境准备
我们需要借助 Spire.XLS for Python 来完成 Excel 的创建与写入。它提供了 Workbook 核心对象来代表整个工作簿,通过 Worksheets 集合即可灵活操作各个工作表,并支持将内存中的数据直接导出为 .xlsx 等标准格式。
首先通过以下命令完成安装:
bash
pip install Spire.XLS
安装完成后,在脚本开头引入对应模块即可开始编写代码。
创建空白工作簿并写入第一个工作表
生成 Excel 的第一步是实例化一个 Workbook 对象。Spire.XLS 在初始化时默认会包含一张工作表,因此我们可以直接通过 Worksheets[0] 获取第一张表并写入数据。
以下示例演示了如何在 A1 单元格写入文本,并自动调整列宽以适应文字长度:
python
from spire.xls.common import *
from spire.xls import *
outputFile = "HelloWorld.xlsx"
# 创建 Workbook 对象(默认含一个工作表)
workbook = Workbook()
sheet = workbook.Worksheets[0]
# 通过单元格地址写入文本
sheet.Range["A1"].Text = "Hello World"
# 自动调整 A 列宽度以完整显示内容
sheet.Range["A1"].AutoFitColumns()
# 保存为 .xlsx 文件并释放资源
workbook.SaveToFile(outputFile, ExcelVersion.Version2010)
workbook.Dispose()

需要注意几点:
Worksheets[0]使用 0 基索引,指向工作簿中的首张工作表。Range["A1"]使用熟悉的列标和行号定位单元格,给Text属性赋值即可写入字符串。AutoFitColumns()会根据内容自动拉伸列宽,防止文字被截断。应用于单个单元格时,默认对该单元格所在的整列生效。SaveToFile的第二个参数指定了输出格式,ExcelVersion.Version2010对应常用的.xlsx格式。- 最后调用
Dispose()及时释放底层资源。
创建包含多张工作表的工作簿
当一份文档需要按业务维度拆分数据时,单张工作表往往不够用。此时可以使用 CreateEmptySheets(n) 一次性批量生成多张空白表,随后依次命名并填充内容。
以下示例创建了一个包含 5 张工作表的工作簿,并为每张表写入坐标标记:
python
from spire.xls.common import *
from spire.xls import *
outputFile = "CreateAnExcelWithFiveSheet.xlsx"
workbook = Workbook()
# 创建 5 个空白工作表
workbook.CreateEmptySheets(5)
for i in range(0, 5):
sheet = workbook.Worksheets[i]
# 为工作表命名
sheet.Name = "Sheet" + str(i)
# 写入示例数据:行列坐标
for row in range(1, 151):
for col in range(1, 51):
sheet.Range[row, col].Text = "row" + str(row) + " col" + str(col)
workbook.SaveToFile(outputFile, ExcelVersion.Version2010)
workbook.Dispose()
这里 sheet.Name 用于设置标签页名称,方便在打开文件时快速识别区域。
Range[row, col] 传入数字下标来定位单元格(行列号均从 1 开始),非常适合在循环语句中批量写入。需要说明的是,示例中写入 150 行 × 50 列仅用于展示批量写入能力,在实际业务中建议只写入有效数据区,避免产生过大的文件。
在指定位置追加命名工作表
除了预先创建多张空表,更常见的需求是根据数据处理进度动态追加新表。例如"先建立封面汇总,再按需追加明细"。
调用 Worksheets.Add("名称") 可以直接一步完成"创建"与"命名",并返回对应的工作表对象:
python
from spire.xls.common import *
from spire.xls import *
outputFile = "AddSheetExample.xlsx"
workbook = Workbook()
# 追加一张名为「销售明细」的工作表
sheet = workbook.Worksheets.Add("销售明细")
# 写入表头
headers = ["月份", "产品", "销量"]
for col, title in enumerate(headers, start=1):
sheet.Range[1, col].Text = title
# 写入两行示例数据
sheet.Range[2, 1].Text = "一月"
sheet.Range[2, 2].Text = "笔记本"
sheet.Range[2, 3].Text = "120"
sheet.Range[3, 1].Text = "二月"
sheet.Range[3, 2].Text = "平板"
sheet.Range[3, 3].Text = "95"
# 自动适配各列宽度
sheet.Range["A1:C3"].AutoFitColumns()
workbook.SaveToFile(outputFile, ExcelVersion.Version2010)
workbook.Dispose()
在写入表头时,配合 enumerate(headers, start=1) 可以让列号直接从 1 开始,完美契合 Excel 的行列索引习惯。最后在目标区域 A1:C3 上调用 AutoFitColumns(),即可一次性调整所有关联列的宽度。
设置单元格格式:字体、颜色与样式
一份合格的报表除了保证内容准确,良好的视觉排版也很关键。将标题和表头进行视觉强化,能大幅提升表格的可读性。
Spire.XLS 将字体样式设置统一封装在单元格或区域的 Style.Font 属性中,支持对单个单元格或选定区域进行批量配置:
python
from spire.xls.common import *
from spire.xls import *
outputFile = "FormatCellsExample.xlsx"
workbook = Workbook()
sheet = workbook.Worksheets.Add("销售明细")
# 写入表头与示例数据
headers = ["月份", "产品", "销量"]
for col, title in enumerate(headers, start=1):
sheet.Range[1, col].Text = title
sheet.Range[2, 1].Text = "一月"
sheet.Range[2, 2].Text = "笔记本"
sheet.Range[2, 3].Text = "120"
# 将表头整行加粗,并适当放大字号、设置颜色,使其更醒目
headerRange = sheet.Range["A1:C1"]
headerRange.Style.Font.IsBold = True
headerRange.Style.Font.Size = 14
headerRange.Style.Font.Color = Color.get_CornflowerBlue()
# 为某个单元格设置斜体与下划线,演示更多字体样式
sheet.Range["B2"].Style.Font.IsItalic = True
sheet.Range["B2"].Style.Font.Underline = FontUnderlineType.Single
# 调整列宽
sheet.Range["A1:C2"].AutoFitColumns()
workbook.SaveToFile(outputFile, ExcelVersion.Version2010)
workbook.Dispose()

通过 Style.Font 对象可以轻松掌控各类格式:
IsBold = True设置粗体;IsItalic = True设置斜体;Size设置字号(单位为磅);Color通过Color.get_xxx()设置字体颜色;Underline传入FontUnderlineType.Single添加单下划线。
这种方式的优点在于支持直接作用于区域(如 sheet.Range["A1:C1"]),一行代码就能完成一整行的样式升级,无需编写额外的循环逻辑。
综合示例:构建销售报表
掌握了上述基础操作后,我们来看一个完整的应用场景。下面的代码演示了如何从零开始构建一张格式清晰、带表头强化的销售数据报表:
python
from spire.xls.common import *
from spire.xls import *
outputFile = "SalesReport.xlsx"
# 示例数据:表头 + 若干数据行
data = [
["月份", "产品", "销量", "单价"],
["一月", "笔记本", "120", "4999"],
["一月", "平板", "95", "2599"],
["二月", "笔记本", "108", "4899"],
["二月", "平板", "130", "2499"],
]
workbook = Workbook()
sheet = workbook.Worksheets.Add("销售明细")
for r, row_values in enumerate(data, start=1):
for c, value in enumerate(row_values, start=1):
sheet.Range[r, c].Text = value
# 将表头行(第一行)加粗,使其在报表中更突出
sheet.Range["A1:D1"].Style.Font.IsBold = True
# 自动调整整张表涉及的列宽
sheet.Range["A1:D5"].AutoFitColumns()
workbook.SaveToFile(outputFile, ExcelVersion.Version2010)
workbook.Dispose()

在此模式下,数据构造与表格生成逻辑彻底解耦。外层嵌套列表负责存储数据,内层双重循环负责按坐标映射填入。后续只需把数据源替换为数据库查询结果或 API 响应,即可方便地嵌入各类自动化任务中。
开发建议与技巧
- 导出版本选择
SaveToFile的第二个参数决定了文件的保存格式。大多数场景下推荐使用ExcelVersion.Version2010(即.xlsx)。如果需要兼容非常老旧的系统,可以根据需求切换其他枚举值。 - 高效使用列宽自适应 在写入全部数据后,统一调用一次
AutoFitColumns()可以省去手动计算列宽的麻烦,既快速又能有效避免文本溢出或显示不全。 - 按场景选择建表逻辑 固定表数量时用
CreateEmptySheets(n),动态根据数据追加表时用Worksheets.Add("名称"),两者混用时注意避免索引错位。
结语
通过 Spire.XLS for Python,我们可以非常直观地完成从工作簿初始化、多表管理到单元格读写与格式化排版的全过程。这种基于对象模型的文档生成机制非常适合融入各类数据处理工作流中。只要将代码中的数据来源替换为数据库查询、第三方 API 返回或本地配置文件,就能快速搭建一套高效且稳定的自动化报表导出系统。