使用 Python 创建 Excel 文件:从基础到自动化

在数据驱动型应用中,使用 Python 创建 Excel 文件是一项非常常见的需求。当应用程序中的数据需要以业务人员易于查看、理解和共享的形式交付时,Excel 仍然是最实用、最被广泛接受的格式之一。

在实际项目中,通过 Python 生成 Excel 文件往往是自动化流程的起点。数据可能来自数据库、API 接口或内部服务,而 Python 的职责是将这些数据整理并输出为结构清晰、格式统一、命名规范的 Excel 文件。

本文将系统介绍如何使用 Python 创建 Excel 文件,包括从零生成工作簿、写入数据、应用基础格式,以及在需要时更新已有文件。所有示例均基于实际业务场景,重点展示 Excel 文件在自动化流程中的创建方式与使用方式。

目录

1. 使用 Python 创建 Excel 文件的典型场景

在大多数情况下,使用 Python 创建 Excel 文件并不是一个孤立的操作,而是某个系统或流程中的一部分。常见的应用场景包括:

  • 生成每日、每周或每月的业务报表
  • 将数据库查询结果导出为 Excel,用于分析或审计
  • 由后台服务或批处理任务自动生成 Excel 文件
  • 在内部系统或外部合作方之间自动交换数据

在这些场景中,Python 通常负责自动生成 Excel 文件,从而减少人工操作成本,并确保数据的一致性和可重复性。

2. 环境准备:开始使用 Python 创建 Excel 文件

在本教程中,我们使用 Free Spire.XLS for Python 来演示 Excel 文件的相关操作。在开始之前,请确保开发环境已经准备就绪。

Python 版本

任意较新的 Python 3.x 版本都可以满足 Excel 自动化相关需求。

安装 Spire.XLS for Python

可以通过 pip 安装 Free Spire.XLS for Python:

1
pip install spire.xls.free

你也可以直接 下载 Free Spire.XLS for Python,并手动将其引入到项目中。

该库无需依赖 Microsoft Excel,非常适合部署在服务器环境、定时任务或自动化工作流中,即使系统中未安装 Excel 也可以正常运行。

3. 在 Python 中从零新建 Excel 文件

本节重点介绍如何使用 Python 从零开始创建一个 Excel 文件。核心目标是在写入任何数据之前,先定义好基本的工作簿结构,包括工作表和表头布局。

通过代码方式生成初始模板,可以确保所有导出的 Excel 文件结构统一,便于后续自动填充数据。

示例:创建一个空的 Excel 模板

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
from spire.xls import Workbook, FileFormat

# 初始化新的工作簿
workbook = Workbook()

# 获取默认的工作表
sheet = workbook.Worksheets[0]
sheet.Name = "模板"

# 添加占位标题
sheet.Range["B2"].Text = "月度报表模板"

# 保存 Excel 文件
workbook.SaveToFile("模板.xlsx", FileFormat.Version2016)
workbook.Dispose()

模板文件预览如下:

使用 Python 创建空 Excel 模板

在这个示例中:

  • Workbook() 会创建一个新的 Excel 工作簿,并默认包含 三个工作表
  • 通过 Worksheets[0] 访问第一个工作表,并对其重命名以定义基础结构
  • 使用 Range[].Text 属性向指定单元格写入文本,可用于设置标题或占位内容
  • SaveToFile() 方法用于保存 Excel 文件,而 FileFormat.Version2016 用于指定生成的 Excel 文件版本或格式

在 Python 中创建包含多个工作表的 Excel 文件

在使用 Python 生成 Excel 文件时,一个工作簿中通常会包含多个工作表,用于逻辑上区分不同类型的数据。每个工作表可以存储不同的数据集、汇总信息或处理结果。

下面的示例演示了如何创建一个包含多个工作表的 Excel 文件,并向不同工作表写入内容。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
from spire.xls import Workbook, FileFormat

workbook = Workbook()

# 默认工作表
data_sheet = workbook.Worksheets[0]
data_sheet.Name = "原始数据"

# 移除第二个默认工作表
workbook.Worksheets.RemoveAt(1)

# 新增汇总工作表
summary_sheet = workbook.Worksheets.Add("汇总")

summary_sheet.Range["A1"].Text = "汇总报表"

workbook.SaveToFile("多工作表报表.xlsx", FileFormat.Version2016)
workbook.Dispose()

