Je travaille sur un script qui génère des documents Excel et je dois convertir un nombre en son équivalent de nom de colonne. Par exemple:
1 => A
2 => B
27 => AA
28 => AB
14558 => UMX
J'ai déjà écrit un algorithme pour le faire, mais j'aimerais savoir s'il existe des moyens plus simples ou plus rapides de le faire:
function numberToColumnName($number){
$abc = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
$abc_len = strlen($abc);
$result_len = 1; // how much characters the column's name will have
$pow = 0;
while( ( $pow += pow($abc_len, $result_len) ) < $number ){
$result_len++;
}
$result = "";
$next = false;
// add each character to the result...
for($i = 1; $i<=$result_len; $i++){
$index = ($number % $abc_len) - 1; // calculate the module
// sometimes the index should be decreased by 1
if( $next || $next = false ){
$index--;
}
// this is the point that will be calculated in the next iteration
$number = floor($number / strlen($abc));
// if the index is negative, convert it to positive
if( $next = ($index < 0) ) {
$index = $abc_len + $index;
}
$result = $abc[$index].$result; // concatenate the letter
}
return $result;
}
Connaissez-vous une meilleure façon de le faire? Peut-être quelque chose pour simplifier les choses? ou une amélioration des performances?
Éditer
L'implémentation d'ircmaxell fonctionne assez bien. Mais, je vais ajouter ce joli court:
function num2alpha($n)
{
for($r = ""; $n >= 0; $n = intval($n / 26) - 1)
$r = chr($n%26 + 0x41) . $r;
return $r;
}
php
algorithm
optimization
Cristian
la source
la source
Réponses:
Voici une jolie fonction récursive simple (basée sur zéro nombre indexé, ce qui signifie 0 == A, 1 == B, etc.) ...
Et si vous en voulez un indexé (1 == A, etc):
Testé avec des nombres de 0 à 10000 ...
la source
Utilisation de PhpSpreadsheet ( PHPExcel est obsolète )
L'index de note 0 donne «Z»
https://phpspreadsheet.readthedocs.io/en/develop/
La bonne réponse (si vous utilisez la bibliothèque PHPExcel ) est:
et à l'envers:
la source
PHPExcel_Cell::stringFromColumnIndex(1)
retourne effectivement'B'
, veuillez modifier votre réponse.Indexé pour 1 -> A, 2 -> B, etc.
Indexé pour 0 -> A, 1 -> B, etc.
Profite du fait que PHP suit la convention de Perl lorsqu'il traite des opérations arithmétiques sur des variables de caractères et non sur des C. Notez que les variables de caractères peuvent être incrémentées mais pas décrémentées.
la source
Cela fera de la conversion (en supposant l'arithmétique entière), mais je suis d'accord avec les autres affiches; juste utiliser
base_convert
la source
B
pour$number = 1
au lieu deA
depuis1 % 26
est1
Réponse tardive, mais voici ce que j'ai fait (pour 1 == A indexé):
Ensuite, si vous souhaitez convertir dans l'autre sens:
la source
Nombre converti en lettres de colonne Excel:
ex:
Les lettres de la colonne Excel sont converties en nombre:
ex:
la source
la source
En combinant la réponse récursive d'ircmaxell, j'ai celle-ci:
J'utilise l'indexation par défaut basée sur 0, mais cela peut être n'importe quel entier positif pour jongler avec des tableaux en PHP.
la source
Je n'utiliserais jamais cela en production car il n'est pas lisible, mais pour le plaisir ... Seulement jusqu'à ZZ.
la source
Pour tous ceux qui recherchent une implémentation Javascript de ceci, voici la réponse de @ ircmaxell en Javascript ..
la source