|
开发工具: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;
}
|
|