Excel文档的读入(4)

devtools/2024/12/21 21:58:01/

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

代码如下:

# 导入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 ,就是我们最终希望得到的月份数字。(思路分析)

总结

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


http://www.ppmy.cn/devtools/112077.html

相关文章

Knife4j:打造优雅的SpringBoot API文档

1. 为什么需要API文档? 在现代软件开发中,API文档的重要性不言而喻。一份清晰、准确、易于理解的API文档不仅能够提高开发效率,还能降低前后端沟通成本。今天,我们要介绍的Knife4j正是这样一款强大的API文档生成工具,它专为Spring Boot项目量身打造,让API文档的生成…

【技术实践】MySQL分表分库全解析:从理论到实战

文章目录 【技术实践】MySQL分表分库全解析:从理论到实战1. 引言1.1 MySQL数据库面临的挑战1.2 分表分库的概念与优势 2. MySQL分表分库的基本原理2.1 水平分表2.2 垂直分表2.3 水平分库2.4 分表分库的选择标准 3. 实现分表分库的技术方案3.1 中间件解决方案3.2 自定…

反射是一个新的AI模型,可以在一台性能良好的笔记本上运行并在测试中击败GPT-4o

开源AI模型领域又迎来一位新的重量级选手。由初创公司HyperWrite开发的Reflection 70B,凭借其创新的“反思”机制,正引发广泛关注,这一机制旨在解决大型语言模型的核心问题——幻觉。 在早期的基准测试中,这个升级版的Meta的Llam…

前端开发的观察者模式

什么是观察者设计模式 观察者模式(Observer Pattern)是前端开发中常用的一种设计模式。它定义了一种一对多的依赖关系,使得当一个对象的状态发生改变时,其所有依赖对象都能收到通知并自动更新。观察者模式广泛应用于事件驱动的系…

微服务CI/CD实践(五)Jenkins Docker 自动化构建部署Java微服务

微服务CI/CD实践系列: 微服务CI/CD实践(一)环境准备及虚拟机创建 微服务CI/CD实践(二)服务器先决准备 微服务CI/CD实践(三)Jenkins部署及环境配置 微服务CI/CD实践(四)…

QT QTcpSocket作为客户端

前言 QTcpSocket是Qt提供的关于TCP网络通信的类。QTcpSocket是一个异步的类,能够非阻塞式发送和接收数据。QTcpSocket内部封装了网络通信相关细节,对外提供便利的接口去帮助开发人员实现简历连接、断开连接、数据收发。 主要内容 基本使用方式 项目文…

【C++ Primer Plus习题】13.4

大家好,这里是国中之林! ❥前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站。有兴趣的可以点点进去看看← 问题: 解答: main.cpp #include <iostream>#include "port.h"in…

综合案例-数据可视化-折线图

一、json数据格式 1.1 json数据格式的定义与功能 json是一种轻量级的数据交互格式&#xff0c;可以按照json指定的格式去组织和封装数据&#xff0c;json数据格式本质上是一个带有特定格式的字符串。 功能&#xff1a;json就是一种在各个编程语言中流通的数据格式&#xff0…