解决的实际问题
接访时,需要登记来访人的身份证信息,包括:姓名、性别、年龄、住址、身份证号码。在纸质表格中登记完一个人需要几分钟时间,有时候人数较多的时候需要花费更多的时间完成登记。登记完后,因为手写字迹潦草的原因,不便于识别;也不便于统计、检索。
设计这么一个WPS带宏的电子表格,依托身份证阅读器(本文是高拍仪上集成的身份证阅读器),可以实现3秒钟自动读取身份证上的所有信息并输入电子表格中。
开发环境
操作系统:银河麒麟V10
WPS版本:11.8.2.11653(建议使用较新版本)
具体步骤
01 在WPS表格第一个工作表(Sheet1)中设计好表式,如下图所示:
02 Alt+F11打开WPS宏编辑器,输入以下代码。
/**
* getJson 解析JSON数据到WPS表格
*/
function getJson()
{
//设置采集的网址
const requestURL = "http://127.0.0.1:38088/card=idcard";
//设置缓存文件路径,不同WPS版本会生成不同的缓存文件夹
const tmpFile = "/tmp/wps-ht/tmp_05512cae147b468486000a4c73f8a2f4/card=idcard"
//打开源工作簿
var sourceWbook = Workbooks.Open(requestURL);
//选择源工作簿中的工作表
var sourceWsheet = sourceWbook.Sheets(1);
//复制源工作表中的所有数据,源工作表中的JSON数据默认放在A1单元格
var jsonString = sourceWsheet.Range("A1").Value2;
//解析JSON数据
var jsonObject = JSON.parse(jsonString);
//提取出身份证信息,完成解析
var obj = jsonObject.IDCardInfo;
//源工作簿已经完成解析,关闭源工作薄
sourceWbook.Close(false);
//删除缓存文件
Kill(tmpFile);
//把解析到的身份证信息输入表格B3-I3单元格
var newRowIndex = 3;
var rowRange = 360;
//逐行遍历,在空行填充解析数据
for(var i=newRowIndex; i<rowRange; i++){
//仅根据B列单元格(姓名)判断所在行是否为空
txt = Range("B"+i).Value2
//高拍仪未放入身份证时,obj为空
if(obj==null){
MsgBox("高拍仪未放入身份证,请放入身份证后再进行采集!")
return;
}
//根据B列判断所在行为空时,填充数据
if(txt==null){
//A列生成序号
Range("A"+i).Value2 = i-newRowIndex+1
//把解析到的身份证信息输入表格B到I列
Range("B"+i).Value2 = obj.name;
Range("C"+i).Value2 = obj.sex;
Range("D"+i).Value2 = obj.nation;
Range("E"+i).Value2 = obj.birthday;
Range("F"+i).Value2 = obj.address;
Range("G"+i).Value2 = obj.cardID;
Range("H"+i).Value2 = obj.issueOrgan;
Range("I"+i).Value2 = obj.validStart + "-" + obj.validEnd;
Console.log(obj.name+":信息采集完毕。");
return;
}
}
}
03 把身份证放入高拍仪(身份证阅读器),点击电子表格中“采集身份证信息”即可采集信息。
注意事项:不同的WPS版本会生成不同的缓存文件夹,请自行更改缓存文件夹路径。路径为:/tmp/wps-ht/