Каков алгоритм преобразования буквы столбца Excel в ее число? - PullRequest
57 голосов
/ 20 марта 2009

Мне нужен алгоритм для преобразования буквы столбца Excel в правильное число.

Язык, на котором это будет написано, - C #, но любой будет делать или даже псевдокод.

Обратите внимание, что я собираюсь поместить это в C #, и я не хочу использовать dll для офиса.

Для «А» ожидаемый результат будет 1

Для 'AH' = 34

Для 'XFD' = 16384

Ответы [ 9 ]

105 голосов
/ 20 марта 2009
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;
}
15 голосов
/ 20 марта 2009
int result = colName.Select((c, i) =>
    ((c - 'A' + 1) * ((int)Math.Pow(26, colName.Length - i - 1)))).Sum();
7 голосов
/ 21 марта 2009
int col = colName.ToCharArray().Select(c => c - 'A' + 1).
          Reverse().Select((v, i) => v * (int)Math.Pow(26, i)).Sum();
5 голосов
/ 20 марта 2009

Перебирайте символы от последнего к первому. Умножьте значение каждой буквы (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);
3 голосов
/ 27 августа 2013

Вот решение, которое я написал на 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);
3 голосов
/ 20 марта 2009

Не могли бы вы трактовать его как число 26, а затем заменить буквы на число 26?

Таким образом, ваша самая правая цифра всегда будет необработанным числом от 1 до 26, а остаток от «числа» (левая часть) - это число из 26? Таким образом, А будет представлять один лот из 26, В будет 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

и т.д.

1 голос
/ 13 декабря 2016

Я не совсем доволен ни одним из ответов, поэтому вот короткая версия:

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
0 голосов
/ 22 августа 2016

Полагаю, это, по сути, работает так же, как и некоторые другие ответы, но может немного прояснить, что происходит с альфа-эквивалентом числовой цифры. Это не совсем система 26, потому что нет нулевого заполнителя. То есть, 26-й столбец будет «A0» или что-то вместо Z в базе 26. И это не база 27, потому что «альфа-мерзавцы» не представляют силы 27. Человек, это действительно заставляет вас ценить беспорядок арифметика должна была быть до того, как вавилоняне изобрели ноль!

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

Как и некоторые другие, я перевернул массив символов, поэтому мне не нужно ничего знать о показателях.

0 голосов
/ 19 июля 2016

в 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...