办公自动化1:自动批量生成物料标签

功能:自动批量生成物料标签

'''
说明:本程序来源互联网,进行了一定修改,仅仅作为学习使用使用。
######## 原始数据整理如下:
表格sheet1即“label” 标签模板格式:
A列 B列 C列 -空列 D列 E列 F列 -空列 G列 H列
第1行 品牌Brand A9BC1 品牌Brand A9BC1 品牌Brand A9BC1
第2行 型号Type 11X11-XX761X8 型号Type 11X11-XX761X8 型号Type 11X11-XX761X8
第3行 物料编号Item P/N 011-0076108 物料编号Item P/N 011-0076108 ...
第4行 生产批号Lot No. Q19H023994901 生产批号Lot No. Q19H023994901 ....
第5行 生产日期Date 2019-2-20 生产日期Date 2019-2-20 ...
第6行 数量Quantity 300 pcs 数量Quantity 300 pcs ...
第7行 空行
......重复上面内容

表格sheet2即“info”,格式为:
品牌 型号 物料编号 批次号 生产日期 数量
A9BC1 11X11-XX761X8 011-0076108 Q19H023994901 2019-2-20 300
A9BC2 11X2X-XX313XX 020-0031300 Q19F024078501 2019-2-20 300
A9BC3 111XX-XXXX6XX 100-0000600 Q19F024021201 2019-2-20 300
A9BC4 11X3X-XX342XX 030-0034200 Q19F024020601 2019-2-20 300
A9BC5 12X8X-XX246XX 080-0024600 Q19F024021701 2019-2-20 300
A9BC6 1299X-XXX26XX 990-0002600 Q19F024022201 2019-2-20 300
A9BC7 36X11-X43X9X3 011-0430903 Q2287 2019-2-20 300
A9BC8 3699X-X21X4XX 990-0210400 201901171 2019-1-24 300
A9BC9 41XX1-XXX6171 001-0006171 181217 2018-12-21 300
A9BC10 41XX2-XXX6181 002-0006181 190104 2019-2-20 300

'''
############## 程序开始 #######################

01 从“info”工作表读取并处理信息,存入列表

from openpyxl import load_workbook #openpyxl是一个可读取Excel的第三方库。load_workbook()可打开一个现有的Excel文件(或叫工作簿)。

def get_info(path): #ctrl+1批量注释
wb = load_workbook(path)
ws = wb['info']
info=[]
for row in range(2, ws.max_row+1): #从数据不行标题开始算起是第2行,结束要+1才能包括全部行数据
brand = ws['A' + str(row)].value #A是第A列,B是B列,品牌
# print(ws['A' + str(3)].value)

    if brand: # 判断“品牌”是否为空值,若为空值则不进行小写字母的转换
              # 若无这行,当遇到“品牌”为空值时,程序会报错,因为空值无法进行大小写转换
        brand=brand.upper() #将“品牌”中的小写字母全部转换成大写字母
    typ = ws['B' + str(row)].value # 获取单元格中的数据,型号
    pn = ws['C' + str(row)].value #物料编号
    lotno = ws['D' + str(row)].value  #批次号
    date = ws['E' + str(row)].value  #生产日期
    if date: # 判断“日期时间”是否为空值,若为空值则不进行日期获取
             # 若无这行,当遇到“日期时间”为空值时,程序会报错,因为空值无法进行日期获取
        date=date.date() #只获取日期时间中的日期,比如2019-2-20,不需要具体时间
    quantity = str(ws['F' + str(row)].value)+" pcs" # 在数量后面加上“pcs”字样
    data={
        "brand":brand,
        "typ":typ,
        "pn":pn,
        "lotno":lotno,
        "date":date,
        "quantity":quantity
    }
    info.append(data)
return info

path='label_info - 1.xlsx'
info=get_info(path)
print("succed")

02 将处理好的信息逐个写入到“label”工作表并保存

