Excel里数字列号转换为字符标签列

在进行数据库导出到Excel时,常会用到将列,如 第1列转换为 A,第2列转换为 B 的情况。这时你就要写算法了。

哈哈,我这里有现成的了。

先上代码,后解析。

  function CellToRef(const X,Y:Integer):string;
    function GetRef(const X:Integer):string;
    var
      token,I,R:Integer;
    begin
      Result:='';
      token:=X;
      repeat
        I := token div 26;
        R := token mod 26;
        if R <> 0 then
        begin
          Result:=Char(R + 64) + Result;
        end
        else if I > 0 then
        begin
          Result := 'Z' + Result ;
          Dec(I);
        end;
        token := I;
      until I = 0;
    end;
  begin
    Result:= GetRef(X) + IntToStr(Y);
  end;

代码使用Delphi编写,等会我解析完算法,就可以换成其它语言了编写了。

函数 CellToRef有两个参数,X表示列号,Y表示行号,返回类型为字符串,如: CellToRef(1,1) 返回为 A1 。当然,这里的X,Y是从0开始还是从1开始要你自己界定。

内嵌函数GetRef有一个参数,X表示列号,当然在delphi,做为内嵌函数,这个参数是可以省掉的。返回值为字符串,功能为将一个数字列号转为相应的字符列号表示。如:GetRef(1)返回为 A。

算法解析:          我们知道英文字符有26个。即,A-Z(不使用小写形式的)。所以,对给写的数字X进行26进制的比较,

即取整(I := token div 26;)与取余(R := token mod 26;)。之后判断是否整除,即:R = 0;如果没有整除,那么这个余数就做为结果中的一个字符了(Result:=Char(R + 64) + Result; 其中Char(R+64)为将数字+64之后转为英文字母)。如果可以整除,那么向结果中输出 Z (Result := 'Z' + Result ;) ,同时把数字X减去1(Dec(I));之后继续执行上述操作直到完全整除为止。

OK,结束了。

原文地址:https://www.cnblogs.com/goldli/p/2417449.html