zoukankan      html  css  js  c++  java
  • 办公自动化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=" ****************** ") #sep=’ ‘: 表示当输入多个打印的值时,各个值之间分割方式, 默认空格,可以自定义

    pathss=[] # 文件夹内所有文件(包括子目录)
    file_dir="data/"
    for root, dirs, files in os.walk(file_dir):
    #由于我们需要获得文件的完整路径,但以上files只是文件的名字,
    #所以需要使用os.path.join函数将文件所在路径与文件名连起来,
    #如data/b需要跟new.txt连起来,变成'data/b ew.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 #######################

    因为不懂,所以要学; 因为平凡,所以努力。 因为有为,所以有位。 因为执着,所以精彩。
  • 相关阅读:
    Linux从入门到进阶全集——【第十四集:Shell编程】
    cmake 编译 c++ dll 的一个例子
    %1 不是有效的Win32应用程序
    C++ 生成 dll 和调用 dll 的方法实例(转)
    Clion cmake 一个简单的 C++ 程序
    一月4
    一月4日
    1月4日
    一月4日
    一月4日
  • 原文地址:https://www.cnblogs.com/quezesheng/p/13280079.html
Copyright © 2011-2022 走看看