要求:需要生成此样式的标贴用于产品包装,以便识别每种产品相关信息。
可以使用python在Excel表格的基础上快速生成,下表Excel把需要的数据填写,则自动生成标贴
处理步骤流程
从“info”工作表读取所有物料的信息转换字母为大写,存储好信息. (标签中的品牌必须是大写字母,所以需要把小写字母全部转换)将处理好的信息逐个写入到“label”工作表保存工作表
从“info”工作表读取并处理信息,存入列表
# 从“info”工作表读取并处理信息,存入列表from openpyxl import load_workbook #导入运行库def get_info(path): #读取info内的内容,用函数get_info()包装wb = load_workbook(path) #输入excel的路径,也可以理解为wb装下了整个excel内容ws = wb['info'] #需要读取的表名;ws工作表info=[]#表里面存放的内容有什么。for row in range(2, ws.max_row+1): #从第二行开始,第一行是表头;+1是因为range中取值不包含最后一位,所以此处需要ws.max_row+1brand = ws['A' + str(row)].valueif brand: # 判断“品牌”是否为空值,若为空值则不进行大小写字母的转换# 若无这行,当遇到“品牌”为空值时,程序会报错,因为空值无法进行大小写转换brand=brand.upper() #将“品牌”中的小写字母全部转换成大写字母type = ws['B' + str(row)].value # 获取单元格中的数据pn = ws['C' + str(row)].valuelotno = ws['D' + str(row)].valuedate = ws['E' + str(row)].valueif date: # 判断“日期时间”是否为空值,若为空值则不进行日期获取# 若无这行,当遇到“日期时间”为空值时,程序会报错,因为空值无法进行日期获取date=date.date() #只获取日期时间中的日期,比如-2-20,不需要具体时间quantity = str(ws['F' + str(row)].value)+" pcs" # 在数量后面加上“pcs”字样data={"brand":brand,"type":type,"pn":pn,"lotno":lotno,"date":date,"quantity":quantity}info.append(data)return info
数据读出存入info,并查看label_info里的相关信息
%%time# %%time 用于查看程序运行所需时间info=get_info("data\label_info.xlsx")#数据读出存入info;必须写入才能把info中的数据导入label中print("finished")#finished#Wall time: 515 ms#label_info单元格相关信息from IPython.core.interactiveshell import InteractiveShell #是为了让len(info)和info[0]一起展示,缩小占用空间,更有利于滤清思路InteractiveShell.ast_node_interactivity = "all"# 以上两行是为了让输出全部显示,如果没有它们,如下Out只会显示最后一个info[0]的结果,而不会显示len(info)=70的结果len(info) #len(info)可查看info列表中有多少个数据,核对数据个数是否正确info[0] #字典里的键对应的是“品牌、型号、物料编号、批次号、生成日期、数量”,值正好是Excel表中第2行的数据。'''{'brand': 'SH1','type': '11X11-XX761X8','pn': '011-0076108','lotno': 'Q19H023994901','date': datetime.date(, 2, 20),'quantity': '300 pcs'}'''
label_info_nan单元格生成
info_nan=get_info("data\label_info_nan.xlsx") #get_info获取指定链接单元格数据len(info_nan) info_nan[-1]'''91{'brand': 'ABC91','type': 'C1HQERFFX1D','pn': '212-05012072','lotno': 'H0345345410','date': datetime.date(, 11, 8),'quantity': '200 pcs'}'''
将处理好的信息逐个写入到“label”工作表并保存
# 将处理好的信息逐个写入到“label”工作表并保存def write_info(path,info): #把文件和装有信息的容器封装成函数,用于反复调用.wb = load_workbook(path) # wb装下了整个excel内容ws = wb['label']k=0for i in range(2,9,3): #列遍历 #标签是3个一行,每个标签之间空一行一列。而我们只给第二、五、八列填写数据,因此这里的range(2,9,3)指的是从2列开始,#8列结束,选9可以取到8,以3为步长,列的取值将为2,5,8, for j in range(1,round(len(info)*7/3),7): #行遍历if k < len(info): #当数据条数不是3的整数倍时,计数器k会超出列表info的范围,后续代码只有在k < len(info)的情况下执行ws.cell(row=j, column=i).value = info[k]['brand']ws.cell(row=j+1, column=i).value = info[k]['type']ws.cell(row=j+2, column=i).value = info[k]['pn']ws.cell(row=j+3, column=i).value = info[k]['lotno']ws.cell(row=j+4, column=i).value = info[k]['date']ws.cell(row=j+5, column=i).value = info[k]['quantity']k+=1 #k是列表info的索引,此处加一以便获取下一条数据wb.save(path) #保存Excel文件
label_info将获取到的数据导入label数据表
%%timepath="data\label_info.xlsx"write_info(path,info) #调用write_info函数,将数据写入并保存print("Finished!")'''Finished!Wall time: 1.63 s'''
label_info_nan将获取到的数据导入label数据表
%%timewrite_info("data\label_info_nan.xlsx",info_nan) #调用write_info函数,将数据写入并保存print("Finished!")'''Finished!Wall time: 779 ms'''
如果需要处理一个文件夹下的多个订单,需要如下操作
import os #引入os模块。该模块可自动获取文件路径及文件名。def file_name(file_dir):names=[]for file in os.listdir(file_dir):if ".xlsx" in file: # 只处理该路径下的Excel文件names.append(file_dir+file)return namesfile_dir="data/" #文件夹名字pathess=file_name(file_dir)pathess #获取到文件夹下的所有文件目录'''['data/label_info - 1.xlsx','data/label_info - 2.xlsx','data/label_info - 3.xlsx','data/label_info.xlsx','data/label_info_nan.xlsx']'''%%timefor path in pathess:info=get_info(path)write_info(path,info) print("Finished!") '''Finished!Wall time: 8.8 s'''
文件夹可能还包含子文件夹,获取文件夹以及下面的子文件夹
file_dir="data/"for root, dirs, files in os.walk(file_dir):#三个值,分别是目录的路径,目录下子目录的名字,文件的名字。再遍历子目录,同样返回子目录的路径,#子目录下的子目录的名字,子目录内的文件的名字。若还有子目录,则继续遍历,直到所有目录被遍历。print(root,dirs,files,sep="\n******************\n")"""data/******************['a', 'b']******************['label_info - 1.xlsx', 'label_info - 2.xlsx', 'label_info - 3.xlsx', 'label_info.xlsx', 'label_info_nan.xlsx', 'Python基础知识了解.docx']data/a******************[]******************['label_info - 4.xlsx', 'label_info - 5.xlsx']data/b******************[]******************['label_info - 6.xlsx', 'label_info - 7.xlsx']"""pathss=[] # 文件夹内所有文件(包括子目录)file_dir="data/"for root, dirs, files in os.walk(file_dir): #os.walk可遍历一个目录内各个子目录和子文件。path = [os.path.join(root, name) for name in files] #使用os.path.join函数将文件所在路径与文件名连起来pathss.extend(path)pathss"""['data/label_info - 1.xlsx','data/label_info - 2.xlsx','data/label_info - 3.xlsx','data/label_info.xlsx','data/label_info_nan.xlsx','data/Python基础知识了解.docx','data/a\\label_info - 4.xlsx','data/a\\label_info - 5.xlsx','data/b\\label_info - 6.xlsx','data/b\\label_info - 7.xlsx']"""#如果文件夹内还有除Excel之外的文件,需要将其从文件路径列表中剔除,然后再传入信息读取和写入的函数。result=[]for i in pathss:if '.xlsx' in i:result.append(i)result"""['data/label_info - 1.xlsx','data/label_info - 2.xlsx','data/label_info - 3.xlsx','data/label_info.xlsx','data/label_info_nan.xlsx','data/a\\label_info - 4.xlsx','data/a\\label_info - 5.xlsx','data/b\\label_info - 6.xlsx','data/b\\label_info - 7.xlsx']"""#写入所有目录下的文件%%timefor path in result:info=get_info(path)write_info(path,info) print("Finished!") #Finished!#Wall time: 11.9 s
如果觉得《物料标签智能批量生成 常用于产品包装》对你有帮助,请点赞、收藏,并留下你的观点哦!