python在excel中插入二维码

场景

需要在excel中的barcode列中插入二维码图片,方便运营人员打印和数据录入。

python在excel中插入二维码_第1张图片

下面是python代码生成后的结果:

python在excel中插入二维码_第2张图片 

代码

代码实现分为两个步骤:

1.生成二维码svg图片;

2.将图片插入到指定的单元格。

调用generate_barcodes方法可以将sku列表生成二维码到指定目录:

import barcode
from barcode.writer import ImageWriter


def generate_barcodes(contents, path):
    for i in contents:
        generate_barcode(i, path)
    pass


def generate_barcode(content, path):
    print(barcode.PROVIDED_BARCODES)  # 查看python-barcode支持的条形码格式
    # 获取编码类 code39
    EAN = barcode.get_barcode_class('Code128')  # 创建ean13格式的条形码格式对象 参数为支持的格式

    ean = EAN(content, writer=ImageWriter())  # 创建条形码对象
    '''
    Code构造函数有3个参数:Code(code, writer=None, add_checksum=True)
    code参数为编码数据,如'123445'等
    writer参数默认值为None,此时默认使用barcodr.writer.SVGWriter(),生成的文件为SVG格式。如果想获得PNG、JPEG或BMP图像格式,需要将该参数设置为barcode.writer.ImageWriter(),例如:Code('123456',barcode.writer.ImageWriter(),False)
    add_checksum参数默认值为True,生成的条码中会自动加上校验和,如果为False,则不加校验和
    '''
    fullname = ean.save(path + content, options={'dpi': 600, 'module_height': 10, 'font_size': 5, 'text_distance': 3,
                                                 'quiet_zone': 2})  # #此处不需要输入文件后缀 保存条形码图片,并返回保存路径。图片格式为png
    '''
    save函数有两个参数:save(filename,options=None)
    filename参数为保存文件名,不需要加扩展名,将根据设置自动添加扩展名,由函数返回文件全名。当前面构造函数使用默认writer时,保存为SVG文件,扩展名为.svg。
    options参数默认值为None,此时使用默认参数。如果需要修改设置,使用字典传入参数,例如:save("d:\\barcode",{'text': 'ABCD','format':'JPEG'})。可用参数如下:
        'module_width':默认值0.2,每个条码宽度(?),单位为毫米
        'module_height':默认值15.0,条码高度,单位为毫米
        'quiet_zone':默认值6.5,两端空白宽度,单位为毫米
        'font_size':默认值10,文本字体大小,单位为磅
        'text_distance':默认值5.0,文本和条码之间的距离,单位为毫米
        'background':默认值'white',背景色
        'foreground':默认值'black',前景色
        'text':默认值'',显示文本,默认显示编码,也可以自行设定
        'write_text':默认值True,是否显示文本,如果为True自动生成text的值,如果为False则不生成(如果此时手工设置了text的值,仍然会显示文本)。
        'center_text':默认值True,是否居中显示文本
        'format':默认值'PNG',保存文件格式,默认为PNG,也可以设为JPEG、BMP等,只在使用ImageWriter时有效。
        'dpi':默认值300,图片分辨率,,只在使用ImageWriter时有效。
    '''
    print(fullname)


然后调用generate_barcode_to_excel方法将二维码图片出入excel并生成新的Excel到指定目录。 

skus = get_skus(ws)获取excel的sku信息。

GenerateBarcode.generate_barcode(skus, svg_path)生成二维码到指定目录中。

 insert_img_excel(wb, skus, svg_path, ws)获取生成的二维码插入的第二列单元格并保存为行的excel。

import datetime

import openpyxl
from openpyxl.drawing.image import Image
from openpyxl.drawing.spreadsheet_drawing import AnchorMarker, TwoCellAnchor
from openpyxl.utils import get_column_letter

from httprunnertwat.util import GenerateBarcode


def get_wb(path):
    return openpyxl.load_workbook(path)


def get_sheet(name, wb):
    return wb[name]


def get_skus(sheet):
    columns = sheet.columns
    skus = []
    for i, c in enumerate(list(columns)[0]):
        if i == 0 or isinstance(c, str):
            continue
        value = c.value
        if not str(value).__contains__('None'):
            skus.append(value)
    return skus


def insert_img_excel(wb, skus, img_path, ws):
    for i, img in enumerate(skus):
        img = Image(img_path + img + ".png")
        _from = AnchorMarker(1, 50000, i + 1, 50000)
        to = AnchorMarker(2, -50000, i + 2, -50000)
        img.anchor = TwoCellAnchor('twoCell', _from, to)
        ws.add_image(img)
        ws.row_dimensions[i + 2].height = 64
    ws.column_dimensions[get_column_letter(2)].width = 64
    wb.save('./excel_dic/' + 'sku-barcode' + str(datetime.datetime.now().strftime('%Y-%m-%d')) + '.xlsx')
    pass


def set_all_width_height(ws):
    width = 64.0
    height = 64.0
    for i in range(1, ws.max_row + 1):
        ws.row_dimensions[i].height = height
    for i in range(1, ws.max_column + 1):
        ws.column_dimensions[get_column_letter(i)].width = width


def generate_barcode_to_excel(wb_path, sheet_name, svg_path):
    wb = get_wb(wb_path)
    ws = get_sheet(sheet_name, wb)
    skus = get_skus(ws)
    GenerateBarcode.generate_barcode(skus, svg_path)
    insert_img_excel(wb, skus, svg_path, ws)
    pass


if __name__ == '__main__':
    generate_barcode_to_excel('./sku-barcode.xlsx', 'sku-barcode', './svg/')

你可能感兴趣的:(项目问题,excel,python,开发语言)