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

时间:2009-03-20 20:14:42

标签: c# excel math

我需要一种算法将Excel列字母转换为正确的数字。

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

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

对于'A',预期结果为1

对于'AH'= 34

对于'XFD'= 16384

10 个答案:

答案 0 :(得分:105)

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

答案 1 :(得分:15)

int result = colName.Select((c, i) =>
    ((c - 'A' + 1) * ((int)Math.Pow(26, colName.Length - i - 1)))).Sum();

答案 2 :(得分:7)

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

答案 3 :(得分:5)

循环显示从最后到第一个的字符。将每个字母的值(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);

答案 4 :(得分:3)

您是否可以将其视为基数为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

答案 5 :(得分:3)

如果有人感兴趣的话,这是我用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);

答案 6 :(得分:1)

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

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

答案 7 :(得分:0)

在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

答案 8 :(得分:0)

我想这基本上与其他一些答案基本相同,但它可能会更清楚地说明数字数字的α等价物是怎么回事。它不是一个基础26系统,因为没有0占位符。也就是说,第26列将是'A0'或者基础26中的Z而不是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;
  }

和其他人一样,我颠倒了字符数组,因此我不需要了解有关指数的任何内容。

答案 9 :(得分:0)

为此,我只使用一行:

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