Excel文档的读取(3)

devtools/2024/12/23 1:32:56/

我们继续观察“销售订单数据”这张工作表。这张表里的每一行其实就是一个订单。
下一步,我们需要在工作表里,逐行去判断哪些订单商品是“火龙果可乐”,并把对应的订单总价添加到当月售卖总金额里。
此处,我们需要用到行数据的遍历

遍历orderSheet中所有的行数据,并使用print输出到终端

在遍历工作表之前,定义一个变量colaSold用来表示当月“火龙果可乐”的销售金额

刚才我们使用行遍历读取出了工作表中的每一行数据。
接下来,我们需要在行遍历中逐行去判断哪些订单商品是“火龙果可乐”,并把对应的订单总价添加到当月售卖总金额里。
首先我们定义一个变量colaSold,用来表示当月“火龙果可乐”的销售金额,并赋值为0。

# 导入openpyxl模块

import openpyxl

# 读取工作目录里名为"2019年1月销售订单.xlsx"的工作簿并赋值给变量wb

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

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

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

# 定义一个变量colaSold用来表示本月“火龙果可乐”的销售金额,并赋值为0

colaSold = 0

# 遍历工作表的所有行数据

for rowData in orderSheet.rows:

    print(rowData)

接下来,我们需要让程序判断表单中每一行的订单商品名是否为“火龙果可乐”。如果是,就逐一把销售金额添加到colaSold变量里。
通过观察“销售订单数据”工作表,我们知道商品名对应的是第C列

通过前面的学习可以发现,行遍历的输出结果,是由单元格对象组成的元组。
在元组中要定位到具体的列不能使用列号“C”,而需要用索引。 我们可以通过肉眼观察,来确定商品名的列“C”是第3列,所以索引是2。
获取每一行商品名的代码如下:productName = rowData[2].value

如果要定位的列数字比较大,比如订单的总价在第M列,通过肉眼观察来确定索引略显繁琐。
这时,可以使用函数:openpyxl.utils.cell.column_index_from_string(),来获取列号对应的数字,比如传入参数“E”就会获取到数字5,表示“E”列是第5列。这个数字减一即可得到对应的索引。因为索引是从0开始的,所以需要减一。

获取每一行订单总价的代码如下:

# 导入openpyxl模块

import openpyxl

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

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

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

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

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

colaSold = 0

# 遍历工作表的所有行数据

for rowData in orderSheet.rows:

    # 通过索引2获取第3列数据,也就是商品名

    productName = rowData[2].value

    # 获取订单总价M列的索引总和,这里之所以-1是因为需要将表头去除

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

    price = rowData[priceIndex].value

    # 输出价格

print(price)

# 导入openpyxl模块

import openpyxl

# 使用openpyxl.load_workbook()函数读取工作目录里名为"2019年10月销售订单.xlsx"的工作簿并赋值给变量wb

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

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

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

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

# 定义一个变量chipsSold用来表示本月“榴莲味薯片”的销售金额

chipsSold = 0

# 遍历工作表的所有行数据

for rowData in orderSheet.rows:

    # 获取这一行的商品名赋值给变量productName

    # 商品名C列是第3列,索引也就是2,记得添加.value读取单元格的值

    productName = rowData[2].value

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

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

    # 根据索引获取本行订单总价并赋值给变量price

    price = rowData[priceIndex].value

   

    # 判断productName是否是“榴莲味薯片”,如果是,就逐个添加到本月销售额(chipsSold)里

    if productName == "榴莲味薯片":

        chipsSold = chipsSold + price

# 打印出本月销售额,格式为:2019年10月榴莲味薯片销售额为{销售总额}元

print(f"2019年10月榴莲味薯片销售额为{chipsSold}元")

在明天的课程中,我们将继续完成剩下的2个步骤:

1. 重复执行今天学到的方法,计算出所有12个月的销售额。

2. 找出这12个月里销售额的最大值,然后锁定其对应的月份。

最终解决阿珍的问题:
“火龙果可乐”哪个月份的销售额最高?
 


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

相关文章

Linux——redis理论、安全模型

一、redis 主要的data type redis 的原生客户端redis 支持通过python php golang 等语言连接redis 主要适用场景 二、redis如何进行数据存储 非关系数据库 不使用二维表 redis 使用键值对完成数据的存储redis一共有16个库 ,不同的库使用编号 0-15redis 在…

多机编队—(1)ubuntu 配置Fast_Planner

文章目录 前言一、Could not find package ...二、使用error: no match for ‘operator’...总结 前言 最近想要做有轨迹引导的多机器人编队,打算采用分布式的编队架构,实时的给每个机器人规划出目标位置,然后通过Fast_Planner生成避障路径&…

HarmonyNext动画大全03-帧动画

HarmonyNext动画大全03-帧动画 介绍 帧动画Animator和属性动画animation、显式动画animateTo的区别在于帧动画是通过返回应用onFrame逐帧回调的方式,让开发者在 应用侧的每一帧都可以设置属性值,从而实现设置了该属性值对应组件的动画效果。并且可以轻…

QT Android开发之Android端usb调试模式设置与问题解决

一.QT android开发android端usb调试模式设置 QT android开发环境搭建完成后,android设备需要打开usb调试模式才能正常连接,下面以小米ipad为例进行设置(其他手机和ipad设置方法类似) 1.问题: 笔者当时想拷贝ipad内文件到pc上,安装了360手机助手,用了几次后突然发现QT…

《OpenCV计算机视觉》—— 图像轮廓检测与绘制

文章目录 一、轮廓的检测二、轮廓的绘制图像轮廓检测与绘制的代码实现 三、轮廓的近似 一、轮廓的检测 轮廓检测是指在包含目标和背景的数字图像中,忽略背景和目标内部的纹理以及噪声干扰的影响,采用一定的技术和方法来实现目标轮廓提取的过程注意:做轮…

2024高教杯数学建模A题思路

问题1:舞龙队沿螺距为55 cm 的等距螺线顺时针盘入 分析: 龙头速度:龙头前把手的行进速度始终保持1 m/s。螺线参数:螺距为55 cm,即0.55 m。初始条件:龙头位于螺线第16圈A点处。思路: 确定螺线方程:根据螺线的性质,建立极坐标方程,表示螺线各点的位置。计算时间步长:…

dp(背包问题) 恰好、至少、至多初始化

状态表示的初始化(一般情况) f[i][j] i:前i件物品 体积至少为j 枚举体积时可以是负数(体积为负数时等价于体积为0) max f[i][j] {-0x3f} f[i][0] 0 min f[i][j] { 0x3f} f[i][0] 0 cnt f[0][0] 1 体积至多为j 枚举体积时不能是负数 max f[i][j] 0 min f[i][j] {0x3f}…

【知识分享】MQTT实战-使用mosquitto客户端连接emqx服务器

一、简介 MQTT(Message Queuing Telemetry Transport)是一种轻量级的、基于发布/订阅模式的通信协议,旨在实现物联网设备之间的低带宽、高延迟的通信。MQTT协议设计简洁,使用TCP/IP协议进行通信,适用于各种网络环境&am…