☰
Excel批量生成二维码与条形码:从内置控件到Python脚本的完整指南
2026/10/1 5:38:33 网站建设 项目流程

上周帮一个做仓储的朋友处理物料编码,1246行数据,要按编码生成二维码贴到货架上。他看到我在Excel里几下就铺完了一整列,特别吃惊,问我是不是买了什么高级工具。其实没有,就是办公软件自带的能力加上一点批量填充的思路。后来我发现,身边大量需要这种处理的人,还在用在线二维码生成器一个个粘贴,效率低,还容易串行。

这篇文章我就把这套东西完整写出来,覆盖最常见的几种做法:Excel/WPS自带功能、条码字体应急方案、加载项与函数联动、Python脚本批量处理,以及大量我在实操中踩过的坑。适合谁看:每天跟库存、资产、文件、图书、标签打交道的人,或者准备做各种码但不想一个个用在线工具生成的人。

1. 这些场景都用得上:在表格里批量生成二维码不只是“省事”

1.1 最典型的四类使用场景

先别急着看操作步骤,你得先弄清楚自己到底属于哪种需求。我自己接触过的真实场景大概有四类:

  • 库存与固定资产盘点:物料编码、固定资产编号生成二维码,贴到货架、设备上,扫码就能看到台账信息。这类需求量大,几百上千行是家常便饭。
  • 产品追溯与防伪标签:给每批产品生成唯一追溯码,扫码跳转到溯源页面。这类需求通常还要配合打印标签,二维码只是数据载体。
  • 会议签到与登记表:参会人员名单在Excel里,给每人生成一个二维码,现场扫码进入公众号或小程序完成签到。
  • 图书、档案和文件管理:每册图书、每份档案一个条码,贴在封面或侧面,扫码枪对着扫一下就能完成借还登记。

这些场景的共同点是什么?数据源早就在表格里了,你缺的不是“能生成二维码的工具”,而是一个“能直接吃进整列数据、并批量吐出图片”的工作流。

1.2 为什么说表格是批量生成的最佳入口

很多人习惯打开一个二维码生成网站,输入内容,下载图片,然后手动把图片塞回Excel。数据量小的时候还好,数据量到几百行,这个流程能把人逼疯。

表格作为入口的最大优势在于:数据和码是一一对应的关系,天然适合批量操作。你可以把A列当作数据源,B列生成二维码,C列生成条形码,D列放对应的文字说明。后续如果某个内容改动,对应的码也会联动更新,不需要重新生成一遍。

这个“联动更新”特性非常重要。做印刷或者做标签的时候,内容改动一次是很正常的。如果你用的是在线工具生成的静态图片,改一个字符就得重新生成、重新下载、重新排版;但如果你用的是表格内生成方案,改源单元格,码自动跟着变。

1.3 开工前先确认三件事

我建议你在动手之前,先花两分钟确认三件事,不然很容易做到一半返工:

  • 码里放什么内容?是放一段普通文本、一个URL链接,还是Wi-Fi配置串、联系方式vCard?不同内容在生成时对长度和字符集要求不一样。
  • 用什么设备扫?普通手机摄像头就能扫二维码;条形码则需要专门的扫码枪,而且不同条码规格(Code39、Code128、EAN-13)对应的扫描枪兼容性也不一样。
  • 最终用在哪里?如果只在屏幕上展示(比如会议签到时让人扫手机屏幕),像素要求可以低一些;如果要打印成标签贴到货架上,输出分辨率必须够高,打印机的精度也得跟上。

这三件事直接决定后面的方案选择和数据格式处理。

2. 方案怎么选:内置功能、加载项、字体、脚本的取舍

2.1 不同方案的底层逻辑

市面上能“在表格里生成二维码”的方案,我大致分成四类。每一类的逻辑完全不同,别指望一套方案打天下。

第一类:桌面办公软件自带功能。Excel里有老牌的ActiveX条形码控件,WPS里有现成的二维码工具。这个方案的好处是零安装、离线可用,缺点是批量联动能力参差不齐,功能相对基础。

第二类:第三方加载项/插件。这类工具以Excel加载项的形式存在,安装后会在功能区或公式库里多出几个函数。比如某些加载项提供了=QRText()这样的函数,输入内容直接返回二维码图片对象,往下拉就能批量生成。好处是联动性极强,坏处是部分加载项收费,或者来源不明,装上后可能有权限问题。

