需要在excel中的barcode列中插入二维码图片,方便运营人员打印和数据录入。
下面是python代码生成后的结果:
代码实现分为两个步骤:
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/')