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

我需要一个algorithm来将Excel列字母转换为适当的数字。

这将被写入的语言是C#,但任何会做,甚至伪代码。

请注意,我将把这个在C#中,我不想使用办公室的DLL。

对于'A'预期的结果将是1

对于'AH'= 34

对于“XFD”= 16384

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(); 

循环遍历从最后到第一个字符。 乘以每个字母的值(A = 1,Z = 26)乘以26 ** N,加上一个正在运行的总数。 我在C#中的string操作技巧是不存在的,所以这里是一些非常混合的伪代码:

 sum=0; len=length(letters); for(i=0;i<len;i++) sum += ((letters[len-i-1])-'A'+1) * pow(26,i); 

你可能会把它看作是一个基数为26的数字,然后用一个基数为26的数字来替代字母?

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

举个例子:

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

等等

如果有人感兴趣,这是我用JavaScript写的一个解决scheme。

 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); 

我对任何答案都不满意,所以这里是一个简短的版本:

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

或更好,忽略非A-Za-z字符:

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

在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)('A' - alphagit + 1); gitVal *= 26; } 

像其他人一样,我将字符数组反转,所以我不需要知道指数的任何内容。

你们需要在广场外思考。 你不需要这样复杂的编码。 以下公式提供了相同的答案

= MID(ADDRESS(ROW(),COLUMN()); 2,FIND( “$”,ADDRESS(ROW(),COLUMN()),2)-2)

此公式将为您提供您所在的任何列的列字母。轻松适应,将参考更改为另一列。