在项目开发过程中,遇到一个需求,需要将大量商品信息存储到excel中,供用户下载。其中商品的upc字段需要是条形码,以方便用户用扫码枪扫描。常见的方案是将upc转换为条形码的图片。但在项目中发现, 当商品的数量为数千时,会因为文件太大而无法下载。考虑到可以在客户端安装一些条码字体,从而在服务端就无须生成条形码图片,即使商品数量为数千,其下载文件也很小。利用Code128字体将文本转换为code128条形码一文中提到可以通过在客户端提供Code128这种字体的方式来产生条形码,不过提到了直接将原文转换成Code128字体无法被扫码枪扫描。
经过本人亲测,在Excel中,直接将原文转换成Code128,使用项目组的扫码枪确实不能解析。不过奇怪的是,我使用微信进行扫码,是能够正常解析的。为了进一步搞清楚这个问题,本人还进行了测试,在一些免费的条形码再线生成网站(如 在线免费生成条码)上生成的编码为Code128的条形码,使用项目组的扫码枪是能解析的!!!仔细对比了Excel生成的Code128条形码和网站生成的Code128条形码,确实长得不一样。综上,可以得出结论:Excel生成的条形码并非不能解析,取决于扫码枪是否支持,并非Excel生成的Code128条形码有问题!!!
不过,到此依然没能解决项目组遇到的问题。利用Code128字体将文本转换为code128条形码一文中提到,可以通过先将原文经过一次编码再使用Excel的Code128字体进行编码,即可被扫码枪识别。不过,博客中使用的是C#语言实现的,本文给出其对应的Java版如下:
Code128A
public String getCode128A(String inputData)
{
int checksum = 103;
for (int ii = 0; ii < inputData.length(); ii++)
{
if (inputData.charAt(ii) >= 32)
{
checksum += (inputData.charAt(ii) - 32) * (ii + 1);
}
else
{
checksum += (inputData.charAt(ii) + 64) * (ii + 1);
}
}
checksum = checksum % 103;
if (checksum < 95)
{
checksum += 32;
}
else
{
checksum += 100;
}
return (char) (203) + inputData + (char)(checksum) + (char) (206);
}
Code128B
public String getCode128B(String inputData)
{
int checksum = 104;
for (int ii = 0; ii < inputData.length(); ii++)
{
if (inputData.charAt(ii) >= 32)
{
checksum += (inputData.charAt(ii) - 32) * (ii + 1);
}
else
{
checksum += (inputData.charAt(ii) + 64) * (ii + 1);
}
}
checksum = checksum % 103;
if (checksum < 95)
{
checksum += 32;
}
else
{
checksum += 100;
}
return (char)(204) + inputData + (char) checksum + (char)(206);
}
Code128C
public static String getCode128C(String inputData)
{
String result = "";
int checksum = 105;
int j = 1;
for (int ii = 0; ii < inputData.length(); ii++)
{
if (ii % 2 == 0)
{
checksum += Integer.parseInt(inputData.substring(ii, 2)) * j;
if (Integer.parseInt(inputData.substring(ii, 2)) < 95)
{
result += (char)(Integer.parseInt(inputData.substring(ii, 2)) + 32);
}
else
{
result += (char)(Integer.parseInt(inputData.substring(ii, 2)) + 100);
}
j++;
}
ii++;
}
checksum = checksum % 103;
if (checksum < 95)
{
checksum += 32;
}
else
{
checksum += 100;
}
result = (char)(205) + result + (char)(checksum) + (char)(206);
return result;
}
读者可以使用以上Code128的以上三种具体的编码方式进行尝试。非常可惜的是,本人使用这种方式,项目组的扫码枪仍然不能识别!!!只能另寻出路。
最后在参考博客 EXCEL中实现将数字转为条形码中找到了新的编码方式:Code39。经过对比,选择了C39HrP72DmTt这种具体的编码方式,支持字符和数字,能满足绝大多数场景,且生成的条形码非常短。不过,最最重要的还是,我们项目组的扫码枪能识别!!!
参考博客:
1. https://www.cnblogs.com/qq458978/p/7677832.html 利用Code128字体将文本转换为code128条形码(C#版)
2. http://apps.99wed.com/360app/barcode/ 条形码生成器
3. http://gaoqiancheng.blog.sohu.com/301723626.html EXCEL中实现将数字转为条形码
4. https://barcode.tec-it.com/zh/Code128 在线免费生成条码
5、https://www.cnblogs.com/bluekang/p/13438666.html EasyExcel注解