EXCEL列序号的加法

来源:互联网 发布:日本体育课运动服 淘宝 编辑:程序博客网 时间:2024/06/06 03:15

朋友有一个简单的需求,就是对EXCEL上的表头进行加法,以定位到具体位置,

具体如下:

  A+1=B,Z+A=AA,AZZ+1=BAA

由与是A~Z,考虑使用26进制,唯一不能使用的是0  因为excel上列的范围是 A~XFD

 

闲来无事,就写了一下,顺便没有考虑最大为XFD的范围,代码实现如下

 

// 进制转换  A~Z字符转换为10进制
long Convert(CString &str)
{
      long lLength = str.GetLength();
      long lData(0),lTotal(0);
      for(long i=0;i<lLength;++i)
      {
             lData = str[i] - _T('A')+1;   //最小值不能为0,因此设置为1
             lTotal = lTotal *26+lData;
      }
      return lTotal;
}

//10进制转换为 A~Z字符
void Convert(CString& strDest,long lNum)
{

       strDest.Empty();
       long lM(0);
       if(lNum==0)
              strDest = _T('A');
       else if(lNum<0)
              return ;
  
       TCHAR chData;
       while(lNum!=0)
       {
              lM = lNum%26;
              lNum = lNum/26;
              if(lM==0) //由于'Z'就是第26,这里采取直接赋值,并且不能进位。
             {
                    chData =  _T('Z');
                    lNum -= 1;
             }
            else
                    chData = _T('A') + lM-1;   //之前最小值设置为1了,这里要减去1
            strDest.Insert(0,chData);
       }
 
}
void GetAddString(CString& strDest,CString &strSrc,long lNum)
{
      long lTotal = Convert(str);
      lTotal += lNum;
      Convert(strDest,lTotal);
}  

 

测试用例里面可以直接使用 GetAddString

int main()

{

        CString str1(_T("AZZ"));

        CString str2(_T("AA"));

        CString  strDest;

       GetAddString(strDest,str1,1);                       //AZZ+1    结果为BAA

        GetAddString(strDest,str1,Convert(str2));   //AZZ+AA      结果为BBA

        return 0;

}

 

 

0 0
原创粉丝点击