因为要将数量,转为26个字母的位。下面的代码,下列不多的时候就可行,但如果数量大的时候,就出问题了。。如何改进,请问。。(主要是用于EXCEL2007中,以数字来定位列名。。)
// 1->A; 52->AZ; 500->...
function ItoA(val:integer):string;
var f1:integer;
    f2:integer;
begin
   // val / 52
   f1 := val mod 26; //取余
    f2 := val div 26;//取整
    if (f1 = 0 ) then
    begin
       f1 := 26;
       f2 := f2 - 1;
    end;    {if f2>26 then
        f2:=f2 mod 26;}   if (f2 = 0 ) then
   begin
      Result := chr(64 + f1);
   end
   else
   begin
      Result := chr(64 + f2 ) + chr(64 + f1 );
   end;
end;

解决方案 »

  1.   


    function GenerateLetter(number:integer):string;
    var
      letter:string;
    begin
      //
      case number of
       0: letter := 'Z';
       1: letter := 'A';
       2: letter := 'B';
       3: letter := 'C';
       4: letter := 'D';
       5: letter := 'E';
       6: letter := 'F';
       7: letter := 'G';
       8: letter := 'H';
       9: letter := 'I';
       10: letter := 'J';
       11: letter := 'K';
       12: letter := 'L';
       13: letter := 'M';
       14: letter := 'N';
       15: letter := 'O';
       16: letter := 'P';
       17: letter := 'Q';
       18: letter := 'R';
       19: letter := 'S';
       20: letter := 'T';
       21: letter := 'U';
       22: letter := 'V';
       23: letter := 'W';
       24: letter := 'X';
       25: letter := 'Y';
       end;
       result:= letter;
    end;function ChangeNumber(columnNum:integer):string;
    var
      i,j:integer;
      k:string;
      columnName:string;
    begin
      i := columnNum div 26;
      j := columnNum mod 26;
      if i = 0 then
        columnName := GenerateLetter(j)
      else
      begin
        k := GenerateLetter(j);
        columnName := ChangeNumber(i) + k;
      end;
      result:= columnName;
    end;
      

  2.   

    帮你改了一下function ItoA(val:integer):string;
    var f1:integer;
        f2:integer;
    begin
       // val / 52
       f1 := val mod 26; //取余
        f2 := val div 26;//取整
        if (f1 = 0 ) then
        begin
           f1 := 26;
           f2 := f2 - 1;
        end;    {if f2>26 then
            f2:=f2 mod 26;}   if (f2 = 0 ) then
       begin
          Result := chr(64 + f1);
       end
       else if f2 > 26 then
          Result := ItoA(f2) + chr(64 + f1)
       else
       begin
          Result := chr(64 + f2 ) + chr(64 + f1 );
       end;
    end;另外:Excel能处理的最大列数是256,你原来的算法已经可以满足要求了。
      

  3.   


    function IToA(Value: Integer): String;
    begin
      Result := '';
      repeat
        dec(Value);
        Result := chr(Value mod 26 + ord('A')) + Result;
        Value := Value div 26;
      until Value = 0;
    end;
      

  4.   


    回楼上的几位,不是的。。我用的是OFFICE 2007 ,有16000多列。。不是256列而我的数据确实要拉很他,有一万列吧。。
      

  5.   

    MSDN应该有现成的,找找看前一段时间还写过的,但记不得是不是2007那么多列了
    回头再找一下~
      

  6.   

    就算Office 2007有16000列,那我改过的那个也是支持的.