Python 办公效率化学习(自学)四.Excel文件的写入

Excel文件的写入

目录

Excel文件的写入

Day1

一.步骤分析

二.具体操作 

1.创建一个空的工作簿

(1)因为还是对Excel进行操作,所以在一开始,我们需要导入openpyxl模块。

(2)使用openpyxl.Workbook()函数即可创建一个新工作簿。

(3) 更改工作簿名称

2.工作簿中添加工作表

(1)创建工作表

(2) Excel设置单元格值

(3)保存文件

Day1总结 

Day2

3.读取A/B/C平台数据

(1)步骤

(2) 读取一个平台每个商品在每个月的销售额

Day3 

4.将A/B/C平台数据写入对应的工作表

(1)步骤

(2) 单个平台写入数据

 (3)多个平台写入数据

 Day3总结

三.总代码 


Day1

一.步骤分析

1. 创建一个空的工作簿
2. 在工作簿内创建A/B/C三个平台的工作表
3. 读取A/B/C平台数据并写入对应的工作表
4. 将这个工作簿保存到指定路径

二.具体操作 

1.创建一个空的工作簿

(1)因为还是对Excel进行操作,所以在一开始,我们需要导入openpyxl模块。

(2)使用openpyxl.Workbook()函数即可创建一个新工作簿。

通过输出这个字段我们发现,使用openpyxl.Workbook()创建的工作簿里面,都有一张默认的工作表,名称为Sheet。

(3) 更改工作簿名称

先通过变量newWb使用中括号 + 工作表名称获取这个工作表对象,然后把这个对象赋值给变量aSheet。

通过对工作表对象的.title属性进行赋值,即可修改工作表的名称。

2.工作簿中添加工作表

(1)创建工作表

通过工作簿对象使用create_sheet()函数可以创建一个名称为Sheet的工作表。
若名为Sheet工作表已经存在,则会在Sheet后依次添加数字,比如Sheet1,Sheet2。
在创建时如需要指定工作表名称,可以将需要指定的工作表名称作为参数传入create_sheet()函数。

(2) Excel设置单元格值

在前面Excel读取的课程中,我们已经学习到可以通过“工作表对象["列号行号"].value”这种方式来获取指定的单元格的值。

直接把要设置的值赋值给.value属性,就可以设置或修改这个单元格的值了。

(3)保存文件

到目前为止,我们已经创建好要用来汇总数据的工作簿以及生成了各个平台的工作表。

但这个工作簿是仅仅存在于程序中的,当程序运行结束,这个工作簿也就不存在了。

为了持久化存储工作簿,我们需要把工作簿以文件的形式存储到指定路径。

通过工作簿对象使用save()函数,将文件保存路径作为参数,即可将工作簿保存到指定的文件路径。 一般地,我们将工作簿存储成后缀名为.xlsx的文件。

如果指定路径的文件已经存在,使用save()函数会⚠️覆盖原有文件。

Day1总结 

Day2

3.读取A/B/C平台数据

(1)步骤

1. 读取一个平台每个商品在每个月的销售额;

2. 计算每个商品在每个月的销售额。

(2) 读取一个平台每个商品在每个月的销售额

因为所有平台的文件都是根据月份来命名,所以我们使用for循环和range()函数来逐个遍历1~12的数字,方便处理每个月份的文件。

需要注意的是range()函数第一个参数的数字是包括在生成的列表中的,第二个参数的数字不包括。因此生成1~12的数字需要使用range(1, 13)

我们仔细观察一下A平台的文件名称可以发现,现在这样输出的月份数字是不能直接生成想要的文件名的。

 因为A平台所有的文件名中月份数字都有两位,小于10的月份数字在前面都补了一个0。

我们当然可以在代码中写上if语句来判断月份小于10时来给文件名补0,但更加优雅的做法是控制格式化字符串最小宽度。 

要在格式化字符串时控制最小宽度,只需要在格式化字符串的大括号内表达式后加上一个英文冒号(:),冒号后跟上最小宽度的数字即可。

# 遍历0~2的数字,逐个访问列表中的元素
for index in range(3):
    # 格式化输出姓名和编号,姓名控制最小宽度为5(补空格),编号最小宽度为3并补0
    print(f"{nameList[index]:5} - {idList[index]:03}")

 拿到了工作表对象后,第二步就是计算得出每个商品的销售总额了。

为了方便统计和之后写入到汇总Excel文档中,我们使用一个字典(dict)来存储每个商品的销售总额。

再下一步,就是逐个遍历每一行数据,将这行数据的商品名称和订单总价提取出来。

提取出来后,找到当月数据字典中对应商品名称键的数据,将销售额进行累加。

有了每行订单数据的商品名(productName)和总价(orderPrice)后,下一步就是把这个总价统计累加到月数据字典里(monthData)。

但这段代码会报一个KeyError的错误,因为monthData这个字典一开始并没有productName这个键。

为了解决这个问题,我们可以使用接下来将学习的字典默认值。 

想要安全地访问字典中的键,可以通过字典对象使用get()函数。

字典的get()函数第一个参数是要访问的键(key),如果这个键存在于这个字典,函数会返回这个键对应的值;

第二个参数表示当第一个参数指定的键不存在时,函数返回的值。

其中第二个参数是可选的,如果没有传第二个参数,当键不存在时,函数会返回None,但不会报KeyError的错误。

