因为要将数量,转为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->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;
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;
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,你原来的算法已经可以满足要求了。
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;
回楼上的几位,不是的。。我用的是OFFICE 2007 ,有16000多列。。不是256列而我的数据确实要拉很他,有一万列吧。。
回头再找一下~