2009-03-20 10 views
49

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

La langue dans laquelle cela sera écrit est C#, mais tout code pseudo ou même ferait.

S'il vous plaît noter que je vais mettre cela en C# et je ne veux pas utiliser le bureau dll.

Pour 'A' le résultat attendu sera 1

Pour 'AH' = 34

Pour 'XFD' = 16384

+5

Pour l'inverse (à partir du numéro à colonne-lettre) voir: http://stackoverflow.com/questions/181596/how-to-convert-a-column-number-eg-127-into-an-excel-column-eg-aa – surfmuggle

Répondre

90
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; 
} 
+4

Utiliser Math.Pow n'est en fait pas la meilleure idée (problèmes à virgule flottante, performance ...) Utilisez 'sum * = 26; sum + = (caractères [i] -' A '+ 1);' – ackb

+0

Génial fonctionne Très bien, merci beaucoup. –

+0

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

3

Pourriez-vous traiter peut-être comme une base 26 nombre et puis substituer des lettres pour un numéro de base 26? Donc, en effet, votre 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? Donc, A représenterait un lot de 26, B serait 2, etc.

À 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

"Pourriez-vous peut-être le traiter comme un numéro de base 26 ". Cela ne devrait pas fonctionner parce que votre système de numéro proposé n'a pas de zéro. Mais regarder votre exemple me donne une idée que je vais mettre dans le code dans ma réponse. –

+0

@BH - dans le contexte de la question, cela 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 :) – Chris

4

boucle à travers les personnages du dernier au premier. Multipliez la valeur de chaque lettre (A = 1, Z = 26) par 26 ** N, ajoutez à un total cumulé. Ma compétence de manipulation de chaînes en C# est inexistante, donc voici quelques pseudo-code très mitigée:

sum=0; 
len=length(letters); 
for(i=0;i<len;i++) 
    sum += ((letters[len-i-1])-'A'+1) * pow(26,i); 
15
int result = colName.Select((c, i) => 
    ((c - 'A' + 1) * ((int)Math.Pow(26, colName.Length - i - 1)))).Sum(); 
7
int col = colName.ToCharArray().Select(c => c - 'A' + 1). 
      Reverse().Select((v, i) => v * (int)Math.Pow(26, i)).Sum(); 
+0

Parfait. Il m'a fallu un moment pour travailler pourquoi vous étiez en train de faire marche arrière (c'est parce que BB est plus haut que AZ). Et vous évitez le décalage d'un bug de longueur de caractères que d'autres ont eu en utilisant l'index. –

-2

Vous les gars ont besoin de penser en dehors de la place. Vous n'avez pas besoin d'un codage aussi complexe. La formule suivante donne la même réponse

= MID (adresse (ROW(), la colonne()), 2, FIND ("$", l'adresse (ROW(), la colonne()), 2) -2)

Cette formule vous donnera les lettres de colonne pour n'importe quelle colonne que vous êtes. Facilement adaptable pour changer la référence à une autre colonne.

+2

Vous devez apprendre à mieux comprendre les questions. Pardon. –

+4

"Vous avez besoin de penser en dehors de la place.", Il demandait un code de pseudo ou un exemple de C#, pas un exemple de fonction Excel en ligne. Je pense que le problème est que vous ne pensez pas en dehors d'Excel! –

3

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

dans Excel VBA vous pouvez utiliser la méthode .Range pour obtenir le numéro, comme suit:

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

Ensuite, utiliser la propriété .column:

debug.print rng.column 

si vous avez besoin code complet voir ci-dessous :

0

Je suppose que cela fonctionne essentiellement de la même manière que certaines 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 parce qu'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. Man, ça vous fait vraiment apprécier ce que l'arithmétique du désordre a dû être avant que les Babyloniens inventent le zéro!

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

Comme d'autres, je renversé le tableau de caractères, donc je ne pas besoin de savoir quoi que ce soit au sujet des exposants.

1

Je ne suis pas tout à fait heureux avec aucune des réponses, alors voici une version courte:

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

ou mieux, d'ignorer non A-Za-z caractères:

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