这种结构通常会与后续的读写流程结合使用,例如将原始数据导入到一个工作表,再将处理结果写入另一个工作表。

Python 自动化中常用的 Excel 文件格式

在 Python 中以编程方式创建 Excel 文件时,XLSX 是最常用的格式,完全支持现版本的 Microsoft Excel,并且支持多工作表、公式和样式,适用于绝大多数自动化场景。

除了 XLSX,Spire.XLS for Python 还支持生成多种常见 Excel 格式,包括:

  • XLSX —— 现代 Excel 自动化的默认格式
  • XLS —— 兼容旧系统的传统 Excel 格式
  • CSV —— 常用于数据交换和导入的纯文本格式

本文中的所有示例均使用 XLSX 格式,推荐用于报表生成、结构化数据导出以及基于模板的 Excel 文件。完整支持的格式列表可参考 FileFormat 枚举

4. 使用 Python 向 XLSX 文件写入结构化数据

在实际应用中,写入 Excel 的数据很少是硬编码的静态列表,更多情况下,数据来源于数据库查询结果、API 接口返回值或中间处理过程的计算结果。而在处理这些数据时,非常典型处理模式是将 Excel 作为已经结构化数据的最终交付格式

Python 示例:基于应用数据生成月度销售报表

假设你的应用已经生成了一组销售记录,每条记录包含产品信息以及计算后的金额。在本示例中,销售数据使用 字典列表 来表示,用于模拟来自业务系统或服务层的数据。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
from spire.xls import Workbook

workbook = Workbook()
sheet = workbook.Worksheets[0]
sheet.Name = "销售报表"

# 表头
headers = ["商品名称", "销售数量", "单价", "销售总额"]
for col, header in enumerate(headers, start=1):
sheet.Range[1, col].Text = header

# 示例数据(通常来自数据库或业务服务层)
sales_data = [
{"product": "笔记本电脑", "qty": 15, "price": 6800},
{"product": "显示器", "qty": 30, "price": 1200},
{"product": "机械键盘", "qty": 50, "price": 399},
{"product": "无线鼠标", "qty": 80, "price": 129},
{"product": "游戏耳机", "qty": 100, "price": 299}
]

row = 2
for item in sales_data:
sheet.Range[row, 1].Text = item["product"]
sheet.Range[row, 2].NumberValue = item["qty"]
sheet.Range[row, 3].NumberValue = item["price"]
sheet.Range[row, 4].NumberValue = item["qty"] * item["price"]
row += 1

workbook.SaveToFile("月度销售报表.xlsx")
workbook.Dispose()

月度销售报表预览如下:

使用 Python 根据应用数据生成月度销售报表

在该示例中,产品名称等文本字段使用 CellRange.Text 写入,而数量和价格等数值字段则使用 CellRange.NumberValue
这样可以确保这些字段在 Excel 中被识别为数值,从而支持正确的计算、排序和格式化。

这种写入方式在数据量增长时依然具有良好的扩展性,并且将业务逻辑与 Excel 输出逻辑清晰分离。更多 Excel 写入示例可参考 如何在 Python 中自动化写入 Excel 文件

5. 在 Python 中设置 Excel 工作表格式

在真实业务场景中,Excel 文件往往会被直接交付给相关人员。如果仅包含原始数据而没有任何格式,通常会影响可读性和理解效率。

常见的 Excel 格式化需求包括:

  • 突出显示表头行
  • 设置背景颜色或边框
  • 格式化数值与货币
  • 自动调整列宽

下面的示例展示了如何将这些常见格式化操作组合使用,以提升自动生成 Excel 报表的整体可读性。

Python 示例:提升 Excel 报表的可读性

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
from spire.xls import Workbook, Color, LineStyleType

# 加载已生成的 Excel 文件
workbook = Workbook()
workbook.LoadFromFile("月度销售报表.xlsx")

# 获取第一个工作表
sheet = workbook.Worksheets[0]

# 为工作表已使用单元格设置统一字体
sheet.Range.Style.Font.FontName = "微软雅黑"

# 格式化表头行
header_range = sheet.Range.Rows[0] # 获取第一行
header_range.Style.Font.IsBold = True
header_range.Style.Font.Size = 12
header_range.Style.Color = Color.get_LightBlue()

