Excel文档的读入(4)

最终解决阿珍的问题:

"火龙果可乐"哪个月份的销售额最高?
前面的课程中,我们已经掌握了计算单月"火龙果可乐"销售额的方法。
要计算多个月份的"火龙果可乐"销售额,只需把计算单月金额的代码重复执行多次即可。
要让代码重复执行多次,一种方法,是可以把这段代码复制粘贴多次。

代码如下:

导入openpyxl模块

import openpyxl

将以下所有代码复制粘贴12次,计算每个月的"火龙果可乐"的销售额

wb = openpyxl.load_workbook("2019年1月销售订单.xlsx", data_only=True)

通过工作簿对象wb获取名为"销售订单数据"的工作表对象,并赋值给变量orderSheet

orderSheet = wb["销售订单数据"]

定义一个变量colaSold用来表示本月"火龙果可乐"的销售金额

colaSold = 0

遍历工作表的所有行数据

for rowData in orderSheet.rows:

商品名C列是第3列,索引也就是2

productName = rowData[2].value

获取订单总价I列的索引和总价

priceIndex = openpyxl.utils.cell.column_index_from_string("I") - 1

price = rowData[priceIndex].value

判断如果productName是"火龙果可乐"

if productName == "火龙果可乐":

逐个添加总价到本月销售额(colaSold)里

colaSold = colaSold + price

打印出本月销售额,格式为:2019年1月火龙果可乐销售额为{销售总额}元

print(f"2019年1月火龙果可乐销售额为{colaSold}元")

代码逐步解析

下面是对给定代码的逐步解析,解释每个部分的功能以及如何计算每个月的"火龙果可乐"销售额。

```python

导入openpyxl模块

import openpyxl

这行代码导入了 `openpyxl` 模块,该模块用于读取和写入 Excel 文件(.xlsx 格式)。

```python

将以下所有代码复制粘贴12次,计算每个月的"火龙果可乐"的销售额

wb = openpyxl.load_workbook("2019年1月销售订单.xlsx", data_only=True)

这里加载名为 `2019年1月销售订单.xlsx` 的 Excel 文件,并将其保存为工作簿对象 `wb`。`data_only=True` 参数表示只读取公式计算后的值,而不是公式本身。

通过工作簿对象wb获取名为"销售订单数据"的工作表对象,并赋值给变量orderSheet

orderSheet = wb["销售订单数据"]

这行代码从工作簿中获取名为"销售订单数据"的工作表,并将其赋值给变量 `orderSheet`,以便后续使用。

定义一个变量colaSold用来表示本月"火龙果可乐"的销售金额

colaSold = 0

这行代码初始化一个变量 `colaSold`,用于累计本月"火龙果可乐"的销售额,初始值为 0。

遍历工作表的所有行数据

for rowData in orderSheet.rows:

这里使用 `for` 循环遍历工作表中的每一行数据,`rowData` 每次循环代表当前行的所有单元格。

商品名C列是第3列,索引也就是2

productName = rowData[2].value

```

在这一行中,获取当前行中第 3 列(索引为 2, 因为索引从 0 开始)的值,代表商品名称,并赋值给 `productName` 变量。

```python

获取订单总价I列的索引和总价

priceIndex = openpyxl.utils.cell.column_index_from_string("I") - 1

price = rowData[priceIndex].value

```

这两行代码首先使用 `openpyxl.utils.cell.column_index_from_string("I")` 获取第 I 列的索引(9),然后减去 1 得到实际索引(8)。接着,获取当前行中第 I 列的值,即订单总价,并赋值给 `price` 变量。

```python

判断如果productName是"火龙果可乐"

if productName == "火龙果可乐":

```

此行代码检查 `productName` 是否等于"火龙果可乐",如果是的话,执行下面的代码块。

```python

逐个添加总价到本月销售额(colaSold)里

colaSold = colaSold + price

```

如果条件成立,则将当前订单的总价 `price` 加入到 `colaSold` 中,以累计"火龙果可乐"的销售额。

```python

打印出本月销售额,格式为:2019年1月火龙果可乐销售额为{销售总额}元

print(f"2019年1月火龙果可乐销售额为{colaSold}元")

```

最后,使用 `print` 函数输出本月"火龙果可乐"的销售总额,格式化为指定的字符串。

复制代码以计算每个月的销售额

为了计算每个月的"火龙果可乐"销售额,您可以将上述代码复制并粘贴 12 次,并相应地更改文件名和打印输出的格式。每个月的文件名应当对应于实际文件,例如:

```python

2019年1月

复制并修改为

wb = openpyxl.load_workbook("2019年2月销售订单.xlsx", data_only=True)

...

print(f"2019年2月火龙果可乐销售额为{colaSold}元")

```

以此类推,直到 2019 年 12 月。

示例

以下是一个完整的示例,用于计算 2019 年每个月的"火龙果可乐"销售额:

```python

import openpyxl

for month in range(1, 13): # 1 到 12 月

格式化月份为两位数

month_str = f"{month:02d}"

然而,一个好的程序员需要遵循一条原则:++"Don't Repeat Yourself"++ ,简称DRY原则。
在本例中,为了做到不写重复的代码,我们可以把计算单月"火龙果可乐"销售额的整个步骤写成一个函数,把Excel文件的路径作为输入的参数,计算出的销售额为函数的返回值。
这样,我们就不用多次复制粘贴同一段代码啦。

导入openpyxl模块

import openpyxl

将计算单月销售额的步骤移到函数getMonthlySold中

获取单月"火龙果可乐"销售额的函数

参数 filePath: 销售数据Excel文件路径

返回值: 计算出的销售额结果

def getMonthlySold(filePath):

