|||
更新: 提供Access解决办法的样例.2017-12-20
Office还有一个自带的只支持英文与数字的microsoft barcode control 可用,但不支持中文有点鸡肋. 2017-1-22
整理完成之后发现,原来自己一直在走一个弯路,几次折腾的本质,就是不断改进二维码传递信息的方法,结果是找到了VCARD这种格式,QR Maker这个控件,学习了下在Office中利用ActiveX控件. 2017-1-10
更新内容: 找到一个ActiveX控件可以用来生成二维码. QRmaker 1.3 for VB6, 可以用于Office2016的EXCEL或ACCESS中. 于是研究了下这个控件的使用,在ACCESS中实现了这个功能(EXCEL中当然也可以),于是更新了下本文内容.在没有Label Matrix的机子上也可以实现,不过要编程. 2017-1-4
这个与化学不相关,也不知道该怎么归类博文,就算是资讯吧。
对我来说颇有价值,因为避免了大量输入电话号码与名字,省了不少时间。当然,想出这个办法也花了一些时间,中间还走了点小小的弯路,不过搞定之后还是蛮好用的。
我是这样想的,既然手机里名片扫描软件扫一下就可以给通讯录增加名片,如果我将电脑上的名字-电话信息,设计成名片样式,伪装成一张名片,让“全能名片王”这样的软件直接扫描进去识别一下就可以了,不是省了很多输入的手续了吗? 于是动手做了一下实验,用LabelMatrix设计一个名片样子,输入各字段的信息,在屏幕上显示了"伪名片",用手机上的"全能名片王"对屏幕扫描测试其效果.遗憾的是,扫描电脑屏幕的识别率很差。估计是这个软件专门针对名片做了优化,对不是名片的反而识别不好。
后来想到,现在的做法相当于是"文本→图像→(OCR转化)文本"这种路径,有点走弯路了.我能不能绕开OCR这条路径,直接把名片信息做成二维码,让"全能名片王"扫描进去呢? 也就是走"文本→二维码编码→(二维码识别还原)文本"这条路径.
这里要解决一个问题,即名字/电话这种信息应该以哪种格式传递给名片扫描软件? 我第一个想到的就是Vcard格式, 名片软件应该能够支持这种常用的地址簿文件的格式。于是专门下篇文章学习了一下Vcard的文件格式,找个模板修改一下,把这个数据复制到LabelMatrix中,选择合适的模式来生成二维码,再扫描一下看看结果如何。果然,这样做是行得通的。
但是全能名片王有个Bug,中文的二维码被它扫描之后,得到的是日文,乱码了(电话号码倒是对的),这个困扰了我很久,后来用微信来试一试扫描二维码,效果奇佳,速度又快又好,这条路才算是走通了。
实现的方法是这样的(不用学,下面有更简单的方案),
1.先将通讯录的数据(Excel文件)导入到Access,整理之后,储存到MDB格式的文件中。原因是LabelMatrix2014在我的电脑上只能认识这种格式(其它数据访问方式NG,DBF文件又太老)。
2.用LabelMatrix设计一个二维码标签,只要二维码这个块即可。二维码的控件数据源采用公式,将Vcard格式的内容作为文本,内部嵌入数据库的字段名(即内容的变量)。这个操作比较复杂,需要耐心,好在LM有很好的提示。我的文本是这样的,里面的Left,mid函数与EXCEL里面的用法一样,+号用于字串的连接,"\r\n"是换行的意思,C语言编程的兄弟都知道。
二维码控件的设置如下图
二维码控件的 属性-数据-来源中选择为"公式", 在下面的"表达式"文本框中设置内容如下:
"BEGIN:VCARDrnVERSION:3.0\r\nN:" + Left([通讯录主表.姓名], 2) +"; "+mid([通讯录主表.姓名],3,4) +"\r\n
TITLE: " + [通讯录主表.部门]+"\r\nTEL;TYPE=CELL:" + [通讯录主表.手机号]+"\r\n TEL;TYPE=WORK: "+[通讯录主表.短号] +"\r\nTEL;TYPE=HOME:"+[通讯录主表.其它号码]+"\r\nEMAIL: " + [通讯录主表.电子邮箱]+"\r\nNOTE: 入职时间: " + [通讯录主表.入职时间] + if(len([通讯录主表.备注])," 备注:"+[通讯录主表.备注],"") +"\r\nEND:VCARD"
这里值得多说几句的是,我没有找到微信对VCARD支持哪些字段的说明。试验表明,TEL(电话),EMAIL,NOTE(备注),TITLE这些还是支持的。如果有多个电话,注意类型不要冲突(比如两次都用TEL;TYPE=CELL:电话号码这种表达,前面的电话号码就被丢掉了,如果另一个换成TEL;TYPE=HOME:电话号码2则没有问题)。如果要在电话中导入备注内容,用NOTE字段就行,形式是"\r\nNOTE:备注内容XXXXX".
另外,LabelMatrix 2014中对函数的支持比较有限,它提供了一套函数可用,但函数好象不支持嵌套,例如在IF函数中嵌套LEN(某字段)>0 这种判断表达式,它就显示出错.这一点比较遗憾。所以上述例子中我直接用LEN()函数的结果来表示True/False,以实现有备注时显示 "备注:XXX",没有的时间不要出现"备注:"这样的多余内容. 下面就是一个示例,你可以用微信的"扫一扫"的功能试试看:
3. 打开LM的数据网格,LM会自动根据当前记录内容(或利用公式生成的内容)来设定二维码,用微信一扫,得到内容,再新增到联系人,按确定即可。 这个简单,一条记录熟练操作之后只需要5秒钟左右就可以到手机上了,最大的好处是不出差错,不用再输入名字/电话号码这种重复操作。(LM的二维码本身就是带纠错的)。
我也花了点时间来测试了苹果商店中可供下载的二维码扫描软件10多个,介绍里面个个好象都是多面手甚至无所不能,但实际测试发现,扫描的结果都远不如微信做得好,有的能识别内容但出现乱码,有的扫出来VCARD内容却不知道处理到通讯录,还有的干脆无法识别,一帮吹水的家伙。而独微信的扫描识别度高,不出现乱码,还能够正确理解VCARD内容并提供导入通讯录的功能,确实很适合我的用途。
其实,这里面Label Matrix 起到了作用只是将文本转化为二维码.当然也可以用其它二维码生成的工具来实现这个目标. 我找了一个ActiveX控件QRmaker1.3 for vb6, 在EXCEL或ACCESS中使用这个控件来生成二维码,再用微信来输入,结果证明也是行得通的.详细的步骤这里就不展开了,有两点注意事项 1.要以管理员身份运行cmd, 再在cmd命令中运行Regsvr32.exe qrmaker.ocx才能成功注册控件. 2.可以借助ACCESS2016新增的计算字段可以用来合成VCARD信息块, 也可以直接用VBA代码来合成.
用计算字段来合成的作法,让我困惑的是,我没有找到在表达式中如何表示换行符的方法,只好在使用前用Replace函数将\r\n替换成chr(13)&chr(10)(补充说下,如果只有chr(13) 一个字符结果也不能正确识别,可能是微信处理的问题,所以要有两个字符). qrmaker.ocx不认识\r\n这种转义符(或者说他直接按字面输出二维码没有转义导致后面微信识别不正确).另外, ACCESS2016的计算字段容错能力好象很差,如果有一条记录的某字段无内容则整个表达式无法输出,这个对数据记录的要求比较高.因此需要用IIF函数加IsNull函数过滤处理一下.因此并不推荐.
还是用VBA来合成VCARD信息块合适,使用起来很自由,在代码中直接用vbCrLf即可.
ACCESS中实现的主要代码如下
做出来的窗体是这样的.
这两种输出二维码的方式各有优劣,前者要装有LM软件,后者不需要但要安装免费控件并简单编程.
如果不想使用QRMaker控件,EXCEL中还有一个叫Microsft Barcode control 的控件可用,在EXCEL 2016中显示的是16.0版本,但控件中信息显示14.0版,用于处理英文和数字还可以,但是不能处理中文.这个在用到中文的二维码中就不够好用了,很遗憾. (update on 2017-1-22)。
当我更新到Office2016 64位的时候,很遗憾这个QRMaker控件也不能使用了,因此需要这一功能的用户请使用32位的Office。(update on 2017-6-14)
如果你和我一样,Office是64位,QRMaker不能用了,还有一个办法,用Bartender帮你忙,不过这个比较麻烦一些,参见后面我的博文.(2018-4-4)
4. 最后,如果你的手机导入了很多通讯电话,为防止遗失,可以再用QQ手机助手将它们备份到云,就更可靠了。将来换手机了要导入也就是分分钟的事,还可跨系统(IOS/安卓)导数据。
是为自己备忘.
Archiver|手机版|科学网 ( 京ICP备07017567号-12 )
GMT+8, 2024-11-14 09:26
Powered by ScienceNet.cn
Copyright © 2007- 中国科学报社