第三类:条码字体。这个思路和上面完全不同:它不生成图片,而是把单元格里的文本直接通过特殊字体渲染成条码外观。适合一维条形码,操作简单,文件体积小。但二维码没法用字体方案。

第四类:写脚本(Python/VBA)。适合一次性、大批量、需要独立图片文件(PNG/JPG)或者需要高度定制样式的场景。学习曲线最高,但可控性也最强。

2.2 选型对照与适用建议

我给一个比较实在的选型对照表,你可以直接对号入座:

方案类型上手难度批量能力离线可用隐私风险扩展性适合谁
Excel/WPS内置控件低中等完全离线无低偶尔做几十个码
第三方加载项低强看实现部分需联网中需要频繁在表格内联动更新
条码字体低强完全离线无低一维码大量生成、打印标签
Python脚本中高极强完全离线无高上千条数据、需要导出图片或对接系统

有些场景下,专业标签软件(比如Bartender)才是最终解,它的做法是把Excel当数据库,在标签模板里动态绑定字段生成条码。这个方案其实非常专业,但问题是要额外购买软件、搭建模板,对很多人来说“杀鸡用牛刀”。如果你只是想快速在表格里出图,没必要一上来就上这类重型工具。

我个人建议:如果你对函数和简单操作不反感,优先尝试第三方的Excel加载项,因为它最贴合“表格批量生成”的本质;如果公司环境不允许装插件,那就用内置控件或者条码字体;如果数据量过万,或者是周期性任务(每月都要做一次),直接把Python脚本跑通,一劳永逸。

3. 零代码上手:Excel/WPS里直接生成二维码和条形码

3.1 Excel里的BarCode Control控件

很多老版本的Excel(包括部分新版本)都自带一个叫“Microsoft BarCode Control”的ActiveX控件。这东西平时藏在很深的地方,很多人用Excel好几年都没见过它。

调出路径是这样的:Excel选项 → 自定义功能区 → 勾选右侧的“开发工具”选项卡 → 确定。然后在Excel顶部找到“开发工具” → 点击“插入” → 在最下方找到“其他控件” → 在弹窗里找“Microsoft BarCode Control 15.0”。

选择控件后,在当前工作表里拖拽出一个框,Excel会默认生成一个一维码。右键这个控件,选择“属性”,在属性面板里能找到一条最重要的属性:LinkedCell,把它填成你数据所在的单元格,比如A2。这样控件会自动读取A2的内容并渲染成条形码,不用你手动敲内容。

这个控件的Style属性决定条码类型。默认是0(机器可读的Code 39),你也可以改成7(Code 128)或者9(EAN-13)等。改完记得重新进工作表页面看效果。

有一个我踩过的大坑:这个ActiveX控件在64位Office里经常无法插入,会直接报错,或者插入后打开文件时提醒“无法加载对象”。如果你公司统一装了64位Excel,而且IT不给换32位,这条路大概率走不通。遇到这种情况别死磕,直接看下一节的加载项方案。

3.2 加载项还是函数:想要“下拉填充”就选它

ActiveX控件的问题在于:你想让100行数据各自对应一个条形码,就得手动拖100个控件出来,这行不通。真正适合“批量生成”的思路,是用加载项提供的“函数生成二维码/条码图片”能力。

以常见的国内Excel加载项为例,安装后在单元格里输入类似=QRTEXT(A2)或者=MakeQRCode(A2)这样格式的公式,公式的返回值是“一张二维码图片对象”。这个对象会直接显示在单元格里,你只需要往下拉填充手柄,就能让整列所有行都生成对应的二维码。

选择加载项时建议留个心眼:

  • 看权限要求:安装时如果要求访问你所有工作表文件,或者要求联网发送数据,就要谨慎。
  • 看是否免费/试用限制:有些加载项免费版会在生成的二维码中间加水印或者限长,正式使用前先检查。
  • 看更新频率:太老的加载项在Office一些新版本里可能失效,最好选一直在维护的。

使用这类加载项时最爽的一点是“数据改动自动刷新”。源单元格里的ID、链接变了,二维码图片跟着变,完全不用重新生成。

3.3 WPS的二维码入口与批量操作

WPS表格的“插入”菜单里直接有“二维码”功能,这是很多国内用户绕开Excel控件坑的最快方式。操作上,选中“插入 → 二维码”,会弹出一个对话框,你可以手动输入内容,也可以引用单元格。部分版本支持“批量生成”面板,选中一段数据区域,它能把整列内容变成一列二维码。

