You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Python Pandas为Excel数据生成Code128/Code39条形码报错咨询

Excel批量生成Code128/Code39条形码报错解决方案

报错原因汇总

  • 所有报错的核心原因是python-barcode库仅支持接收单个字符串生成条形码,不能直接传入pandas Series对象或字符串访问器:
    1. KeyError: 'ROW1.RACK1':代码中传入的df8.str是pandas的字符串访问器对象,不是实际文本,Code39误将其作为字典读取key触发报错
    2. TypeError: unhashable type: 'Series':直接传入整列Series对象,Code128生成时需要对输入做哈希校验,可变的Series对象不支持哈希操作
    3. IllegalCharacterError:字符串处理过程中混入了空格、换行等不可见字符,或是旧版本库默认开启了严格字符校验
  • 后续修改后输出文本而非条形码的原因:str(df8)是将整列Series转为带索引的汇总文本,并非单个单元格内容;且直接将条形码对象存入DataFrame时,pandas导出Excel会自动将对象转为字符串,无法识别为图片。

解决方案(批量生成独立条形码文件)

以下代码会自动创建barcodes文件夹,将每个唯一编码对应生成独立的png格式条形码,同时导出编码和条形码文件名的对应Excel表:

import pandas as pd
import os
from barcode import Code128
from barcode.writer import ImageWriter

# 初始化存储条形码的文件夹
if not os.path.exists("barcodes"):
    os.makedirs("barcodes")

def cleanup():
    # 替换为你的源文件读取路径,csv可换为pd.read_csv
    df1 = pd.read_excel("你的源表格.xlsx")
    # 原有的字符串处理逻辑
    df8 = df1['Shelf'].str[:-7]
    df11 = df8.str.split('.').str[0]
    df12 = df8.str.split('.').str[1]
    df13 = df11.str.split('row').str[1]
    df14 = df12.str.split('rack|case|table|display|endcap|bin|dispenser').str[1]
    df15 = df13 + '.' + df14
    
    # 取唯一编码批量生成条形码,避免重复生成
    unique_codes = df8.dropna().unique()
    for code in unique_codes:
        # 去除首尾不可见字符,避免非法字符报错
        clean_code = code.strip()
        # 生成Code128条形码,add_checksum控制是否添加校验位
        code_obj = Code128(clean_code, writer=ImageWriter(), add_checksum=False)
        # 保存文件,替换点为下划线避免文件名异常
        save_path = os.path.join("barcodes", clean_code.replace(".", "_"))
        code_obj.save(save_path)
    
    # 生成对应关系表导出Excel
    res_df = pd.DataFrame({
        "Shelf": df1["Shelf"],
        "row/rack": df15,
        "对应条形码文件名": df8.str.replace(".", "_") + ".png"
    })
    # 按原有逻辑排序、去重清空
    res_df = res_df.sort_values(["row/rack", "Shelf"], ascending=(True, False))
    res_df.loc[res_df["对应条形码文件名"].duplicated(keep="first"), "对应条形码文件名"] = ""
    res_df.to_excel("条形码对应表.xlsx", index=False)

if __name__ == "__main__":
    cleanup()

补充说明

  • 若需使用Code39,将代码中的Code128替换为Code39,并将clean_code转为大写:clean_code = code.strip().upper()即可
  • 若需将条形码直接插入Excel单元格,可使用openpyxl库的图片插入功能,遍历对应关系表将对应路径的png文件插入到指定单元格,调整单元格行高列宽即可正常显示

内容的提问来源于stack exchange,提问作者Nathaniel

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 05:45:07