1. 情境问题
大龙是一名产品质检员,每天下班前,他都要统计所有车间计划产量及每日产量。
他把数据记录到【检验记录表模板.xlsx】工作簿并另存为【x月x日检验记录表.xlsx】工作簿,本案例以 8 月 25 日为例,结果如下图:
接下来,我们分析一下这份工作任务,
工作目标
把【生产计划表.xlsx】工作簿和【工人产量日报表.xlsx】工作簿中对应的数据,复制或经过计算记录到【检验记录表模板.xlsx】工作簿中,最后另存为【8月25日检验记录表.xlsx】工作簿。
平时他都是手动操作完成,具体的步骤是这样的:
运用 Python 代码帮助他/她实现工作目标 👇:
把【生产计划表.xlsx】工作簿和【工人产量日报表.xlsx】工作簿中对应的数据,复制或经过计算记录到【检验记录表模板.xlsx】工作簿中,最后另存为【8月25日检验记录表.xlsx】工作簿。
2.1 元组合并
元组合并
即连接两个或多个元组,可以使用+
运算符。
总的来说,元组合并
的使用是这样的,你需要注意:
2.2 round()内置函数
round()
可以用来保留小数位数。
总的来说,round()
的使用是这样的,你需要注意:
实现代码:
from openpyxl import load_workbook
# 获取【工人产量日报表】工作表
production_wb = load_workbook('../工作/工人产量日报表.xlsx')
production_sheet = production_wb.active
# 创建产量字典
production_dict = {}
# 遍历【工人产量日报表】工作表中的数据
#从第三行开始取出所有数据
for row in production_sheet.iter_rows(min_row=3, values_only=True):
# 从“工号”中提取出“车间号”(workshop_num)
workshop_num = row[0][:2]
# 判断字典中是否有该车间的信息
if production_dict.get(workshop_num) == None:
# 以“车间号”为键,“产品编号”与“实际产量 ”组成的字典为值,写入字典中
production_dict[workshop_num] = {row[1]: row[4]}
else:
# 判断当前车间中,是否有该产品的信息
if production_dict[workshop_num].get(row[1]) != None:
# 累加“实际产量”
production_dict[workshop_num][row[1]] += row[4]
# 如不存在该产品信息,则以“产品编号”为键,“实际产量”为值,写入字典中
else:
production_dict[workshop_num][row[1]] = row[4]
# 分别获取【检验记录表模板】、【生产计划表】工作表
template_wb = load_workbook('../工作/检验记录表模板.xlsx')
template_sheet = template_wb.active
plan_wb = load_workbook('../工作/生产计划表.xlsx')
plan_sheet = plan_wb.active
# 遍历【生产计划表】工作表中的数据
for row in plan_sheet.iter_rows(min_row=3, values_only=True):
# 根据“车间号”、“产品编号”,获取产量字典中的“实际产量”
actual_production = production_dict[row[1]][row[2]]
# 计算“目标达成率”
rate = actual_production / row[3]
# 将“目标达成率”保留两位小数,并转成百分比格式
rate = str(round(rate*100, 2)) + '%'
# 根据【检验记录表模板】工作表的表头,将数据写入【检验记录表模板】工作表中
template_row = row[:4] + (actual_production, rate)
template_sheet.append(template_row)
# 将【检验记录表模板.xlsx】工作簿另存为【8月25日检验记录表.xlsx】工作簿
template_wb.save('../工作/8月25日检验记录表.xlsx')