WPS批量生成二维码后,每一格是一个嵌入对象。如果你可以接受“它已经是一个独立的二维码图片”这个事实,就可以直接拿去做打印排版。复制粘贴到WPS文字或Excel的其他位置时,它也能作为图片被粘贴出去。

需要注意,WPS的免费版在批量数量和图片像素上会有一定限制,我之前遇到过大量生成时后排的二维码明显变模糊的情况。如果只是贴在屏幕上看问题不大,要打印的话尽量控制单批数量,或者用后面的Python方案。

3.4 生成后如何导出和排版

很多人卡在这一步:二维码在Excel里显示得好好的,想导出成图片发给设计,或者插到Word标签模板里,不会操作。

简单粗暴的方法是直接截图。选中二维码所在的单元格区域,按Ctrl + C复制,然后到Word或画图软件里粘贴。Excel的复制对象通常带透明背景,粘贴后你是能看到二维码图案的,但背景色可能继承单元格底色,记得把源单元格底色设为纯白。

更可控的做法是用Excel/ WPS的“文件 → 另存为”功能,把工作表保存为单个网页格式(.mht或者.html),然后用浏览器打开,二维码图片会以独立图片元素存在,可以直接另存。不过这种方式操作有点绕,偶尔用用可以,大批量导出我建议直接上脚本。

4. 应急路线:装一个条码字体,用公式撑起一整列

4.1 Code39字体方案为什么最省事

你可能会遇到这种情况:公司电脑权限受限,装不了加载项;网络环境又不能连外网去用在线工具;Excel自带的ActiveX控件又没法用。这时候,条码字体就是最后一道救命稻草。

以Code39条码为例,它有个特点:内容两端必须是星号(*)作为起止标记。你只需要在单元格里给内容前后加上星号,然后把字体设置成对应的条码字体,文字就会从视觉上变成一段粗细相间的黑色竖条。

免费可用的Code39字体比较经典的是“Free 3 of 9”或者“Free 3 of 9 Extended”。网上搜一下就能找到,下载后右键安装,Windows下安装到系统字体目录即可。

4.2 操作步骤与打印注意事项

具体操作分三步:

  1. 在Excel表格的C列输入公式:="*"&A2&"*",这样A2里的编码就变成了带星号的格式化文本。
  2. 选中C列数据区域,把字体设置为已安装的条码字体。
  3. 把字号调整到合适大小(我一般用20-36号),条形码的粗细、间距会随字号变化。

这里有三个必须留意的点:

  • 不要用“加粗”:加粗会把条码扩张变粗,扫描枪对黑条宽度的识别有固定容忍范围,变粗后很容易扫不出来。
  • 条码下方最好带可读数字:字体方案生成的条码,人眼根本看不出含义。建议在下一行用普通字体把原始编码显示出来,方便人工核对。
  • 打印精度和纸张材质:字体条码的工作原理决定了它对打印机分辨率有一定要求。我试过用针式打印机打这种条码,黑条边缘毛糙,扫枪经常失败;激光打印机或者热敏标签打印机效果稳定得多。

Code39在所有一维条码类型里算是对扫描枪兼容性最好的,几乎所有扫码枪都能扫。缺点是编码长度效率低,同样的内容,Code39生成的条码比Code128长一大截。如果你标签宽度有限、内容又长,可能需要查找Code128字体方案,但那往往需要对字符做格式转换,操作复杂度会提升不少。

4.3 二维码无法用字体方案时的替代思路

二维码的结构比一维码复杂得多,它必须通过真正的编码器生成,纯字体无法模拟。所以在“没有插件、没网、不想装脚本”的情况下,二维码比较现实的做法是:生成一次、用回自己。

具体来说:你可以利用在线二维码工具先生成一批模板二维码,但不要一个个手工输入。而是把Excel里的数据拼接成一个带有参数的链接,用“合并单元格”“公式拼接”把每行数据变成独立的二维码内容,然后借助批量工具(比如一些浏览器扩展或桌面小工具)批量生成。

这算是一个折中方案,适合临时用一次。如果长期、大量、周期性的二维码生成需求,我不建议长期依赖这种路径。

5. Python批量处理:一次性生成上千个码并自动回填Excel

5.1 环境准备与依赖

如果你已经能把Excel用得很溜,但发现“表格内批量生成”的方案在数据量到了一定规模、或者需要导出独立图片后力不从心,那就值得花半小时把Python方案跑通。

这里默认你已经安装了Python 3.8以上版本,没装的话去官网下载安装包,安装时记得勾选“Add Python to PATH”。然后用下面这条命令安装依赖库:

