web-dev-qa-db-fra.com

Quel est l'algorithme pour convertir une lettre de colonne Excel en son numéro?

J'ai besoin d'un algorithme pour convertir une lettre de colonne Excel en son bon numéro.

Le langage dans lequel cela sera écrit est C #, mais tout le monde le ferait ou même un pseudo-code.

Veuillez noter que je vais mettre cela en C # et je ne veux pas utiliser la DLL de bureau.

Pour "A", le résultat attendu sera 1

Pour 'AH' = 34

Pour 'XFD' = 16384

58
David Basarab
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;
}
107
Ian Nelson
int result = colName.Select((c, i) =>
    ((c - 'A' + 1) * ((int)Math.Pow(26, colName.Length - i - 1)))).Sum();
16
mqp
int col = colName.ToCharArray().Select(c => c - 'A' + 1).
          Reverse().Select((v, i) => v * (int)Math.Pow(26, i)).Sum();
7
wethercotes

Parcourez les caractères du dernier au premier. Multipliez la valeur de chaque lettre (A = 1, Z = 26) fois 26 ** N, ajoutez-la au total cumulé. Ma compétence de manipulation de chaînes en C # est inexistante, voici donc un pseudo-code très mélangé:

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

Voici une solution que j'ai écrite en JavaScript si quelqu'un est intéressé.

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
Jesse Puente

Pourriez-vous peut-être le traiter comme un nombre de base 26, puis substituer des lettres à un nombre de base 26?

Donc en effet, votre chiffre le plus à droite sera toujours un nombre brut compris entre 1 et 26, et le reste du "nombre" (la partie gauche) est le nombre de 26 collecté? Donc A représenterait un lot de 26, B serait 2, etc.

Par exemple:

 B = 2 = colonne 2 
 AB = 26 * 1(A) + 2 = colonne 28 
 BB = 26 * 2(B) + 2 = colonne 54 
 DA = 26 * 4(D) + 1 = colonne 105 

etc

3
Chris

Je ne suis pas très satisfait de l'une des réponses, alors voici une version courte:

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

ou mieux, pour ignorer les non A-Za-z personnages:

int col = " !$Ab$3 ".Aggregate(0, (a, c) => (uint)((c | 32) - 97) > 25 ? a : a * 26 + c & 31); // 28
1
Slai

dans Excel VBA, vous pouvez utiliser le .Range Méthode pour obtenir le nombre, comme ceci:

Dim rng as Range
Dim vSearchCol as variant 'your input column
Set rng.Thisworkbook.worksheets("mySheet").Range(vSearchCol & "1:" & vSearchCol & "1")

Utilisez ensuite .column propriété:

 debug.print rng.column

si vous avez besoin du code complet, voir ci-dessous:

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
0
V. Wolf

Je suppose que cela fonctionne essentiellement à peu près de la même manière que certaines des autres réponses, mais cela peut rendre un peu plus clair ce qui se passe avec l'équivalent alpha d'un chiffre numérique. Ce n'est pas tout à fait un système de base 26 car il n'y a pas d'espace réservé 0. Autrement dit, la 26e colonne serait "A0" ou quelque chose au lieu de Z dans la base 26. Et ce n'est pas la base 27 parce que les "alpha-gits" ne représentent pas les pouvoirs de 27. Homme, cela vous fait vraiment apprécier ce bordel l'arithmétique devait être avant que les Babyloniens n'inventent le zéro!

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

Comme certains autres, j'ai inversé le tableau de caractères, donc je n'ai pas besoin de savoir quoi que ce soit sur les exposants.

0
B H