# 设置货币格式
sheet.Range["C2:D6"].NumberFormat = "$#,##0.00"

# 格式化数据行
for i in range(1, sheet.Range.Rows.Count + 1):
if i % 2 == 0:
row_range = sheet.Range[i, 1, i, sheet.Range.Columns.Count]
row_range.Style.Color = Color.get_LightGreen()
else:
row_range = sheet.Range[i, 1, i, sheet.Range.Columns.Count]
row_range.Style.Color = Color.get_LightYellow()

# 为数据区域添加边框
sheet.Range["A2:D6"].BorderAround(LineStyleType.Medium, Color.get_LightBlue())

# 自动调整列宽
sheet.AllocatedRange.AutoFitColumns()

# 保存格式化后的 Excel 文件
workbook.SaveToFile("带格式的月度销售报表.xlsx")
workbook.Dispose()

格式化后的月度销售报表预览如下:

使用 Python 提升 Excel 报表可读性

虽然格式化并不是保证数据正确性的必要条件,但在业务报表中通常是默认要求。
如需了解更高级的 Excel 格式化技巧,可参考 如何使用 Python 设置 Excel 工作表格式

6. 在 Python 自动化中读取并更新已有的 Excel 文件

在自动化场景中,更新已有 Excel 文件通常需要先定位目标行,再写入新值
与直接修改固定单元格不同,实际脚本往往需要遍历数据行,查找符合条件的记录,并根据业务规则有选择地进行更新

Python 示例:更新已有 Excel 文件中的数据

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
from spire.xls import Workbook

workbook = Workbook()
workbook.LoadFromFile("月度销售报表.xlsx")
sheet = workbook.Worksheets[0]

# 新增状态列表头
sheet.Range["E1"].Text = "状态"

# 根据商品名称定位目标行
for row in range(2, sheet.LastRow + 1):
product_name = sheet.Range[row, 1].Text
if product_name == "笔记本电脑":
sheet.Range[row, 5].Text = "已审核"
break

workbook.SaveToFile("月度销售报表_更新.xlsx")
workbook.Dispose()

更新后的月度销售报表预览如下:

使用 Python 更新 Excel 工作表

7. 在同一 Python 工作流中结合 Excel 的读取与写入操作

在处理外部导入的 Excel 文件时,原始数据往往无法直接用于报表或分析。常见问题包括数据重复、数值不一致,或者存在空行、无效行等情况。本节将演示如何使用 Python 读取已有 Excel 数据,对其进行规范化处理,并将结果写入新的 Excel 文件。

在真实的自动化系统中,Excel 文件往往作为中间数据载体存在,而不是最终交付物。这些文件可能来源于外部平台、由不同团队手工编辑,或者由遗留系统生成,随后再被进一步处理。

因此,原始 Excel 数据中经常存在以下问题:

  • 同一业务对象对应多条记录
  • 数值格式不统一,甚至包含非数值内容
  • 存在空行或数据不完整的记录
  • 数据结构不适合直接用于统计或报表

一个常见需求是:使用 Python 读取未经整理的 Excel 数据,按照业务规则进行清洗与汇总,然后将规范化后的结果写入新的工作表,供下游使用

Python 示例:对导入的销售数据进行规范化与汇总

在本示例中,原始销售 Excel 文件中,每个产品可能对应多行记录。
目标是生成一个干净的汇总工作表,其中每个产品只出现一次,并通过代码计算其销售总额。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
from spire.xls import Workbook, Color

workbook = Workbook()
workbook.LoadFromFile("原始销售数据.xlsx")

source = workbook.Worksheets[0]
summary = workbook.Worksheets.Add("汇总")

# 定义规范化输出的表头
summary.Range["A1"].Text = "商品名"
summary.Range["B1"].Text = "销售总额"

product_totals = {}

# 读取原始数据,并按商品汇总数值
for row in range(2, source.LastRow + 1):
product = source.Range[row, 1].Text
value = source.Range[row, 5].Value

# 跳过不完整或无效的数据行
if not product or value is None:
continue

try:
amount = float(value)
except ValueError:
continue

if product not in product_totals:
product_totals[product] = 0

product_totals[product] += amount

# 将汇总结果写入汇总工作表
target_row = 2
for product, total in product_totals.items():
summary.Range[target_row, 1].Text = product
summary.Range[target_row, 2].NumberValue = total
target_row += 1

