Хобрук: Ваш путь к мастерству в программировании

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

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

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

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

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

Для 'AH' = 34

Для 'XFD' = 16384

20.03.2009


Ответы:


1

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

2

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

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

так далее

20.03.2009
  • Не могли бы вы относиться к нему как к числу 26 с основанием. Это не должно сработать, потому что в вашей предлагаемой системе счисления отсутствует ноль. Но взгляд на ваш пример дает мне идею, которую я вставлю в код в своем ответе. 22.08.2016
  • @BH - в контексте вопроса в этом нет необходимости - в Excel нет нулевого столбца (вопрос в том, каков алгоритм преобразования буквы столбца Excel в его номер?). Сказав это, выше есть еще лучшие ответы :) 23.08.2016

  • 4

    Укороченная версия:

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

    Чтобы игнорировать символы, отличные от A-Za-z:

    int col = " !$Af$3 ".Aggregate(0, (a, c) => (uint)((c | 32) - 'a') > 25 ? a : a * 26 + (c & 31)); // 32
    
    13.12.2016
  • Второй пример, который игнорирует символы, отличные от A-Za-z, возвращает неправильный индекс столбца для столбцов AF и выше ... Например, для ячейки AF1 должно быть возвращено 32, но результат равен 0. 11.12.2020

  • 5

    в 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
    
    19.07.2016

    6

    Я предполагаю, что это по сути работает почти так же, как некоторые другие ответы, но может немного прояснить, что происходит с альфа-эквивалентом числовой цифры. Это не совсем система с основанием 26, потому что в ней нет заполнителя 0. То есть, 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;
      }
    

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

    22.08.2016

    7
  • Использование Math.Pow на самом деле не лучшая идея (проблемы с плавающей запятой, производительность ...) Используйте 'sum * = 26; sum + = (characters [i] -'A' + 1); ' 21.03.2009
  • Мне любопытно, для чего нужен массив символов? Кажется, он работает путем индексации непосредственно в строку с помощью: sum + = (columnName [i] - 'A' + 1) 24.07.2013
  • Всем, у кого возникают проблемы с правильной работой вышеуказанного, или кому это нужно в PHP: ideone.com/rE2xi4 < / а> 28.10.2015
  • Я работаю с Open XML SDK 2.0 и думаю, что UInt32 может быть более подходящим типом возвращаемого значения, чем int. 22.08.2016

  • 8
  • Идеально. Мне потребовалось время, чтобы понять, почему вы меняли направление (это потому, что BB выше, чем AZ). И вы избежите ошибки, связанной с длиной одного символа, с которой сталкивались другие, используя индекс. 22.09.2009
  • Новые материалы

    Расистский и сексистский робот, обученный в Интернете
    Его ИИ основан на предвзятых данных, которые создают предрассудки. Он словно переходит из одного эпизода в другой из серии Черное зеркало , а вместо этого представляет собой хронику..

    Управление состоянием в микрофронтендах
    Стратегии бесперебойного сотрудничества Микро-фронтенды — это быстро растущая тенденция в сфере фронтенда, гарантирующая, что удовольствие не ограничивается исключительно бэкэнд-системами..

    Декларативное и функциональное программирование в стиле LINQ с использованием JavaScript с использованием каррирования и генератора ...
    LINQ - одна из лучших функций C #, которая обеспечивает элегантный способ написания кода декларативного и функционального стиля, который легко читать и понимать. Благодаря таким функциям ES6,..

    Структуры данных в C ++ - Часть 1
    Реализация общих структур данных в C ++ C ++ - это расширение языка программирования C, которое поддерживает создание классов, поэтому оно известно как C с классами . Он используется для..

    Как я опубликовал свое первое приложение в App Store в 13 лет
    Как все началось Все началось три года назад летом после моего четвертого класса в начальной школе. Для меня, четвертого класса, лето кажется бесконечным, пока оно не закончится, и мой отец..

    Что в лицо
    Очерк о возвращении физиогномики и о том, почему мы должны это приветствовать. История начинается со странной науки. Р. Тора Бьорнсдоттир, Николас О. Рул. Видимость социального класса по..

    Почему шаблоны проектирования и почему нет?
    Сложность — мать всех проблем в программировании. Программное обеспечение должно быть разработано с точки зрения того, кто его поддерживает, а не того, кто его пишет, потому что программное..