def write_info(path,info): #包含两个参数,path及info,即需操作的文件及装着信息的容器。
wb = load_workbook(path)
ws = wb['label']
k=0 #我们定义了一个变量k,并设定它的初始值为0。这是为了给后续遍历列表info提供索引,比如info[0]就是指info里面的第一条数据,也就是第一个物料的所有信息。然后是for循环遍历所有列。为方便打印,我们的标签是3个一行,每个标签之间空一行一列。
for i in range(2,9,3): #列遍历,我们只给第二、五、八列填写数据,因此这里的range(2,9,3)指的是从2列开始,8列结束,以3为步长,列的取值将为2,5,8,正是我们需要填写数据的列号。
#我们进行行遍历,由于每个标签有6个信息,加上1个空行,因此每个标签总共占用了7行。range(1,round(len(info)7/3),7)指从第一行开始,以步长为7取值,直到最后一行,round用于四舍五入以保证为整数,此处取的值都是每个标签的第一行。假设共有6个标签需要填写,那么需要的行数为67/3=14,range(1,14,7)可取到的值为1,8行。
for j in range(1,round(len(info)7/3),7): #行遍历,包括空行共info总数7行,分3列后是实际行数
if k < len(info): #当数据条数不是3的整数倍时,计数器k会超出列表info的范围,后续代码只有在k < len(info)的情况下执行
ws.cell(row=j, column=i).value = info[k]['brand']
# ws.cell(row=j, column=i).value = info[k]['']
ws.cell(row=j+1, column=i).value = info[k]['typ']
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文件

'''03 多个订单的标签,我们可以用类似的方法一次完成。
我们只需要将所有订单的Excel文件放入一个文件夹,然后就可以批量操作。
此时,需要引入os模块。该模块可自动获取文件路径及文件名。
'''
import os
def file_name(file_dir): #我们定义一个函数file_name,包含一个参数file_dir,该参数用于传入Excel文件所在的路径。
names=[] #定义一个列表names用于存储后续获取的Excel文件路径。
for file in os.listdir(file_dir): #os.listdir将返回指定的文件夹包含的文件及文件夹的名字的列表。
if ".xlsx" in file: # 只需要处理Excel文件,因此加入一个条件判断,只将带有“.xlsx”后缀的文件放入names列表。
names.append(file_dir+file) #由于os.listdir只获取了文件名,但我们在写入数据时需要文件的完整路径,所以需要把文件所在的路径加在文件名前面,即file_dir+file。
return names
file_dir="data/"
pathess=file_name(file_dir)

pathess

'''
04 然后就可以调用之前写好的读取信息及写入信息的函数,
逐个将names列表中的路径传入函数,完成信息的读取和写入。

'''

为了不影响 05 情况先注释掉。

for path in pathess:

info=get_info(path)

write_info(path,info)

print("Finished!")

end 以上代码实现一个文件夹下多个excel数据的批量处理。

下面代码实现一个文件夹下面有文件还有文件夹,除了excel还有其他格式的情况

'''
05因为不同的客户,我们的文件夹可能还包含子文件夹,
那要一次获取母文件夹中的所有Excel文件,需要应用到os.walk函数。
os.walk可遍历一个目录内各个子目录和子文件。
它先遍历当前目录,返回三个值,分别是目录的路径,目录下子目录的名字,文件的名字。
再遍历子目录,同样返回子目录的路径,子目录下的子目录的名字,子目录内的文件的名字。
若还有子目录,则继续遍历,直到所有目录被遍历。因此需要三个变量root, dirs, files去接收它的返回值。
'''

file_dir="data/"

for root, dirs, files in os.walk(file_dir):

print(root,dirs,files,sep="\n******************\n") #sep=’ ‘: 表示当输入多个打印的值时,各个值之间分割方式, 默认空格,可以自定义

pathss=[] # 文件夹内所有文件(包括子目录)
file_dir="data/"
for root, dirs, files in os.walk(file_dir):
#由于我们需要获得文件的完整路径,但以上files只是文件的名字,
#所以需要使用os.path.join函数将文件所在路径与文件名连起来,
#如data/b需要跟new.txt连起来,变成'data/b\new.txt',其中""是""的转义字符。
path = [os.path.join(root, name) for name in files]
#上述程序用到了列表解析式:path = [os.path.join(root, name) for name in files]
pathss.extend(path)
pathss

如果文件夹内还有除Excel之外的文件,需要将其从文件路径列表中剔除,然后再传入信息读取和写入的函数。

result=[]
for i in pathss:
if '.xlsx' in i:
result.append(i)
result

for path in result:
info=get_info(path)
write_info(path,info)
print("Finished!")

############## end #######################

posted @ 2020-07-10 16:53  bison2020  阅读(664)  评论(0编辑  收藏  举报