2009-03-20 15 views
49

Necesito un algoritmo para convertir una letra de columna de Excel a su número correcto.¿Cuál es el algoritmo para convertir una letra de columna de Excel en su número?

El idioma en el que se escribirá es C#, pero cualquiera lo haría o incluso pseudocódigo.

Tenga en cuenta que voy a poner esto en C# y no quiero usar el dll de la oficina.

para 'a' el resultado esperado será de 1

Para 'AH' = 34

Para 'XFD' = 16384

+5

Para la inversa (de serie a la columna-letra) ver: http://stackoverflow.com/questions/181596/how-to-convert-a-column-number-eg-127-into-an-excel-column-eg-aa – surfmuggle

Respuesta

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

Usar Math.Pow en realidad no es la mejor idea (problemas de coma flotante, rendimiento ...) Use 'suma * = 26; suma + = (caracteres [i] -' A '+ 1);' – ackb

+0

Awesome funciona Estupendo, muchas gracias. –

+0

Tengo curiosidad, ¿cuál es el propósito de la matriz de personajes? Parece que funciona indexando directamente en una cadena con: suma + = (nombreColumna [i] - 'A' + 1) – RyanW

3

Podría quizá tratarlo como un número de base 26, y luego, sustituye las letras por un número de base 26?

Así que, en efecto, su dígito más a la derecha siempre será un número sin formato entre 1 y 26, y el resto del "número" (la parte izquierda) es el número de 26 recopilados? Así Un representaría un lote de 26, B sería 2, etc.

A modo de ejemplo:

 
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

"¿Podría usted quizás lo trate como un número base 26 ". Esto no debería funcionar porque su sistema de números propuesto carece de cero. Pero mirar tu ejemplo me da una idea que pondré en el código en mi respuesta. –

+0

@BH: en el contexto de la pregunta, esto no es necesario: no hay columna cero en Excel (la pregunta es "¿Cuál es el algoritmo para convertir una letra de columna de Excel en su número?"). Habiendo dicho eso, todavía hay mejores respuestas arriba :) – Chris

4

bucle a través de los personajes del último al primero. Multiplique el valor de cada letra (A = 1, Z = 26) por 26 ** N, agréguelo a un total acumulado. Mi habilidad de manipulación de cadenas en C# es inexistente, asi que aquí hay algunos muy mezclada pseudo-código:

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

Perfecto. Me tomó un momento para trabajar por qué estabas retrocediendo (es porque BB es más alto que AZ). Y evita el error de longitud de carácter por otros que otros han tenido al usar el índice. –

-2

Ustedes tienen que pensar fuera de la plaza. No necesita una codificación tan compleja. La siguiente fórmula proporciona la misma respuesta

= MID (DIRECCIÓN (ROW(), COLUMN()), 2, FIND ("$", DIRECCIÓN (ROW(), COLUMN()), 2) -2)

Esta fórmula le dará las letras de las columnas de cualquier columna en la que se encuentre. Fácilmente adaptable para cambiar la referencia a otra columna.

+2

Necesita aprender a comprender mejor las preguntas. Lo siento. –

+4

"Ustedes necesitan pensar fuera del cuadrado.", Él estaba pidiendo un código de psuedo o un ejemplo de C#, no un ejemplo de función en línea de Excel. ¡Creo que el problema es que no estás pensando fuera de Excel! –

3

Aquí hay una solución que escribí en JavaScript si alguien está interesado.

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

en Excel VBA se puede utilizar el método .Range para obtener el número, así:

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

A continuación, utilice .column propiedad:

debug.print rng.column 

si necesita código completo sigue a continuación :

0

Supongo que esto esencialmente funciona igual que algunas de las otras respuestas, pero puede aclarar un poco más qué está sucediendo con el equivalente alfa de un dígito numérico. No es exactamente un sistema base 26 porque no hay 0 marcador de posición. Es decir, la columna 26 sería "A0" o algo en lugar de Z en la base 26.Y no es la base 27 porque los 'alfa-gits' no representan poderes de 27. ¡Hombre, realmente hace que aprecies lo que debe haber sido una complicada aritmética antes de que los babilonios inventaran el cero!

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

Al igual que en otros, invierte la matriz de caracteres, por lo que no necesito saber nada sobre los exponentes.

1

No estoy muy feliz con cualquiera de las respuestas, por lo que aquí hay una versión corta:

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

o mejor, hacer caso omiso de los no A-Za-z caracteres:

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