熟悉使用Excel的同学应该都知道,在单个Excel表格里想要分商品计算总销售额,使用数据透视表也可以非常快速方便的获得结果。
但当有非常大量的Excel文件需要处理时,每一个Excel文件单独去做数据透视也会消耗大量的时间。
就算使用Power Query这样的工具进行多表合一,也会有同一个工作表太大导致电脑太卡和所有Excel文件格式必须一样这样的问题。
Python读取、处理Excel文件优势就在于处理大量文件也非常快速以及应付各种不同格式的文件和不同需求的灵活性。
现在我们有一个例子,就是想知道某个月份的火龙果可乐销售额最高。思路是,首先我们得出了整个计算单个月份“火龙果可乐”销售额的步骤:
- 读取工作表:“销售订单数据”
- 逐行读取订单数据
- 把“火龙果可乐”的订单总价相加
一、读取excel文件
一个Excel表格文件,又叫做一个工作簿(Workbook)。一个工作簿中包含一个或多个工作表(Worksheet)。在工作薄页面的左下方可以进行工作表的切换和增删。
一个工作表由单元格(Cell)组成。Excel的数据存储在单元格中。我们可以通过列号(Column)和行号(Row)对单元格进行定位。
1)openpyxl模块的安装与导入
要使用Python对Excel表格进行读取,我们需要安装一个用于读取数据的工具 openpyxl 。openpyxl 是一个用于读、写Excel文件的开源模块。
安装openpyxl非常简单,在终端中输入代码:pip install openpyxl即可。
如果在自己电脑上安装不上或安装缓慢,可在命令后添加如下配置进行加速:
pip install openpyxl -i https://pypi.tuna.tsinghua.edu.cn/simple/
二、读取工作簿
在安装和导入openpyxl之后,读取指定路径的工作簿需要使用函数:openpyxl.load_workbook()。
工作簿文件的路径需要作为函数参数传入。若文件就在代码运行的工作目录,就可以直接传入文件名。 示例中,所有的Excel文件刚好都在工作目录 /Users/zhener/doc下。
我们读取了阿珍收到的12个Excel文件中的其中一个:2019年1月销售订单.xlsx,直接将文件名以字符串的形式填入函数的括号内即可。
openpyxl.load_workbook()函数读取成功后,会返回一个工作簿对象,本例中我们将这个对象赋值给了变量wb。
# 导入openpyxl模块
import openpyxl
#读取工作目录里名为"2019年1月销售订单.xlsx"的工作簿并赋值给变量wb
wb = openpyxl.load_workbook("2019年1月销售订单.xlsx")
三、读取指定工作表
读取了工作簿对象后,下一步就是读取指定的工作表。
每个工作簿中,都包含一个或多个工作表。每个工作表,都有一个名称。
如果事先不知道工作簿内有哪些工作表,我们可以通过访问工作簿的 .sheetnames 属性来获取一个包含所有工作表名称的列表。具体操作为在变量wb之后添加代码 .sheetnames 。在示例中,我们获取了工作簿内所有的工作表名称,并使用print输出到终端。
# 导入openpyxl模块
import openpyxl
# 读取工作目录里名为"2019年1月销售订单.xlsx"的工作簿并赋值给变量wb
wb = openpyxl.load_workbook("2019年1月销售订单.xlsx")
# 使用print输出工作簿中所有的工作表名称
print(wb.sheetnames)
结果
['销售商品', '销售订单数据']
得到了工作表名称后,我们可以通过在变量wb后添加中括号[ ]和工作表名称的方式来获得对应的工作表对象。本例中,为了获得“火龙果可乐”的销售金额,我们就需要读取“销售订单数据”这个工作表。示例中读取了这个工作表对象并赋值给变量orderSheet。
# 导入openpyxl模块
import openpyxl
# 读取工作目录里名为"2019年1月销售订单.xlsx"的工作簿并赋值给变量wb
wb = openpyxl.load_workbook("2019年1月销售订单.xlsx")
# 通过工作簿对象wb获取名为“销售订单数据”的工作表对象,并赋值给变量orderSheet
orderSheet=wb["销售订单数据"]
四、读取指定单元格以及单元格里的值
要获取工作表中指定的单元格对象,我们可以通过在中括号[ ]内填入列号和行号的方式去获取。
单元格对象除了包含具体的值,还包含相关的函数和属性。
# 导入openpyxl模块
import openpyxl
# 读取工作目录里名为"2019年1月销售订单.xlsx"的工作簿并赋值给变量wb
wb = openpyxl.load_workbook("2019年1月销售订单.xlsx")
# 获取"销售商品"工作表
productSheet = wb["销售商品"]
# 使用print输出productSheet的C5单元格对象
print (productSheet["C5"])
现在输出单元格对象并没有输出单元格内的值。
要访问单元格里的值,我们可以在单元格对象后加一个 .value 。
# 导入openpyxl模块
import openpyxl
# 读取工作目录里名为"2019年1月销售订单.xlsx"的工作簿并赋值给变量wb
wb = openpyxl.load_workbook("2019年1月销售订单.xlsx")
# 获取"销售商品"工作表
productSheet = wb["销售商品"]
# 使用print输出productSheet的C5单元格的值
print(productSheet["C5"].value)
结果
麻辣味口香糖
若单元格中包含公式,现有方式读取出的值是公式本身。
若需要读取公式计算后的值,要在读取工作簿的代码部分,传入一个参数: data_only=True ,便可以得出公式计算后的值了。
# 导入openpyxl模块
import openpyxl
# 原打开方式,直接读取公式本身
wb = openpyxl.load_workbook("2019年1月销售订单.xlsx")
orderSheet = wb["销售订单数据"]
# 输出公式本身
print(orderSheet["I3"].value)
# 添加data_only=True打开工作簿,获取公式计算后的值
wb2 = openpyxl.load_workbook("2019年1月销售订单.xlsx", data_only=True)
orderSheet2 = wb2["销售订单数据"]
# 输出公式计算后的值
print(orderSheet2[