Day3 

4.将A/B/C平台数据写入对应的工作表

(1)步骤

1. 将已经计算出的A平台销售额写入到对应的工作表中;

2. 将A平台的整个计算统计方法设置为函数,应用到B/C两个平台。 

(2) 单个平台写入数据

 我们可以使用之前学过的设置单元格值的办法来把数据一个一个放进去。

也可以使用接下来将要学习的添加行数据方法来更加方便的一行一行的写入单元格数据。

想要添加一整行数据可以通过工作表对象使用append()函数。

append()函数会在现有工作表内数据的最后一行之后再添加一行数据。append()函数只有一个参数,该参数是一个列表或者元组。

使用函数后,列表或元组内的数据会按照顺序逐个添加到目标行中。

实现方式:

本例中,我们先要对每月统计好的商品销售数据字典(monthData)进行遍历,然后再逐一把商品按行添加进汇总的工作表中。

汇总工作表每一行中的数据按顺序分别是:商品名,月份和销售额。

我们只需要按照这个顺序构造一个元组并作为参数传入aSheet.append()函数,即可整行整行地将A平台的数据写入汇总工作表中。 

 (3)多个平台写入数据

B/C平台的汇总方式和A平台是一样的,但数据有区别:文件路径,订单工作表名称,商品名称列,商品名称表头,总价列以及最后要添加到的工作表都不同。

所以我们只需要把整个统计方法写成一个函数,然后将每个平台不同的部分当成参数,最后分别使用这个函数即可完成全部3个平台的数据统计。

 Day3总结

三.总代码 

# 导入openpyxl 模块
import openpyxl

# 创建一个新工作簿
newWb = openpyxl.Workbook()

# 将默认工作表赋值给aSheet变量
aSheet = newWb["Sheet"]

# 将aSheet工作表名称修改为“A平台”
aSheet.title = "A平台"

# 创建 B平台 的工作表并赋值给变量bSheet
bSheet = newWb.create_sheet("B平台")

# 创建 C平台 的工作表并赋值给变量cSheet
cSheet = newWb.create_sheet("C平台")

# 使用for循环遍历工作簿对象的worksheets属性
for sheet in newWb.worksheets:
    # 给每一个工作表设置表头
    sheet["A1"].value = "商品名"
    sheet["B1"].value = "月份"
    sheet["C1"].value = "销售额"

# 计算月份工作簿内各个商品的总价,并添加数据到汇总工作表
# 参数 filePath: 工作簿文件路径
# 参数 orderSheetName: 订单工作表的名称
# 参数 nameIndex: 商品名称的列索引
# 参数 nameHead: 商品名称的表头
# 参数 priceColumn: 总价的列号
# 参数 month: 当前处理的月份
# 参数 targetSheet: 要添加到的目标工作表
def processMonthFile(filePath, orderSheetName, nameIndex, nameHead, priceColumn, month, targetSheet):
    # 定义一个全局变量存放工作簿
    global wb
    # 定义全局变量工作表名称orderSheet
    global orderSheet
    # 定义一个全局变量空字典用来放本月数据
    global monthData 
    monthData = {}
    # 定义一个全局变量存放数据元组
    global rowData
    
    # 使用load_wordbook函数读取工作簿
    wb = openpyxl.load_workbook(filePath, data_only=True)
    # 获取订单工作表
    orderSheet = wb[orderSheetName]

    # 定义一个空字典用来放本月数据
    monthData = {}

    # 遍历订单工作表,计算每个商品的总销售额
    for row in orderSheet.rows:
        # 获取订单商品名称
        productName = row[nameIndex].value
        # 跳过表头
        if productName == nameHead:
            continue
        # 获取总价列的索引
        priceIndex = openpyxl.utils.cell.column_index_from_string(priceColumn) - 1
        # 获取订单总价
        orderPrice = row[priceIndex].value

        # TODO 先安全地获取已经统计到的商品月销售额赋值给monthPrice
        # 如果productName还不在字典monthData中,返回0
        monthPrice = monthData.get(productName,0)
        # 将这个订单的价格累加到商品总价
        monthData[productName] = monthPrice + orderPrice
    
    # 遍历本月数据字典的keys,也就是商品名称
    for productName in monthData.keys():
        # 按顺序构造行数据元组: 商品名, 月份, 销售额数据
        rowData = (productName, f"{month}月份", monthData[productName])
        # TODO 使用append()函数将rowData添加到目标工作表targetSheet中
        targetSheet.append(rowData)

# 使用for循环和range,逐个遍历1~12的数字
for month in range(1, 13):
    # 使用processMonthFile函数,汇总A平台数据
    # TODO 格式化输出A平台文件路径:A平台/2019XX.xlsx,其中XX是月份
    processMonthFile(f"A平台/2019{month:02}.xlsx","明细",4,"名称","f",month,aSheet)
    # 汇总B平台数据
    processMonthFile(f"B平台/order_2019_{month}.xlsx","订单详情",1,"商品名称","G",month,bSheet)
    # 汇总C平台数据
    processMonthFile(f"C平台/2019年{month}月销售订单.xlsx","销售订单数据",2,"商品名","I",month,cSheet)

# 将工作簿保存到路径 /Users/yequ/data/汇总.xlsx
newWb.save("/Users/yequ/data/汇总.xlsx")

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值