小编一直在思考一个问题, 我们的JS宏代码只能一表用,使用十麻烦,当一个工作薄的代码要完成一个工作薄的工作任务,无法像office 脚本那样,写一个脚本代码可以十分方便多表使用。于是,想了一个办法,试着写了一段代码,复制过来就可以使用,智能识别字段,填充到指定列中去。以下一段身份证信息提取的代码。代码中分别使用了,replace()方法去除身份证前后的空字符串,因为从网页下载下来的身份证码是带有空字符的,这是小编长期工作中获得经验。所以在对身份证信息提取,判断身份证是否正确,事先对空字符串进行了处理。 代码解释: 1、toString()方法,将数字转为文本字符。 2、test() 方法用于检测一个字符串是否匹配某个模式。 3、substr() 方法可在字符串中抽取从 开始 下标开始的指定数目的字符。。 4、split() 方法用于把一个字符串分割成字符串数组。 5、substring(beginIndex,endIndex ) 方法返回字符串的子字符串。 beginIndex -- 起始索引(包括), 索引从 0 开始。 endIndex -- 结束索引(不包括)。 6、testid(id)是一个带参函数,以便调用。 //身份证校验及信息获取函数 function testid(id) { //校验身份证号码长度 if(id==undefined){ juDge=false; reText="所检验值为空" return; }else{ id=id.toString() id=id.replace(/(^\s*)|(\s*$)/g,"") //去除空格 } if (!(id.length==18)){ juDge=false; reText="长度不合法" return; } // 1 "验证通过!", 0 //校验不通过 // id为身份证号码 var format = /^(([1][1-5])|([2][1-3])|([3][1-7])|([4][1-6])|([5][0-4])|([6][1-5])|([7][1])|([8][1-2]))\d{4}(([1][9]\d{2})|([2]\d{3}))(([0][1-9])|([1][0-2]))(([0][1-9])|([1-2][0-9])|([3][0-1]))\d{3}[0-9xX]$/; //号码规则校验 if(!format.test(id)){ juDge=false; reText="不合法"; return; } //区位码校验 //出生年月日校验 前正则限制起始年份为1900; year = id.substr(6,4),//身份证年 month = id.substr(10,2),//身份证月 date = id.substr(12,2),//身份证日 time = Date.parse(month+'-'+date+'-'+year),//身份证日期时间戳date now_time = Date.parse(new Date()),//当前时间戳 dates = (new Date(year,month,0)).getDate();//身份证当月天数 if(time>now_time||date>dates){ juDge=false; reText="不合法" return; } //获取性别 sex=id.substr(16,1)%2 //获取区划代码 qhNumber=id.substr(0,6) //校验码判断 var c = new Array(7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2); //系数 var b = new Array('1','0','X','9','8','7','6','5','4','3','2'); //校验码对照表 var id_array = id.split(""); var sum = 0; for(var k=0;k<17;k++){ sum+=parseInt(id_array[k])*parseInt(c[k]); } if(id_array[17].toUpperCase() != b[sum%11].toUpperCase()){ juDge=false; reText="不合法" return; }else{ juDge=true; reText="合法" return; } } //年龄计算 function age(id,todayDate){ id=id.toString() id=id.replace(/(^\s*)|(\s*$)/g,"") //去除空格 year = id.substr(6,4),//身份证年 month = id.substr(10,2),//身份证月 date = id.substr(12,2),//身份证日 //获取当前年月日并计算年龄 toYear =todayDate.substring(0,4); toMonth=todayDate.substring(4,6); toDate =todayDate.substring(6,8); Age =toYear - year; if(toMonth <month|| (toMonth == month && toDate <date)){ Age-- } } 这段代码正式调用了以上自定义函数。 代码解释: 1、indexOf() 方法可返回某个指定的字符串值在字符串中首次出现的位置。如果没有找到匹配的字符串则返回 -1。 indexOf() 方法区分大小写。使用这种方法自动判断身份证号码所在的列,要填充的出生日期,性别,年龄或区域代码等字段所在的列。 2、reText=="合法"?id.Interior.ColorIndex=xlColorIndexNone:id.Interior.ColorIndex=7是一个三元表达式,如何身份证号码合法则单元格背影为白色,否则为粉红色。 3、Offset(Row,Column)方法为单元格偏移,参数Row为偏移的行数,Colunn为偏移的列数。 //信息填充 function 身份证身份证填充表格(){ Sheets("数据表").Activate(); rngArr=Range('a1',Range('zz1').End(xlToLeft)) todayDate=InputBox("请输入年龄计算结束日期:格式如“20220831”") var dateColumn=0 var sexColumn=0 var ageColumn=0 var IDColumn=0 for(var IDstr of rngArr){ //Range().Columns if(IDstr.Value2.indexOf("出生日期")>-1 || IDstr.Value2.indexOf("出生年月")>-1){ var dateColumn=IDstr.Column } if(IDstr.Value2.indexOf("性别")>-1){ var sexColumn=IDstr.Column } if(IDstr.Value2.indexOf("年龄")>-1){ var ageColumn=IDstr.Column } if(IDstr.Value2.indexOf("身份证")>-1 && IDstr.Value2.indexOf("类型")<0){ var IDColumn=IDstr.Column } } IdArr=Range(Cells(2,IDColumn),Cells(9999,IDColumn).End(xlUp)) Console.log(IdArr.length) for(var id of IdArr){ if(id.Row>1){ testid(id.Value2) reText=="合法"?id.Interior.ColorIndex=xlColorIndexNone:id.Interior.ColorIndex=7 IDstr.Value2.indexOf("身份证")>-1 && IDstr.Value2.indexOf("类型")<0 if(dateColumn!=0){ reText=="合法"?id.Offset(0,dateColumn-IDColumn).Value2=year+month+date:"" } if(sexColumn!=0){ reText=="合法"?id.Offset(0,sexColumn-IDColumn).Value2=sex:"" } if(ageColumn!=0){ age(id,todayDate) reText=="合法"?id.Offset(0,ageColumn-IDColumn).Value2=Age:"" } } } } |
|
来自: 优美的代码 > 《WPS JS宏基础与实践》