pip install qrcode pillow python-barcode openpyxl

这几个库的职责很清晰:

  • qrcode:生成二维码图片
  • pillow:让qrcode能输出PNG图片的底层图像库
  • python-barcode:生成一维条形码
  • openpyxl:读写Excel文件,并且能把图片插入到指定单元格

如果你手里的文件是旧版.xls格式,openpyxl读不了,需要另存为.xlsx,或者额外装xlrd库只读数据。

5.2 核心脚本详细拆解

下面给一个比较实用的脚本,逻辑分为三步:读取Excel某一列的数据 → 逐个生成二维码图片和条形码图片 → 把图片插入到同一行的另外两列。

import qrcode import barcode from barcode.writer import ImageWriter from openpyxl import load_workbook from openpyxl.drawing.image import Image as XLImage import os # 1. 读取Excel,拿到目标列数据 wb = load_workbook("product_list.xlsx") ws = wb.active # 默认第一个工作表 # 2. 创建存放图片的目录 out_dir = "generated_codes" os.makedirs(out_dir, exist_ok=True) # 3. 从第2行开始遍历(假设第1行是表头) for row in range(2, ws.max_row + 1): code_val = ws.cell(row=row, column=1).value if not code_val: continue code_val = str(code_val).strip() # 3.1 生成二维码 qr = qrcode.QRCode( version=None, # 自动选择版本大小 error_correction=qrcode.constants.ERROR_CORRECT_M, # 容错率约15% box_size=10, # 每个黑色像素点的尺寸,越大越清晰 border=2, # 二维码白边宽度 ) qr.add_data(code_val) qr.make(fit=True) qr_img = qr.make_image(fill_color="black", back_color="white") qr_path = os.path.join(out_dir, f"{code_val}.png") qr_img.save(qr_path) # 3.2 生成Code128条形码 code128 = barcode.get("code128", code_val, writer=ImageWriter()) bar_path = code128.save(os.path.join(out_dir, f"{code_val}_barcode")) # python-barcode保存时自动添加.png后缀 # 3.3 把两张图片回填到Excel对应的C、D列 qr_xl = XLImage(qr_path) qr_xl.width = 90 qr_xl.height = 90 ws.add_image(qr_xl, f"C{row}") bar_xl = XLImage(f"{code_val}_barcode.png") bar_xl.width = 180 bar_xl.height = 60 ws.add_image(bar_xl, f"D{row}") wb.save("product_list_with_codes.xlsx") print("处理完成,已生成新文件。")

这段脚本有几个很关键的设计点:

  • box_size决定二维码的母版像素尺寸。box_size=10生成出来的图片一般几百像素,肉眼和扫码都完全够用;如果你要放大打印到很大尺寸,建议调到15以上。
  • error_correction我选了M档(约15%容错),这是常规打印场景下的稳妥选择。要求严格的话选Q甚至H,但码体密度会相应增加。
  • Code128适合任意长度和任意字符,比Code39效率高。如果内容限定为纯数字且要符合商品条码规范,可以用EAN13,但EAN13对位数有硬性要求。

5.3 插入Excel时的尺寸和坐标调节

用openpyxl把图片插入Excel后,有一个很常见的问题:图片默认浮在单元格上方,不会主动改变行高列宽。如果你不调整行高,大量图片会叠在一起,很难看。

所以在处理图片之前,最好先统一设置相关行高、列宽:

from openpyxl.utils import get_column_letter ws.column_dimensions["A"].width = 20 ws.column_dimensions["C"].width = 18 ws.column_dimensions["D"].width = 30 for row in range(2, ws.max_row + 1): ws.row_dimensions[row].height = 75

设置行高后,图片插入位置的视觉对齐会舒服很多。另外XLImage设置宽高时是像素值,Excel的行高列宽单位跟像素不是直接能等算的,经验值是在96 DPI屏幕下,行高75磅大概对应100像素左右,列宽18字符大约对应130像素,具体按预览效果微调就行。

5.4 从“生成图片”到“标签打印”的扩展

脚本方案最大的好处不只是生成码本身,而是能把它接进更大的流程里。比如我平时会做这样一个组合:Python脚本生成二维码和条码 → 再配合Pillow库把文字说明、Logo、边框等拼到同一张标签底图上 → 最后按标签模板铺成A4排版图,直接送打印机。

