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
private string ExcelColumnIndexToName(int Index)
{
string range = string.Empty;
if (Index < 0 ) return range;
int a = 26;
int x = (int)Math.Floor(Math.Log((Index) * (a - 1) / a + 1, a));
Index -= (int)(Math.Pow(a, x) - 1) * a / (a - 1);
for (int i = x+1; Index + i > 0; i--)
{
range = ((char)(65 + Index % a)).ToString() + range;
Index /= a;
}
return range;
}
// Publicación anterior
Una solución de base cero en C #.
private string ExcelColumnIndexToName(int Index)
{
string range = "";
if (Index < 0 ) return range;
for(int i=1;Index + i > 0;i=0)
{
range = ((char)(65 + Index % 26)).ToString() + range;
Index /= 26;
}
if (range.Length > 1) range = ((char)((int)range[0] - 1)).ToString() + range.Substring(1);
return range;
}