office microsoft manejo make leer con c# excel math

c# - manejo - microsoft office interop excel 2013



¿Cuál es el algoritmo para convertir una letra de columna de Excel en su número? (9)

¿Podría tratarlo como un número base 26 y luego sustituir letras por un número base 26?

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

Como 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

Necesito un algoritmo para convertir una letra de columna de Excel a su número correcto.

El lenguaje en el que se escribirá es C #, pero cualquiera lo haría o incluso pseudo có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á 1

Para ''AH'' = 34

Para ''XFD'' = 16384


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);


No estoy muy contento con ninguna de las respuestas, así que aquí hay una versión corta:

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

o mejor, ignorar los caracteres que no son A-Za-z :

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


Pasa por 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 # no existe, así que aquí hay un pseudocódigo muy mezclado:

sum=0; len=length(letters); for(i=0;i<len;i++) sum += ((letters[len-i-1])-''A''+1) * pow(26,i);


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 los poderes de 27. Hombre, realmente hace que aprecies lo que es un desastre ¡la aritmética debe haber sido 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 algunos otros, invertí la matriz de caracteres, así que no necesito saber nada sobre los exponentes.


en Excel VBA puedes usar 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")

Luego use la propiedad .column :

debug.print rng.column

si necesita el código completo, consulte a continuación:

Function ColumnbyName(vInput As Variant, Optional bByName As Boolean = True) As Variant Dim Rng As Range If bByName Then If Not VBA.IsNumeric(vInput) Then Set Rng = ThisWorkbook.Worksheets("mytab").Range(vInput & "1:" & vInput & "1") ColumnbyName = Rng.Column Else MsgBox "Please enter valid non Numeric column or change paramter bByName to False!" End If Else If VBA.IsNumeric(vInput) Then ColumnbyName = VBA.Chr(64 + CInt(vInput)) Else MsgBox "Please enter valid Numeric column or change paramter bByName to True!" End If End If End Function


int col = colName.ToCharArray().Select(c => c - ''A'' + 1). Reverse().Select((v, i) => v * (int)Math.Pow(26, i)).Sum();


int result = colName.Select((c, i) => ((c - ''A'' + 1) * ((int)Math.Pow(26, colName.Length - i - 1)))).Sum();


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; }