使用Python玩转Excel数据模拟分析的完整指南
作者:SunnyDays1011
做销售预测或财务预算时,我们往往需要考虑不同的情况:如果销量下降 20%,利润会减少多少?如果销量增加、成本降低,又能带来多少利润?
Excel 的模拟分析功能可以帮助我们解决这类问题。其中,方案管理器可以为同一个计算模型保存多组不同的输入数据,并比较这些数据对应的计算结果,无需反复手动修改单元格。
本文以销售利润预测为例,介绍如何使用 Python 创建和管理 Excel 方案、生成方案摘要报告,以及通过 Excel 图表直观比较不同方案的结果。

一、了解 Excel 模拟分析及其工具
Excel 主要提供三种模拟分析工具:
- 方案管理器(Scenario Manager): 保存并比较多组不同的输入值组合,可在多组方案间切换查看不同结果,适合变量较多、需要整体对比的场景。
- 单变量求解(Goal Seek): 根据期望的目标结果,反向推算出所需的输入值,属于“由果溯因”的用法。
- 模拟运算表(Data Table): 看一个或两个变量取不同数值时对公式结果的影响,且每个变量可设多个取值,但不支持超过两个变量。
本文重点介绍方案管理器。它适合用于比较几种预先设定的情况,例如销售预测中的悲观方案、预期方案和乐观方案。
假设某公司需要根据不同的销售条件预测利润:
| 变量 | 悲观方案 | 预期方案 | 乐观方案 |
|---|---|---|---|
| 产品售价(元) | 90 | 100 | 110 |
| 单位成本(元) | 65 | 60 | 55 |
| 销售数量 | 800 | 1,000 | 1,300 |
| 预计利润(元) | 20,000 | 40,000 | 71,500 |
预计利润的计算公式为:
预计利润 =(产品售价 − 单位成本)× 销售数量
为了方便演示,这里使用简化的利润模型,暂不考虑固定费用、税费等其他支出。
如果手动分析这三种情况,需要反复修改售价、成本和销量,再分别记录计算结果。使用方案管理器,则可以将不同的输入数据保存为独立方案,随时切换或生成对比报告。
二、准备 Excel 工作簿和 Python 环境
本文使用 Spire.XLS for Python 操作 Excel 文件。它提供了创建和管理 Excel 方案的相关 API,无需安装 Microsoft Excel 即可运行。
首先,通过 pip 安装:
pip install spire.xls
方案管理器相关功能从 Spire.XLS for Python 16.7.1 开始支持,因此需要使用 16.7.1 或更高版本。
创建销售预测工作簿
我们先准备一个简单的 Excel 工作表,包含三个输入变量和一个利润计算公式。
| 单元格 | 内容 | 初始值 |
|---|---|---|
| B2 | 产品售价 | 100 |
| B3 | 单位成本 | 60 |
| B4 | 销售数量 | 1,000 |
| B6 | 预计利润 | =(B2-B3)*B4 |
其中,B2:B4 是可变单元格,用于保存不同方案下的输入值;B6 是结果单元格,通过公式计算预计利润。
你可以手动在 Excel 中创建这个工作表,也可以使用 Python 自动生成:
from spire.xls import Workbook, ExcelVersion
# 创建 Excel 工作簿
workbook = Workbook()
sheet = workbook.Worksheets[0]
sheet.Name = "销售预测"
# 添加标题和字段名称
sheet.Range["A1"].Text = "季度销售预测"
sheet.Range["A1"].Style.Font.Size = 11.0
sheet.Range["A1"].Style.Font.IsBold = True
sheet.Range["A2"].Text = "产品售价"
sheet.Range["A3"].Text = "单位成本"
sheet.Range["A4"].Text = "销售数量"
sheet.Range["A6"].Text = "预计利润"
sheet.Range["A6"].Style.Font.IsBold = True
# 输入初始数据
sheet.Range["B2"].NumberValue = 100
sheet.Range["B3"].NumberValue = 60
sheet.Range["B4"].NumberValue = 1000
# 设置预计利润计算公式
sheet.Range["B6"].Formula = "=(B2-B3)*B4"
# 调整列宽
sheet.SetColumnWidth(1, 26.0)
# 保存工作簿
workbook.SaveToFile("销售预测模型.xlsx", ExcelVersion.Version2016)
workbook.Dispose()运行后会生成 销售预测模型.xlsx,后续示例将以这个文件为基础。
三、使用 Python 创建多个 Excel 方案
首先,我们根据前面的销售数据创建三个方案:悲观方案、预期方案和乐观方案。
创建方案时,需要指定方案名称、可变单元格区域,以及与这些单元格对应的一组数值。
通过工作表的 Scenarios 属性可以获取方案集合,再使用 Scenarios.Add() 方法添加方案。
from spire.xls import Workbook, ExcelVersion
# 加载销售预测工作簿
workbook = Workbook()
workbook.LoadFromFile("销售预测模型.xlsx")
sheet = workbook.Worksheets[0]
scenarios = sheet.Scenarios
# 定义三种销售方案的数据
pessimistic = [90, 65, 800]
expected = [100, 60, 1000]
optimistic = [110, 55, 1300]
# 指定可变单元格区域
changing_cells = sheet.Range["B2:B4"]
# 创建三个方案
scenarios.Add("悲观方案", changing_cells, pessimistic)
scenarios.Add("预期方案", changing_cells, expected)
scenarios.Add("乐观方案", changing_cells, optimistic)
# 保存工作簿
workbook.SaveToFile("销售预测方案.xlsx", ExcelVersion.Version2016)
workbook.Dispose()每组列表中的三个数字依次对应产品售价、单位成本和销售数量,也就是 B2、B3 和 B4 单元格。
Scenarios.Add() 会将这些输入数据保存为不同的方案,原有的利润计算公式不会改变。
运行代码后,打开生成的 销售预测方案.xlsx,在中文版 Excel 中选择:
数据 → 模拟分析 → 方案管理器
就能看到刚才创建的三个方案。之后可以直接在方案管理器中选择并应用不同的方案,无需重新输入对应的数据。
四、应用指定方案,查看计算结果
创建方案后,各方案的数据会保存在工作簿中,但不会同时应用到工作表。
如果想查看某个方案的计算结果,可以使用 Show() 方法,将对应的输入值应用到当前工作表。
例如,下面将乐观方案应用到销售预测模型:
from spire.xls import Workbook, ExcelVersion
# 加载包含方案的工作簿
workbook = Workbook()
workbook.LoadFromFile("销售预测方案.xlsx")
sheet = workbook.Worksheets[0]
scenarios = sheet.Scenarios
# 应用乐观方案
scenarios[2].Show()
# 保存更新后的工作簿
workbook.SaveToFile("乐观销售预测.xlsx", ExcelVersion.Version2016)
workbook.Dispose()这里的 scenarios[2] 表示第三个方案。因为索引从 0 开始,所以第三个方案的索引为 2。
应用乐观方案后,工作表中的数据会更新为:产品售价 110 元、单位成本 55 元、销售数量 1,300。
此时,预计利润为:(110 - 55) × 1300 = 71,500
也就是 71,500 元。
需要注意,Show() 只会更新可变单元格中的输入值,不会改变 B6 中的计算公式。因此,可以在不修改公式的情况下,通过切换方案查看不同条件下的利润。
五、使用 Python 生成 Excel 方案摘要报告
如果需要比较多个方案,逐个切换查看结果就比较麻烦。这时可以生成一份方案摘要报告,将各方案的输入数据和计算结果集中展示。
调用 Scenarios.Summary() 方法,并指定结果单元格,就可以生成方案摘要。
from spire.xls import Workbook, ExcelVersion
# 加载包含方案的工作簿
workbook = Workbook()
workbook.LoadFromFile("销售预测方案.xlsx")
sheet = workbook.Worksheets[0]
# 指定预计利润单元格,生成方案摘要
sheet.Scenarios.Summary(sheet.Range["B6"])
# 保存包含方案摘要的工作簿
workbook.SaveToFile("方案摘要.xlsx", ExcelVersion.Version2016)
workbook.Dispose()这里的 B6 是预计利润所在的结果单元格。
生成的报告会汇总各方案的输入数据及其计算结果。对于当前的销售预测模型,三个方案的预计利润分别为:
| 方案 | 预计利润(元) |
|---|---|
| 悲观方案 | 20,000 |
| 预期方案 | 40,000 |
| 乐观方案 | 71,500 |
这样就能直接比较不同销售条件下的利润差异,而不必反复切换方案。
方案摘要报告适合用于预算审核、销售预测和财务分析等需要比较多种情况的工作。
需要注意的是,方案摘要不会自动更新。 如果后续修改了方案数据或计算公式,需要重新生成摘要报告,才能反映最新的分析结果。
六、使用 Python 将方案分析结果绘制成 Excel 图表
方案摘要报告可以展示详细的数据,但如果想更直观地比较各方案的利润差异,还可以创建一张 Excel 图表。
由于这里比较的是三个独立方案,使用簇状柱形图比较合适。
下面直接使用前面计算得到的利润数据,在 Excel 工作簿中创建图表,不需要安装 Matplotlib 等额外的绘图库。
from spire.xls import Workbook, ExcelVersion, ExcelChartType
# 三个销售方案及其预计利润
scenarios = ["悲观方案", "预期方案", "乐观方案"]
profits = [20000, 40000, 71500]
# 加载包含方案摘要的工作簿
workbook = Workbook()
workbook.LoadFromFile("方案摘要.xlsx")
# 添加用于展示图表的工作表
sheet = workbook.Worksheets.Add("方案对比图表")
# 添加表头
sheet.Range["A1"].Text = "销售方案"
sheet.Range["B1"].Text = "预计利润"
# 将方案名称和利润数据写入工作表
for i, (scenario, profit) in enumerate(zip(scenarios, profits), 2):
sheet.Range[i, 1].Text = scenario
sheet.Range[i, 2].NumberValue = profit
# 创建簇状柱形图
chart = sheet.Charts.Add(ExcelChartType.ColumnClustered)
# 设置图表数据区域
chart.DataRange = sheet.Range["A1:B4"]
chart.SeriesDataFromRange = False
# 设置图表标题和位置
chart.ChartTitle = "不同销售方案的预计利润"
chart.LeftColumn = 4
chart.TopRow = 2
chart.RightColumn = 13
chart.BottomRow = 20
# 保存工作簿
workbook.SaveToFile("方案分析图表.xlsx", ExcelVersion.Version2016)
workbook.Dispose()运行后,工作簿中会新增一个包含柱形图的工作表,展示悲观方案、预期方案和乐观方案的预计利润。
这里创建的是 Excel 原生图表,因此打开工作簿后,仍然可以修改图表样式、调整标题或更新数据。
注意: 这个示例使用的是前面已经计算好的利润数据,并没有直接从方案摘要报告中读取结果。如果之后修改了方案中的假设值,还需要同步更新图表的数据源。
除了创建柱形图,你还可以在 Excel 中创建折线图、饼图、瀑布图等其他图表。
七、使用 Python 修改已有 Excel 方案
实际工作中的销售预测并不是一成不变的。随着市场情况变化,我们可能需要调整某个方案中的数据。
例如,原来的悲观方案预计销量为 800,产品售价为 90 元。根据最新的市场信息,现在准备将数据调整为:
- 产品售价:95 元
- 单位成本:65 元
- 销售数量:900
不需要删除原有方案再重新创建,使用 SetVariableCells() 方法即可直接修改。
from spire.xls import Workbook, ExcelVersion
# 加载包含方案的工作簿
workbook = Workbook()
workbook.LoadFromFile("销售预测方案.xlsx")
sheet = workbook.Worksheets[0]
scenarios = sheet.Scenarios
# 获取悲观方案
scenario = scenarios[0]
# 定义修改后的数据
new_values = [95, 65, 900]
# 更新方案中的可变单元格及其数值
scenario.SetVariableCells(
sheet.Range["B2:B4"],
new_values
)
# 应用修改后的方案
scenario.Show()
# 保存工作簿
workbook.SaveToFile("修订后的销售预测.xlsx", ExcelVersion.Version2016)
workbook.Dispose()修改并应用方案后,预计利润变为:(95 - 65) × 900 = 27,000
即 27,000 元。
SetVariableCells() 用于更新方案中保存的输入数据,而 Show() 用于将更新后的方案应用到工作表。
如果只需要修改方案,不需要立即应用,可以省略 Show()。
八、使用 Python 删除不再需要的方案
随着预测数据不断更新,一些旧方案可能已经不再适用。
例如,如果不再需要原来的悲观方案,可以将其从工作簿中删除。
删除方案有两种常用方法:
RemoveScenarioAt(index):根据索引位置删除方案。RemoveScenarioByName(name):根据名称删除方案。
下面使用 ContainsScenario() 先检查方案是否存在,再通过名称将其删除。
from spire.xls import Workbook, ExcelVersion
# 加载工作簿
workbook = Workbook()
workbook.LoadFromFile("销售预测方案.xlsx")
sheet = workbook.Worksheets[0]
scenarios = sheet.Scenarios
# 检查悲观方案是否存在,存在则删除
if scenarios.ContainsScenario("悲观方案"):
scenarios.RemoveScenarioByName("悲观方案")
# 查看剩余方案数量
print("剩余方案数量:", scenarios.Count)
# 保存更新后的工作簿
workbook.SaveToFile("更新后的销售方案.xlsx", ExcelVersion.Version2016)
workbook.Dispose()运行后,工作簿中将只保留预期方案和乐观方案。
删除方案只会移除保存的方案数据,不会删除工作表中已有的单元格内容或计算公式。
九、使用 Python 合并不同工作表中的方案
在实际项目中,不同部门可能会分别制定预测方案。
例如,销售部门负责提供销量和收入预测,财务部门则根据成本变化制定额外的预算方案。
如果这些方案使用相同的可变单元格结构,就可以通过 Scenarios.Merge() 方法将它们合并,统一进行管理和比较。
下面在另一个工作表中创建“成本上涨”方案,再将其合并到原来的销售预测工作表。
from spire.xls import Workbook, ExcelVersion
# 加载已有的销售预测方案
workbook = Workbook()
workbook.LoadFromFile("销售预测方案.xlsx")
# 获取目标工作表
main_sheet = workbook.Worksheets[0]
# 添加保存财务方案的工作表
finance_sheet = workbook.Worksheets.Add("财务方案")
# 创建成本上涨方案
finance_sheet.Scenarios.Add(
"成本上涨",
finance_sheet.Range["B2:B4"],
[100, 70, 1000]
)
# 将财务方案合并到主工作表
main_sheet.Scenarios.Merge(finance_sheet)
# 保存合并后的工作簿
workbook.SaveToFile("合并后的销售方案.xlsx", ExcelVersion.Version2016)
workbook.Dispose()合并后,主工作表中除了原来的三个销售方案,还会增加一个“成本上涨”方案。
这个方案假设产品售价仍为 100 元,单位成本上升到 70 元,销量保持在 1,000。将其应用到主工作表的利润模型后,预计利润为:(100 - 70) × 1000 = 30,000
即 30,000 元。
合并方案时,最重要的是确保不同工作表中的可变单元格具有相同的含义。例如,如果主工作表的 B2 表示产品售价,那么来源工作表中的 B2 也应表示产品售价,否则合并后的数据可能无法得到预期的计算结果。
十、使用 Excel 方案管理器时的注意事项
在实际使用中,下面几点可以帮助我们更准确地建立和维护模拟分析模型。
1. 将输入数据和计算公式分开
方案管理器主要用于调整输入条件,不应该覆盖用于计算结果的公式。建议提前明确哪些单元格保存可变数据,哪些单元格负责计算结果,避免修改方案时影响计算逻辑。
2. 使用容易理解的方案名称
尽量使用“成本上涨”“需求下降”“乐观预测”等具有实际含义的名称,而不是简单命名为“方案1”“方案2”。这样查看方案管理器或方案摘要报告时,更容易理解每个方案代表的情况。
3. 注意可变单元格数量限制
Excel 的单个方案最多支持 32 个可变单元格。如果只需要分析一个或两个变量在大量不同取值下的计算结果,使用模拟运算表可能更合适。
4. 修改方案后重新生成摘要报告
方案摘要报告不会随着方案数据的变化自动更新。如果修改了方案,应重新生成摘要报告。如果还创建了独立的对比图表,也需要同步更新图表数据。
5. 不要将方案分析结果理解为预测概率
方案管理器只是根据预先设定的条件计算结果,并不会判断某种情况发生的可能性。它与蒙特卡洛模拟不同,不会通过大量随机抽样来估计结果的概率分布。因此,方案管理器更适合比较不同假设条件下的结果,而不是进行概率预测。
总结
Excel 的方案管理器可以帮助我们分析不同输入条件对计算结果的影响,让销售预测、预算规划等工作不再局限于单一方案。
本文介绍了如何使用 Python 创建、应用和修改 Excel 方案,生成方案摘要报告,通过 Excel 图表比较不同方案的结果,以及删除和合并已有方案。
结合这些方法,我们可以更方便地比较不同情况下的计算结果,减少反复修改 Excel 数据的操作,提高销售预测、财务预算及其他数据分析工作的效率。
到此这篇关于使用Python玩转Excel数据模拟分析的完整指南的文章就介绍到这了,更多相关Python Excel数据模拟分析内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
