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

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

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

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

Для «А» ожидаемый результат будет 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 # несуществует, поэтому вот несколько очень смешанных псевдокодов:

 sum=0; len=length(letters); for(i=0;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, если кто-то заинтересован.

 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-й столбец будет «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; } 

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

  • Поворот группы векторов
  • каков самый быстрый способ найти gcd из n чисел?
  • Представление 128-битных чисел в C ++
  • Как найти GCD, LCM для набора чисел
  • Алгоритм для поиска чисел из списка размера n sum на другое число
  • Как java вычисляет модуль с отрицательными числами?
  • Лучший алгоритм для оценки математического выражения?
  • Почему gdb оценивает sqrt (3) на 0?
  • Математическая функция Java для преобразования положительного int в отрицательный и отрицательный в положительный?
  • Какое распределение вы получаете от этой случайной случайной перетасовки?
  • Поиск всех подмножеств множества
  • Давайте будем гением компьютера.