添加data_only=True打开工作簿,获取公式计算后的值

wb = openpyxl.load_workbook(filePath, data_only=True)

通过工作簿对象wb获取名为"销售订单数据"的工作表对象,并赋值给变量orderSheet

orderSheet = wb["销售订单数据"]

定义一个变量colaSold用来表示本月"火龙果可乐"的销售金额

colaSold = 0

遍历工作表的所有行数据

for rowData in orderSheet.rows:

商品名C列是第3列,索引也就是2

productName = rowData[2].value

获取订单总价I列的索引和总价

priceIndex = openpyxl.utils.cell.column_index_from_string("I") - 1

price = rowData[priceIndex].value

判断如果productName是"火龙果可乐"

if productName == "火龙果可乐":

逐个添加总价到本月销售额(colaSold)里

colaSold = colaSold + price

将计算后的销售额返回

return colaSold

接下来,通过观察销售订单的Excel文件名,我们可以发现,每个文件名仅有月份数字不同。

因此,我们可以很方便的使用for循环加++range()++ 函数,配合上++格式化字符串++ ,来批量生成每个Excel表格的文件路径:2019年{month}月销售订单.xlsx。再把这个文件路径传入到getMonthlySold函数中,来计算各个月份的销售额。最后逐个添加到一个列表soldList中

导入openpyxl模块

import openpyxl

将计算单月销售额的步骤移到函数getMonthlySold中

获取单月"火龙果可乐"销售额的函数

参数 filePath: 销售数据Excel文件路径

返回值: 计算出的销售额结果

def getMonthlySold(filePath):

使用openpyxl.load_workbook()函数读取工作簿,文件路径使用函数参数filePath

添加data_only=True打开工作簿,获取公式计算后的值

wb = openpyxl.load_workbook(filePath, data_only=True)

通过工作簿对象wb获取名为"销售订单数据"的工作表对象,并赋值给变量orderSheet

orderSheet = wb["销售订单数据"]

定义一个变量colaSold用来表示本月"火龙果可乐"的销售金额

colaSold = 0

遍历工作表的所有行数据

for rowData in orderSheet.rows:

商品名C列是第3列,索引也就是2

productName = rowData[2].value

获取订单总价I列的索引和总价

priceIndex = openpyxl.utils.cell.column_index_from_string("I") - 1

price = rowData[priceIndex].value

判断如果productName是"火龙果可乐"

if productName == "火龙果可乐":

逐个添加总价到本月销售额(colaSold)里

colaSold = colaSold + price

将计算后的销售额colaSold返回

return colaSold

TODO 定义一个空列表soldList来逐个装入各个月份的销售额

soldList=[]

TODO 使用for循环和range,逐个遍历1~12的数字

注意:range的第二个参数是不包括到循环内的

for month in range(1,13):

TODO 利用格式化字符串拼接Excel文件名,传入到获取单月销售额的函数并赋值给变量monthlySold

monthlySold = getMonthlySold(f"2019年{month}月销售订单.xlsx")

TODO 将"火龙果可乐"单月销售额monthlySold使用append函数逐个添加到列表中

soldList.append(monthlySold)

打印出所有月份的销售额

print(soldList)

得到"火龙果可乐"每个月份的销售额后,要解决阿珍的问题,最后一步就是找出销售额的最大值,并定位到是几月份。

要获取一个列表中的最大值,可以使用Python内置的max()函数。
将列表作为参数传入max()函数,该列表的最大值即会被返回。

所得即197

当我们知道了列表中的一个元素,想要去列表中找到这个元素位于什么位置,可以使用列表的index()函数。
通过要查询的列表对象使用index()函数,将要查询的元素作为参数传入,则该元素从左往右第一次出现的索引将会被返回。如果查询的元素不在列表中,会报一个ValueError的错

(即在 Python 中,index() 函数用于查找指定元素在列表或字符串中的第一个匹配项的索引。如果找不到该元素,会抛出 ValueError 异常。

用于列表

|------------------------------------------------------------------------------------------------------|
| 使用index()函数,确定"火龙果可乐"卖得最好的月份,赋值给变量maxMonth。最后使用print在终端输出"火龙果可乐在{maxMonth}月份卖得最好"。 |
| 找到了销售额的最大值后,我们需要确定这个最大值是第几月份的。 这时就可以使用刚才学习的index()函数,来获取最大值在列表中的索引,然后将得到索引加1 ,就是我们最终希望得到的月份数字。(思路分析) |
| |

总结

通过这三天的学习,我们帮助阿珍解决了,去年店里"火龙果可乐"哪个月卖得最好,这个问题。课程的最后,再来复习一下知识点吧。

相关推荐
崔庆才丨静觅17 小时前
hCaptcha 验证码图像识别 API 对接教程
前端
passerby606118 小时前
完成前端时间处理的另一块版图
前端·github·web components
掘了18 小时前
「2025 年终总结」在所有失去的人中,我最怀念我自己
前端·后端·年终总结
崔庆才丨静觅18 小时前
实用免费的 Short URL 短链接 API 对接说明
前端
崔庆才丨静觅19 小时前
5分钟快速搭建 AI 平台并用它赚钱!
前端
崔庆才丨静觅19 小时前
比官方便宜一半以上!Midjourney API 申请及使用
前端
Moment19 小时前
富文本编辑器在 AI 时代为什么这么受欢迎
前端·javascript·后端
崔庆才丨静觅19 小时前
刷屏全网的“nano-banana”API接入指南!0.1元/张量产高清创意图,开发者必藏
前端
剪刀石头布啊19 小时前
jwt介绍
前端
爱敲代码的小鱼19 小时前
AJAX(异步交互的技术来实现从服务端中获取数据):
前端·javascript·ajax