¿Cómo convertir un número numérico a un nombre de columna de Excel en C # sin utilizar la automatización para obtener el valor directamente de Excel?
Excel 2007 tiene un rango posible de 1 a 16384, que es el número de columnas que admite. Los valores resultantes deben estar en forma de nombres de columna de Excel, por ejemplo, A, AA, AAA, etc.
Respuestas:
Así es como lo hago:
fuente
StringBuilder
. Tarda aproximadamente el doble de tiempo. Es una cadena muy corta (máximo 3 caracteres: Excel 2010 sube a la columna XFD), por lo que un máximo de 2 concatenaciones de cadena. (Usé 100 iteraciones de traducción de los enteros 1 a 16384, es decir, las columnas A de Excel a XFD, como prueba).modulo
, invocarToString()
y aplicar el(int)
elenco. Teniendo en cuenta que, en la mayoría de los casos, en el mundo de C # comenzaría a numerar desde 0, aquí está mi revisión: <! - idioma: c # -> cadena estática pública GetColumnName (int index) // basado en cero {const byte BASE = 'Z '-' A '+ 1; string name = String.Empty; do {name = Convert.ToChar ('A' + índice% BASE) + nombre; índice = índice / BASE - 1; } while (índice> = 0); nombre de retorno; }Si alguien necesita hacer esto en Excel sin VBA, aquí hay una manera:
donde colNum es el número de columna
Y en VBA:
fuente
Lo sentimos, este es Python en lugar de C #, pero al menos los resultados son correctos:
fuente
Es posible que necesite la conversión en ambos sentidos, por ejemplo, desde la dirección de columna de Excel como AAZ a entero y de cualquier entero a Excel. Los dos métodos a continuación harán exactamente eso. Asume una indexación basada en 1, el primer elemento en sus "matrices" es el elemento número 1. No hay límites de tamaño aquí, por lo que puede usar direcciones como ERROR y ese sería el número de columna 2613824 ...
fuente
Descubrí un error en mi primera publicación, así que decidí sentarme y hacer los cálculos. Lo que encontré es que el sistema de números utilizado para identificar columnas de Excel no es un sistema base 26, como publicó otra persona. Considere lo siguiente en la base 10. También puede hacer esto con las letras del alfabeto.
Espacio: ......................... S1, S2, S3: S1, S2, S3
............ ........................ 0, 00, 000: .. A, AA, AAA
............. ....................... 1, 01, 001: .. B, AB, AAB
.............. ...................... ..., ..., ...: .. ..., ..., ...
............... ..................... 9, 99, 999: .. Z, ZZ, ZZZ
Total de estados en el espacio: 10, 100, 1000: 26, 676, 17576
Total de Estados: ............... 1110 ................ 18278
Excel numera las columnas en los espacios alfabéticos individuales utilizando la base 26. Puede ver que, en general, la progresión del espacio de estados es a, a ^ 2, a ^ 3, ... para alguna base a, y el número total de estados es a + a ^ 2 + a ^ 3 +….
Suponga que desea encontrar el número total de estados A en los primeros N espacios. La fórmula para hacerlo es A = (a) (a ^ N - 1) / (a-1). Esto es importante porque necesitamos encontrar el espacio N que corresponde a nuestro índice K. Si quiero averiguar dónde se encuentra K en el sistema de números, necesito reemplazar A por K y resolver N. La solución es N = log { base a} (A (a-1) / a +1). Si uso el ejemplo de a = 10 y K = 192, sé que N = 2.23804 ... Esto me dice que K se encuentra al comienzo del tercer espacio ya que es un poco mayor que dos.
El siguiente paso es encontrar exactamente qué tan lejos estamos en el espacio actual. Para encontrar esto, reste de K el A generado usando el piso de N. En este ejemplo, el piso de N es dos. Entonces, A = (10) (10 ^ 2 - 1) / (10-1) = 110, como se espera cuando combina los estados de los dos primeros espacios. Esto debe restarse de K porque estos primeros 110 estados ya se habrían contabilizado en los dos primeros espacios. Esto nos deja con 82 estados. Entonces, en este sistema de números, la representación de 192 en la base 10 es 082.
El código C # que usa un índice base de cero es
// Publicación anterior
Una solución de base cero en C #.
fuente
Actualización : el comentario de Peter es correcto. Eso es lo que obtengo por escribir código en el navegador. :-) Mi solución no estaba compilando, le faltaba la letra más a la izquierda y estaba construyendo la cadena en orden inverso, todo ahora solucionado.
Dejando a un lado los errores, el algoritmo básicamente está convirtiendo un número de la base 10 a la base 26.
Actualización 2 : Joel Coehoorn tiene razón: el código anterior devolverá AB para 27. Si fuera un número real de base 26, AA sería igual a A y el siguiente número después de Z sería BA.
fuente
Fácil con recursividad.
fuente
Simplemente lanzando una implementación simple de C # de dos líneas usando recursividad, porque todas las respuestas aquí parecen mucho más complicadas de lo necesario.
fuente
..Y convertido a php:
fuente
ord('A')
lugar de 65.Me sorprende que todas las soluciones hasta ahora contengan iteración o recursividad.
Aquí está mi solución que se ejecuta en tiempo constante (sin bucles). Esta solución funciona para todas las posibles columnas de Excel y verifica que la entrada se pueda convertir en una columna de Excel. Las columnas posibles están en el rango [A, XFD] o [1, 16384]. (Esto depende de su versión de Excel)
fuente
int
s, el nombre de la columna resultante podría ser arbitrariamente largo (ese es el caso de la respuesta de Python, por ejemplo)Esta respuesta está en javaScript:
fuente
Misma implementación en Java
fuente
Después de mirar todas las versiones suministradas aquí, decidí hacer una yo mismo, usando la recursión.
Aquí está mi versión vb.net:
fuente
Un poco tarde para el juego, pero aquí está el código que uso (en C #):
fuente
IndexOf
es bastante lento, será mejor que precalcules el mapeo inverso.Quería agregar mi clase estática que uso, para interoperar entre col index y col Label. Yo uso una respuesta aceptada modificada para mi Método ColumnLabel
Usa esto como ...
fuente
si solo lo desea para una fórmula de celda sin código, aquí hay una fórmula para ello:
fuente
En Delphi (Pascal):
fuente
No es exactamente la base 26, no hay 0 en el sistema. Si existiera, 'Z' sería seguido por 'BA' y no por 'AA'.
fuente
En perl, para una entrada de 1 (A), 27 (AA), etc.
fuente
Refinando la solución original (en C #):
fuente
Aquí hay una versión de Actionscript:
fuente
Solución JavaScript
fuente
Estos mis códigos para convertir un número específico (índice comienza desde 1) a la columna de Excel.
Mi prueba de unidad:
fuente
Aunque llego tarde al juego, la respuesta de Graham está lejos de ser óptima. En particular, no tiene que usar
modulo
, invocarToString()
y aplicar el(int)
elenco. Teniendo en cuenta que en la mayoría de los casos en el mundo de C # comenzaría a numerar desde 0, aquí está mi revisión:fuente
Otra forma de VBA
fuente
Aquí está mi implementación súper tardía en PHP. Este es recursivo. Lo escribí justo antes de encontrar esta publicación. Quería ver si otros ya habían resuelto este problema ...
fuente
Estoy tratando de hacer lo mismo en Java ... Escribí el siguiente código:
Ahora, una vez que lo ejecuté con columnNumber = 29, me da el resultado = "CA" (en lugar de "AC") ¿algún comentario que me falta? Sé que puedo revertirlo con StringBuilder ... Pero mirando la respuesta de Graham, estoy un poco confundido ...
fuente
columnName = Convert.ToChar(65 + modulo).ToString() + columnName
(es decir, valor + ColName). Hasan dice:columnName += val;
(es decir, ColName + valor)columnName = columnName + val
.Coincise y elegante versión Ruby :
fuente
Esta es la pregunta a la que todos los demás, así como Google redirigen, así que estoy publicando esto aquí.
Muchas de estas respuestas son correctas pero demasiado engorrosas para situaciones simples como cuando no tiene más de 26 columnas. Si tiene alguna duda sobre si podría entrar en columnas de doble carácter, ignore esta respuesta, pero si está seguro de que no lo hará, entonces podría hacerlo tan simple como esto en C #:
Diablos, si estás seguro de lo que estás pasando, incluso podrías eliminar la validación y usar esta línea:
Esto será muy similar en muchos idiomas para que pueda adaptarlo según sea necesario.
Nuevamente, solo use esto si está 100% seguro de que no tendrá más de 26 columnas .
fuente
Gracias por las respuestas aquí !! me ayudó a desarrollar estas funciones auxiliares para interactuar con la API de Google Sheets en la que estoy trabajando en Elixir / Phoenix
esto es lo que se me ocurrió (probablemente podría usar alguna validación adicional y manejo de errores)
En elixir:
Y la función inversa:
Y algunas pruebas:
fuente