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