76 votes

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

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

Le langage utilisé est le C#, mais n'importe quel langage ou même un pseudo-code conviendrait.

Veuillez noter que je vais réaliser ce projet en C# et que je ne veux pas utiliser la dll d'office.

Pour "A", le résultat attendu est de 1.

Pour 'AH' = 34

Pour 'XFD' = 16384

7 votes

Pour l'inverse (du numéro à la colonne-lettre), voir : stackoverflow.com/questions/181596/

128voto

Ian Nelson Points 20020
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;
}

7 votes

L'utilisation de Math.Pow n'est pas la meilleure idée (problèmes de virgule flottante, de performances...) Utilisez 'sum*=26;sum+=(caractères[i] -'A'+1);'.

0 votes

Je suis curieux, quel est le but du tableau des caractères ? Il semble fonctionner en indexant directement dans la chaîne avec : sum += (columnName[i] - 'A' + 1)

1 votes

A tous ceux qui ont des problèmes pour faire fonctionner ce qui précède correctement, ou qui ont besoin de cela en PHP : ideone.com/rE2xi4

18voto

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

13voto

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

0 votes

Parfait. J'ai mis un moment à comprendre pourquoi vous inversiez (c'est parce que BB est plus élevé que AZ). Et vous évitez le bug de la longueur d'un caractère que d'autres ont rencontré en utilisant l'index.

4voto

Jesse Puente Points 11

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

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

3voto

Chris Points 2224

Pourriez-vous peut-être le traiter comme un nombre en base 26, et ensuite substituer des lettres à un nombre en base 26 ?

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

A titre d'exemple :

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

etc.

0 votes

"Pourriez-vous peut-être le traiter comme un nombre en base 26". Cela ne devrait pas fonctionner car le système numérique que vous proposez ne comporte pas de zéro. Mais regarder votre exemple me donne une idée que je mettrai en code dans ma réponse.

0 votes

@BH - dans le contexte de la question, ce n'est pas nécessaire - il n'y a pas de colonne zéro dans Excel (la question est "Quel est l'algorithme pour convertir une lettre de colonne Excel en son numéro ?"). Cela dit, il y a encore de meilleures réponses ci-dessus :)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X