如果你用标签打印机(比如热敏标签机),这类打印机通常自带驱动和排版软件,但Python生成的PNG图片往往能更自由地按你的指定位置拼接。这个能力已经超出了“Excel批量生成”的范畴,但它实实在在解决了我“数据在Excel、码要上标签”的最后一公里问题。

6. 踩坑清单:扫不出来、扫出来乱码、条码发虚怎么排查

6.1 先看内容,再看外观,最后怀疑扫描设备

遇到扫码失败,我建议按照一个固定顺序排查:内容本身对不对 → 生成参数对不对 → 打印/显示分辨率够不够 → 扫描设备是否兼容。

很多人在二维码扫不出来时,第一反应是怀疑生成工具垃圾,其实大部分问题出在内容编码上。比如单元格里的内容带有换行符,肉眼看起来好像是一段连续文字,扫码枪扫出来就带换行甚至乱码;又比如内容里不小心混入了全角空格,线上工具能正常识别,到扫码枪里就变成无效字符。

下面这张表是我整理的高频问题、原因和处理方式,可以直接对照参考:

现象常见原因处理办法
扫出来是空白内容单元格实际为空,或内容是空格用TRIM()清理空格,确保单元格非空
扫出来乱码/多出字符文本里带换行符或不可见字符用CLEAN()、SUBSTITUTE()去掉换行和特殊字符
内容是“0012”,扫码后变“12”单元格被识别为数字,前导零丢失把目标列设置为文本格式后再录入数据
网址二维码扫不开网址被截断或长度超限使用缩短链接,或确保内容完整、不换行
二维码图片发虚产生毛刺生成时像素太小,或打印时模糊调大box_size,打印前放大预览检查
条形码扫枪没反应条码高度过低、黑条太细、字体加粗增大字号、取消加粗,换激光/热敏打印

6.2 高频问题与对应处理

关于前导零丢失,这是做物料号、资产编号时最容易翻车的点。很多编号像“00012345”一样带着前导零,如果在Excel里直接用默认格式录入,回车后就变成“12345”,再生成二维码,内容就错了,而且很难被发现。解决方式有两个:一是录入前把这列设置成“文本”格式,或者录入时先输入一个英文单引号前缀;二是数据已经坏了就来不及挽救,只能用原始台账重新导一次。

关于中文乱码,二维码生成时默认采用UTF-8编码,绝大多数手机扫出来都没问题。但如果你用某些老式扫码枪扫二维码,它可能只支持GBK/GB2312解码,遇到UTF-8中文就会乱码。这个在会务签到、内部工具扫一扫的场景下尤其容易出现。处理办法是生成前确定设备支持哪种编码,必要时让脚本统一转码。

关于“单元格是小绿三角”,这是Excel提示“文本存储的数字”。很多人看到绿三角以为出错了,其实它可能帮你保留了前导零。如果你希望以数字参与计算,就转换成数字;如果这个单元格的数据是编号,绿三角反而是保护数据的好信号,可以保留。判断标准很简单:你的编码是不是要进行数学运算。

关于条形码的条宽,一维码扫描依赖“黑条和空白条的宽度比例”,不是字体越大越扫得出。字体方案里如果条码太细,扫描枪可能报错;太粗,条码长度又超过标签宽度。我的经验是从小到大测试:先设20号,打一页A4测试,能扫过再放大;不能扫就调大字号到24号再测,直到找出打印机、纸材和扫码枪的最佳平衡点。

关于批量工具的数据隐私,这部分我觉得还是值得单独强调一下。涉及到内部编码、身份证号、手机号、设备序列号、内网链接这类敏感信息,尽量不要把Excel内容直接贴到公网在线批量生成工具里。你无法确定这些数据被存到哪台服务器、会不会被第三方抓取。相对稳妥的做法是用Excel加载项离线生成,或者用上面的Python脚本完全本地运行。

写在最后的实际操作体会

批量生成二维码和条形码这件事,听起来很“小”,但把它做顺了,能省下的时间非常可观。我个人最常用的组合是:日常几十条数据用WPS内置工具直接搞定;每月定期要做上千条标签数据时,直接跑Python脚本,一条龙生成图片再排版打印。

如果让我给一个从零开始的建议,我觉得你不用一上来就学Python。先用最顺手的方式把第一批码跑出来,感受一下“数据在表格里、扫码枪对着屏幕或打印件扫一下就能识别”的完整流程。当你意识到“每次都要手动对齐、手动改格式”开始恼火时,就是你该学脚本或者换专业标签软件的时候了。工具永远是为流程服务的,先跑通流程,再谈优化。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询