ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 效率神器,一键搞定繁琐工作
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
让更多数据处理,一键完成 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
查看: 2456|回复: 0

excel c api 开发身份证校验码公式源代码

[复制链接]

TA的精华主题

TA的得分主题

发表于 2011-9-25 12:48 | 显示全部楼层 |阅读模式
开发工具:EXCEL 97 SDK 【Frmwrk32】
编辑工具:记事本
编译环境:Windows XP SP3,Microsoft Visual C++ 6.0,【命令行:nmake generic.mak】
适用环境:EXCEL 2003,其它的EXCEL版本未试。【=IDNCC(15、17、18位身份证号)】

EXCEL声名串:
      " IDNCC",                               // Procedure
      " RR",                                  // type_text
      " IDNCC",                               // function_text
      " ID Number",                                 // argument_text
      " 1",                                   // macro_type
      " Generic Add-In",                      // category
      " ",                                    // shortcut_text
      " ",                                    // help_topic
      " 18位新身份证校验码",// function_help
      " 15位或17位或18位身份证号码"   





__declspec(dllexport) LPXLOPER WINAPI IDNCC(LPXLOPER px)
{
static  XLOPER  xStr,xResult;
int     length,i,wm=0,wjn[]= {0,7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2};
char *jnc="10X98765432";
i=Excel(xlCoerce,(LPXLOPER)&xStr,2,px,(LPXLOPER)TempInt(xltypeStr));//强制将传进来的px转换为字符串,存于xStr中,参数为字符串或数值都可以。
if (xlretSuccess == i)//如果成功,就继续,否则说明传进的参数不是字符串型或数值型
  {
  lstrcpy(g_szBuffer, xStr.val.str);//将强制转换成功后的“字符串”拷出来。
  Excel(xlFree,0,1,(LPXLOPER)&xStr);//拷出数据后最好马上释放XLOPER,否则EXCEL有可能崩溃。
  length=(int)g_szBuffer[0];//字符串的实际长度存放于字符串的第0个字节中。
  if(length!=15 && length!=17 && length!=18)//15位:暂时认为是老身份证号,17位:暂时认为是没有校验码的新身份证号。
   {
   xResult.xltype = xltypeErr;
   xResult.val.err = xlerrValue;
   }
  else
   {
   if(length==15)//15位老身份证号,加上'19'
    {
    for(i=17;i>8;i--)
     g_szBuffer[i]=g_szBuffer[i-2];
    g_szBuffer[7]='1';
    g_szBuffer[8]='9';
    length+=2;
    }
   i=1;
   while(i<18 && g_szBuffer[i]>='0' && g_szBuffer[i]<='9')
    {
    wm+=(g_szBuffer[i]-48)*wjn[i];//位数值码*位校验码
    i++;
    }
   if(i!=18)//中间有非数字字符,提示出错
    {
    xResult.xltype = xltypeErr;
    xResult.val.err = xlerrValue;
    }
   else
    {
    g_szBuffer[0]='\1';//返回的字符串只有校验码一位字符。
    g_szBuffer[1]=jnc[wm%11];//取校验码存于待返回的数据中。
    g_szBuffer[2]='\0';//给字符串加上结束符。
    xResult.xltype = xltypeStr;
    xResult.val.str=(LPSTR)g_szBuffer;//返回计算后的校验码。
    }
   }
  }
else
  {
  xResult.xltype = xltypeErr;
  xResult.val.err = xlerrValue;
  }
return (LPXLOPER) &xResult;
}

您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-11-26 16:20 , Processed in 0.042811 second(s), 9 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

快速回复 返回顶部 返回列表