# 创建合计行
summary.Range[summary.LastRow, 1].Text = "总计"
summary.Range[summary.LastRow, 2].Formula = "=SUM(B2:B" + str(summary.LastRow - 1) + ")"

# 设置汇总工作表格式
summary.Range.Style.Font.FontName = "微软雅黑"
summary.Range[1, 1, 1, summary.LastColumn].Style.Font.Size = 12
summary.Range[1, 1, 1, summary.LastColumn].Style.Font.IsBold = True

for row in range(2, summary.LastRow + 1):
for column in range(1, summary.LastColumn + 1):
summary.Range[row, column].Style.Font.Size = 10

# 高亮合计行
summary.Range[
summary.LastRow,
1,
summary.LastRow,
summary.LastColumn
].Style.Color = Color.get_LightGray()

summary.Range.AutoFitColumns()

workbook.SaveToFile("规范化销售汇总.xlsx")
workbook.Dispose()

规范化后的销售汇总表预览如下:

使用 Python 规范化并汇总 Excel 数据

在该流程中,Python 负责数据校验、汇总和规范化逻辑,而 Excel 则作为最终交付格式,供业务人员直接使用——无需手工清洗数据或依赖复杂的表格公式。

8. 选择合适的 Python Excel 创建方案

Python 提供了多种方式来创建 Excel 文件,而最合适的方案取决于 Excel 在整体工作流中的角色。

Free Spire.XLS for Python 尤其适合以下场景:

  • 未安装 Microsoft Excel 的环境中生成或更新 Excel 文件
  • 由后台服务、批处理任务或定时任务自动生成文件
  • 需要对工作表结构、格式和公式进行精细控制
  • 将 Excel 作为交付格式或数据交换格式,而非交互式分析工具

在数据探索或统计分析阶段,Python 用户可能会使用其他库进行上游处理,而在最终输出阶段,再使用类似 Free Spire.XLS 的库生成结构清晰、格式完善、可直接交付的 Excel 文件。

这种职责划分方式,有助于将数据处理逻辑留在 Python 中,将展示与呈现逻辑交给 Excel,从而提升系统的可维护性与稳定性。

如需查看更多示例与使用说明,可参考 Spire.XLS for Python 教程

9. 使用 Python 创建和写入 Excel 文件时的常见问题

在 Excel 自动化过程中,经常会遇到一些实际问题,包括:

  • 文件路径或权限错误

    在保存文件前,请确保目标目录已存在,并且当前进程具备写入权限。

  • 数据类型不符合预期

    明确区分文本与数值写入方式,避免在 Excel 中引发计算错误。

  • 意外覆盖已有文件

    建议使用带时间戳的文件名,或将输出文件保存到独立目录中。

  • 数据量较大时的性能问题

    处理大规模数据时,应按行顺序写入,并尽量避免在循环中执行不必要的格式化操作。

及早考虑并处理这些问题,有助于确保 Excel 自动化方案在数据规模和复杂度提升时依然稳定可靠。

10. 总结

使用 Python 创建 Excel 文件,是实现报表自动化、数据导出和文档更新的高效方式。
通过结合文件创建、结构化数据写入、格式化以及更新流程,Excel 自动化可以从一次性脚本,演进为稳定、可复用的系统能力。

Spire.XLS for Python 为这些操作提供了可靠的实现方案,特别适用于对自动化、一致性和可维护性要求较高的场景。你可以通过 申请临时许可证,解锁 Python 在 Excel 文件处理方面的完整能力。

常见问题解答

Python 可以在未安装 Microsoft Excel 的情况下创建 Excel 文件吗?

可以。
例如 Spire.XLS for Python 这类库完全独立于 Microsoft Excel,非常适合服务器环境、云平台以及自动化工作流。

Python 适合生成大型 Excel 文件吗?

适合。
只要按顺序写入数据,并避免在循环中执行不必要的格式化操作,Python 可以高效生成大体量的 Excel 文件。

如何避免覆盖已有的 Excel 文件?

常见做法是使用带时间戳的文件名,或者将生成的报表统一保存到专门的输出目录中。

Python 可以更新由其他系统创建的 Excel 文件吗?

可以。
只要文件格式受支持,Python 就可以读取、修改并扩展由其他应用程序生成的 Excel 文件。