Каков алгоритм преобразования буквы столбца Excel в его номер?

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

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

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

Для "A" ожидаемый результат будет 1

Для 'AH' = 34

Для "XFD" = 16384

Ответ 1

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

Ответ 2

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

Ответ 3

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

Ответ 4

Прокрутите символы от последнего до первого. Умножьте значение каждой буквы (A = 1, Z = 26) раз 26 ** N, добавьте к общей сумме. Мой навык манипуляции с строкой в ​​С# несуществует, поэтому вот несколько очень смешанных псевдокодов:

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

Ответ 5

Не могли бы вы относиться к нему как к базовому номеру 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

и т.д.

Ответ 6

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

Ответ 7

Я не очень доволен ни одним из ответов, так что вот короткая версия:

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

Ответ 8

в 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

Ответ 9

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

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

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

Ответ 10

Вам, ребята, нужно думать за пределами площади. Вам не нужно такое сложное кодирование. Следующая формула дает тот же ответ

= MID (АДРЕС (СТРОКА(), Column()), 2, FIND ( "$", адрес (СТРОКА(), Column()), 2) -2)

Эта формула даст вам буквы столбцов для любого столбца, в котором вы находитесь. Легко адаптируется для изменения ссылки на другой столбец.