Comment convertir un nombre numérique en nom de colonne Excel en C # sans utiliser l'automatisation pour obtenir la valeur directement à partir d'Excel.
Excel 2007 a une plage possible de 1 à 16384, qui est le nombre de colonnes qu'il prend en charge. Les valeurs résultantes doivent être sous la forme de noms de colonnes Excel, par exemple A, AA, AAA etc.
Réponses:
Voici comment je le fais:
la source
StringBuilder
. Cela prend environ deux fois plus de temps. Il s'agit d'une chaîne très courte (max 3 caractères - Excel 2010 monte jusqu'à la colonne XFD), donc maximum de 2 concaténations de chaînes. (J'ai utilisé 100 itérations pour traduire les entiers 1 à 16384, c'est-à-dire les colonnes Excel A à XFD, comme test).modulo
, d'appelerToString()
et d'appliquer le(int)
casting. Étant donné que dans la plupart des cas dans le monde C #, vous commenceriez à numéroter à partir de 0, voici ma révision: <! - langue: c # -> chaîne statique publique GetColumnName (int index) // base zéro {const byte BASE = 'Z «-« A »+ 1; nom de chaîne = String.Empty; do {name = Convert.ToChar ('A' + index% BASE) + name; index = index / BASE - 1; } while (index> = 0); nom de retour; }Si quelqu'un a besoin de le faire dans Excel sans VBA, voici un moyen:
où colNum est le numéro de colonne
Et en VBA:
la source
Désolé, c'est Python au lieu de C #, mais au moins les résultats sont corrects:
la source
Vous pourriez avoir besoin d'une conversion dans les deux sens, par exemple à partir d'une adresse de colonne Excel comme AAZ en entier et de n'importe quel entier en Excel. Les deux méthodes ci-dessous feront exactement cela. Suppose une indexation basée sur 1, le premier élément de vos "tableaux" est le numéro d'élément 1. Aucune limite de taille ici, vous pouvez donc utiliser des adresses comme ERROR et ce serait le numéro de colonne 2613824 ...
la source
J'ai découvert une erreur dans mon premier post, j'ai donc décidé de m'asseoir et de faire le calcul. Ce que j'ai trouvé, c'est que le système de numérotation utilisé pour identifier les colonnes Excel n'est pas un système de base 26, comme l'a signalé une autre personne. Considérez ce qui suit dans la base 10. Vous pouvez également le faire avec les lettres de l'alphabet.
Espace: ......................... S1, S2, S3: S1, S2, S3
............ ........................ 0, 00, 000: .. A, AA, AAA
............. ....................... 1, 01, 001: .. B, AB, AAB
.............. ......................…,…,…: ..…,…,…
............... ..................... 9, 99, 999: .. Z, ZZ, ZZZ
Nombre total d'états dans l'espace: 10, 100, 1000: 26, 676, 17576
Total des États: ............... 1110 ................ 18278
Colonnes de nombres Excel dans les espaces alphabétiques individuels en utilisant la base 26. Vous pouvez voir qu'en général, la progression de l'espace d'états est a, a ^ 2, a ^ 3,… pour une base a, et le nombre total d'états est a + a ^ 2 + a ^ 3 +….
Supposons que vous vouliez trouver le nombre total d'états A dans les N premiers espaces. La formule pour ce faire est A = (a) (a ^ N - 1) / (a-1). Ceci est important car nous devons trouver l'espace N qui correspond à notre indice K. Si je veux savoir où K se situe dans le système numérique, je dois remplacer A par K et résoudre pour N. La solution est N = log { base a} (A (a-1) / a +1). Si j'utilise l'exemple de a = 10 et K = 192, je sais que N = 2,23804…. Cela me dit que K se trouve au début du troisième espace car il est un peu plus grand que deux.
La prochaine étape consiste à trouver exactement dans quelle mesure nous nous trouvons dans l'espace actuel. Pour trouver cela, soustrayez de K le A généré en utilisant l'étage de N. Dans cet exemple, l'étage de N est deux. Ainsi, A = (10) (10 ^ 2 - 1) / (10-1) = 110, comme prévu lorsque vous combinez les états des deux premiers espaces. Cela doit être soustrait de K car ces 110 premiers états auraient déjà été pris en compte dans les deux premiers espaces. Cela nous laisse avec 82 états. Donc, dans ce système numérique, la représentation de 192 dans la base 10 est 082.
Le code C # utilisant un index de base de zéro est
// Old Post
Une solution à base zéro en C #.
la source
Mise à jour : Peter le commentaire de est juste. C'est ce que j'obtiens pour écrire du code dans le navigateur. :-) Ma solution ne compilait pas, il manquait la lettre la plus à gauche et elle construisait la chaîne dans l'ordre inverse - tout est maintenant corrigé.
Mis à part les bugs, l'algorithme est en train de convertir un nombre de la base 10 à la base 26.
Mise à jour 2 : Joel Coehoorn a raison - le code ci-dessus renverra AB pour 27. S'il s'agissait d'un vrai nombre de base 26, AA serait égal à A et le nombre suivant après Z serait BA.
la source
Facile avec récursivité.
la source
Il suffit de lancer une simple implémentation C # à deux lignes en utilisant la récursivité, car toutes les réponses ici semblent beaucoup plus compliquées que nécessaires.
la source
..Et converti en php:
la source
ord('A')
au lieu de 65.Je suis surpris que toutes les solutions jusqu'à présent contiennent soit une itération soit une récursivité.
Voici ma solution qui s'exécute en temps constant (pas de boucles). Cette solution fonctionne pour toutes les colonnes Excel possibles et vérifie que l'entrée peut être transformée en colonne Excel. Les colonnes possibles sont dans la plage [A, XFD] ou [1, 16384]. (Cela dépend de votre version d'Excel)
la source
int
s, le nom de la colonne résultante pourrait être arbitrairement long (c'est le cas de la réponse python, par exemple)Cette réponse est en javaScript:
la source
Même implémentation en Java
la source
Après avoir regardé toutes les versions fournies ici, je suis descendu pour en faire une moi-même, en utilisant la récursivité.
Voici ma version vb.net:
la source
Un peu tard pour le jeu, mais voici le code que j'utilise (en C #):
la source
IndexOf
est assez lent, vous feriez mieux de précalculer le mappage inverse.Je voulais ajouter ma classe statique que j'utilise, pour l'interopérabilité entre col index et col Label. J'utilise une réponse acceptée modifiée pour ma méthode ColumnLabel
Utilisez ceci comme ...
la source
si vous le souhaitez uniquement pour une formule de cellule sans code, voici une formule:
la source
En Delphi (Pascal):
la source
Ce n'est pas exactement la base 26, il n'y a pas de 0 dans le système. S'il y en avait, «Z» serait suivi de «BA» et non de «AA».
la source
En perl, pour une entrée de 1 (A), 27 (AA), etc.
la source
Affiner la solution d'origine (en C #):
la source
Voici une version Actionscript:
la source
Solution JavaScript
la source
Ces mes codes pour convertir un nombre spécifique (début de l'index à partir de 1) en colonne Excel.
Mon test unitaire:
la source
Bien que je sois en retard dans le match, la réponse de Graham est loin d'être optimale. En particulier, vous n'avez pas besoin d'utiliser le
modulo
, d'appelerToString()
et d'appliquer le(int)
casting. Étant donné que dans la plupart des cas dans le monde C #, vous commenceriez à numéroter à partir de 0, voici ma révision:la source
Une autre façon VBA
la source
Voici mon implémentation super tardive en PHP. Celui-ci est récursif. Je l'ai écrit juste avant de trouver ce post. Je voulais voir si d'autres avaient déjà résolu ce problème ...
la source
J'essaie de faire la même chose en Java ... J'ai écrit le code suivant:
Maintenant, une fois que je l'ai exécuté avec columnNumber = 29, cela me donne le résultat = "CA" (au lieu de "AC") des commentaires sur ce qui me manque? Je sais que je peux l'inverser par StringBuilder .... Mais en regardant la réponse de Graham, je suis un peu confus ....
la source
columnName = Convert.ToChar(65 + modulo).ToString() + columnName
(ie valeur + ColName). Hasan dit:columnName += val;
(c'est-à-dire ColName + valeur)columnName = columnName + val
.Version Rubis coïncise et élégante :
la source
C'est la question que tous les autres ainsi que la redirection de Google, donc je poste ceci ici.
Beaucoup de ces réponses sont correctes mais trop lourdes pour des situations simples comme lorsque vous n'avez pas plus de 26 colonnes. Si vous avez le moindre doute quant à savoir si vous pouvez entrer dans des colonnes à deux caractères, ignorez cette réponse, mais si vous êtes sûr de ne pas le faire, vous pouvez le faire aussi simplement que cela en C #:
Heck, si vous êtes sûr de ce que vous passez, vous pouvez même supprimer la validation et utiliser cette ligne:
Ce sera très similaire dans de nombreuses langues afin que vous puissiez l'adapter au besoin.
Encore une fois, utilisez-le uniquement si vous êtes sûr à 100% que vous n'aurez pas plus de 26 colonnes .
la source
Merci pour les réponses ici !! m'a aidé à trouver ces fonctions d'aide pour une interaction avec l'API Google Sheets sur laquelle je travaille dans Elixir / Phoenix
voici ce que j'ai trouvé (pourrait probablement utiliser une validation supplémentaire et une gestion des erreurs)
Dans Elixir:
Et la fonction inverse:
Et quelques tests:
la source