Estoy trabajando en un script que genera algunos documentos de Excel y necesito convertir un número en el nombre de su columna equivalente. Por ejemplo:
1 => A
2 => B
27 => AA
28 => AB
14558 => UMX
Ya escribí un algoritmo para hacerlo, pero me gustaría saber si hay formas más simples o más rápidas de hacerlo:
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;
}
¿Conoces una mejor manera de hacerlo? ¿Quizás algo para hacerlo más simple? o una mejora del rendimiento?
Editar
La implementación de ircmaxell funciona bastante bien. Pero, voy a agregar este breve y agradable:
function num2alpha($n)
{
for($r = ""; $n >= 0; $n = intval($n / 26) - 1)
$r = chr($n%26 + 0x41) . $r;
return $r;
}
php
algorithm
optimization
Cristian
fuente
fuente
Respuestas:
Aquí hay una función recursiva simple y agradable (basada en cero números indexados, lo que significa 0 == A, 1 == B, etc.) ...
Y si lo desea uno indexado (1 == A, etc.):
Probado con números de 0 a 10000 ...
fuente
Usando PhpSpreadsheet ( PHPExcel está en desuso )
Tenga en cuenta que el índice 0 da como resultado 'Z'
https://phpspreadsheet.readthedocs.io/en/develop/
La respuesta correcta (si usa la biblioteca PHPExcel ) es:
y al revés:
fuente
PHPExcel_Cell::stringFromColumnIndex(1)
de hecho regresa'B'
, edite su respuesta.Indexado para 1 -> A, 2 -> B, etc.
Indexado para 0 -> A, 1 -> B, etc.
Aprovecha el hecho de que PHP sigue la convención de Perl cuando se trata de operaciones aritméticas en variables de caracteres y no en C. Tenga en cuenta que las variables de carácter se pueden incrementar pero no disminuir.
fuente
Esto servirá para la conversión (asumiendo aritmética de números enteros), pero estoy de acuerdo con los otros carteles; Solo usa
base_convert
fuente
B
para en$number = 1
lugar deA
ya que1 % 26
es1
Respuesta tardía, pero esto es lo que hice (para 1 == A indexado):
Entonces, si desea convertir al revés:
fuente
Número convertido a letras de columna de Excel:
ex:
Las letras de las columnas de Excel se convierten en números:
ex:
fuente
fuente
Combinando la respuesta recursiva de ircmaxell, tengo esta:
Estoy usando la indexación predeterminada como basada en 0, pero puede ser cualquier número entero positivo cuando hago malabares con matrices en PHP.
fuente
Nunca usaría esto en producción porque no es legible, pero por diversión ... Solo lo hace hasta ZZ.
fuente
Para cualquiera que busque una implementación de Javascript de esto, aquí está la respuesta de @ ircmaxell en Javascript .
fuente