Excel批量生成二维码与条形码:从内置控件到Python脚本的完整指南
上周帮一个做仓储的朋友处理物料编码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你也可以改成7Code 128或者9EAN-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 操作步骤与打印注意事项具体操作分三步在Excel表格的C列输入公式*A2*这样A2里的编码就变成了带星号的格式化文本。选中C列数据区域把字体设置为已安装的条码字体。把字号调整到合适大小我一般用20-36号条形码的粗细、间距会随字号变化。这里有三个必须留意的点不要用“加粗”加粗会把条码扩张变粗扫描枪对黑条宽度的识别有固定容忍范围变粗后很容易扫不出来。条码下方最好带可读数字字体方案生成的条码人眼根本看不出含义。建议在下一行用普通字体把原始编码显示出来方便人工核对。打印精度和纸张材质字体条码的工作原理决定了它对打印机分辨率有一定要求。我试过用针式打印机打这种条码黑条边缘毛糙扫枪经常失败激光打印机或者热敏标签打印机效果稳定得多。Code39在所有一维条码类型里算是对扫描枪兼容性最好的几乎所有扫码枪都能扫。缺点是编码长度效率低同样的内容Code39生成的条码比Code128长一大截。如果你标签宽度有限、内容又长可能需要查找Code128字体方案但那往往需要对字符做格式转换操作复杂度会提升不少。4.3 二维码无法用字体方案时的替代思路二维码的结构比一维码复杂得多它必须通过真正的编码器生成纯字体无法模拟。所以在“没有插件、没网、不想装脚本”的情况下二维码比较现实的做法是生成一次、用回自己。具体来说你可以利用在线二维码工具先生成一批模板二维码但不要一个个手工输入。而是把Excel里的数据拼接成一个带有参数的链接用“合并单元格”“公式拼接”把每行数据变成独立的二维码内容然后借助批量工具比如一些浏览器扩展或桌面小工具批量生成。这算是一个折中方案适合临时用一次。如果长期、大量、周期性的二维码生成需求我不建议长期依赖这种路径。5. Python批量处理一次性生成上千个码并自动回填Excel5.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_okTrue) # 3. 从第2行开始遍历假设第1行是表头 for row in range(2, ws.max_row 1): code_val ws.cell(rowrow, column1).value if not code_val: continue code_val str(code_val).strip() # 3.1 生成二维码 qr qrcode.QRCode( versionNone, # 自动选择版本大小 error_correctionqrcode.constants.ERROR_CORRECT_M, # 容错率约15% box_size10, # 每个黑色像素点的尺寸越大越清晰 border2, # 二维码白边宽度 ) qr.add_data(code_val) qr.make(fitTrue) qr_img qr.make_image(fill_colorblack, back_colorwhite) 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, writerImageWriter()) 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, fC{row}) bar_xl XLImage(f{code_val}_barcode.png) bar_xl.width 180 bar_xl.height 60 ws.add_image(bar_xl, fD{row}) wb.save(product_list_with_codes.xlsx) print(处理完成已生成新文件。)这段脚本有几个很关键的设计点box_size决定二维码的母版像素尺寸。box_size10生成出来的图片一般几百像素肉眼和扫码都完全够用如果你要放大打印到很大尺寸建议调到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。先用最顺手的方式把第一批码跑出来感受一下“数据在表格里、扫码枪对着屏幕或打印件扫一下就能识别”的完整流程。当你意识到“每次都要手动对齐、手动改格式”开始恼火时就是你该学脚本或者换专业标签软件的时候了。工具永远是为流程服务的先跑通流程再谈优化。
上一篇/下一篇内容由系统自动关联
返回资讯列表 →