将 Excel 列字母转换为其数字的算法是什么?

我需要一个算法来转换一个 Excel 列字母到其正确的数字。

这将用 C # 语言编写,但任何代码都可以,甚至是伪代码。

请注意,我将把它放在 C # 中,我不想使用 office dll。

对于‘ A’,预期结果将是1

“ AH”= 34

对于“ XFD”= 16384

46713 次浏览

你能不能把它当作一个26进制的数字,然后用字母代替26进制的数字?

所以实际上,你最右边的数字总是1到26之间的一个原始数字,而剩下的“数字”(左边的部分)就是收集到的26的数字?所以 A 代表一批26,B 代表2,等等。

举个例子:

B = 2 = Column 2
AB = 26 * 1(A) + 2 = Column 28
BB = 26 * 2(B) + 2 = Column 54
DA = 26 * 4(D) + 1 = Column 105

等等

从最后一个字符到第一个字符循环。将每个字母(A = 1,Z = 26)的值乘以26 * * N,得到运行总数。我在 C # 中的字符串操作技能是不存在的,所以这里有一些非常复杂的伪代码:

sum=0;
len=length(letters);
for(i=0;i<len;i++)
sum += ((letters[len-i-1])-'A'+1) * pow(26,i);
public static int ExcelColumnNameToNumber(string columnName)
{
if (string.IsNullOrEmpty(columnName)) throw new ArgumentNullException("columnName");


columnName = columnName.ToUpperInvariant();


int sum = 0;


for (int i = 0; i < columnName.Length; i++)
{
sum *= 26;
sum += (columnName[i] - 'A' + 1);
}


return sum;
}
int result = colName.Select((c, i) =>
((c - 'A' + 1) * ((int)Math.Pow(26, colName.Length - i - 1)))).Sum();
int col = colName.ToCharArray().Select(c => c - 'A' + 1).
Reverse().Select((v, i) => v * (int)Math.Pow(26, i)).Sum();

如果有人感兴趣的话,这里有一个我用 JavaScript 写的解决方案。

var letters = "abc".toUpperCase();
var sum = 0;
for(var i = 0; i < letters.length;i++)
{
sum *= 26;
sum += (letters.charCodeAt(i) - ("A".charCodeAt(0)-1));
}
alert(sum);

在 Excel VBA 中,您可以使用 .Range方法来获得数字,如下所示:

Dim rng as Range
Dim vSearchCol as variant 'your input column
Set rng.Thisworkbook.worksheets("mySheet").Range(vSearchCol & "1:" & vSearchCol & "1")

然后使用 .column属性:

 debug.print rng.column

如果你需要完整的代码,请看下面:

Function ColumnbyName(vInput As Variant, Optional bByName As Boolean = True) As Variant
Dim Rng As Range
If bByName Then
If Not VBA.IsNumeric(vInput) Then
Set Rng = ThisWorkbook.Worksheets("mytab").Range(vInput & "1:" & vInput & "1")
ColumnbyName = Rng.Column
Else
MsgBox "Please enter valid non Numeric column or change paramter bByName to False!"
End If


Else
If VBA.IsNumeric(vInput) Then
ColumnbyName = VBA.Chr(64 + CInt(vInput))
Else
MsgBox "Please enter valid Numeric column or change paramter bByName to True!"
End If


End If
End Function

我猜这个结果和其他一些答案基本相同,但是它可能会更清楚地表明,阿尔法等价的数字到底是怎么回事。它不完全是一个以26为基数的系统,因为没有0占位符。也就是说,第26列应该是‘ A0’之类的,而不是以26为基数的 Z。它不是27进制,因为“ alpha-gits”不代表27的幂。伙计,这真的让你意识到在巴比伦人发明零之前算术是多么的混乱!

  UInt32 sum = 0, gitVal = 1;
foreach (char alphagit in ColumnName.ToUpperInvariant().ToCharArray().Reverse())
{
sum += gitVal * (UInt32)(alphagit - 'A' + 1)
gitVal *= 26;
}

和其他人一样,我反转了字符数组,所以我不需要知道任何关于指数的东西。

简短版:

int col = "Ab".Aggregate(0, (a, c) => a * 26 + c & 31);  // 28

忽略非 A-Za-z字符:

int col = " !$Af$3 ".Aggregate(0, (a, c) => (uint)((c | 32) - 'a') > 25 ? a : a * 26 + (c & 31)); // 32

为此,我只用了一句话:

int ColumnNumber = Application.Range[MyColumnName + "1"].Column;

对于那些对 c + + 实现感兴趣的人,这里有一个基本的 c + + 答案。

int titleToNumber(string given) {
int power=0;
int res=0;
for(int i=given.length()-1;i>=0;i--)
{
char c=given[i];
res+=pow(26,power)*(c-'A'+1);
power++;
}
return res;
}