Descobri um erro no meu primeiro post, então decidi me sentar e fazer as contas. O que descobri é que o sistema numérico usado para identificar as colunas do Excel não é um sistema básico 26, como outra pessoa postou. Considere o seguinte na base 10. Você também pode fazer isso com as letras do alfabeto.
Espaço: ......................... 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 no espaço: 10, 100, 1000: 26, 676, 17576
Total de estados: ............... 1110 ................ 18278
O Excel numera colunas nos espaços alfabéticos individuais usando a base 26. Você pode ver que, em geral, a progressão do espaço de estados é a, a ^ 2, a ^ 3,… para alguma base a, e o número total de estados é a + a ^ 2 + a ^ 3 +….
Suponha que você queira encontrar o número total de estados A nos primeiros N espaços. A fórmula para fazer isso é A = (a) (a ^ N - 1) / (a-1). Isso é importante porque precisamos encontrar o espaço N que corresponde ao nosso índice K. Se eu quiser descobrir onde K se encontra no sistema numérico, preciso substituir A por K e resolver por N. A solução é N = log { base a} (A (a-1) / a +1). Se eu usar o exemplo de a = 10 e K = 192, sei que N = 2,23804…. Isso me diz que K está no início do terceiro espaço, pois é um pouco maior que dois.
O próximo passo é descobrir exatamente a que distância estamos do espaço atual. Para encontrar isso, subtraia de K o A gerado usando o piso de N. Neste exemplo, o piso de N é dois. Portanto, A = (10) (10 ^ 2 - 1) / (10-1) = 110, conforme o esperado quando você combina os estados dos dois primeiros espaços. Isso precisa ser subtraído de K, porque esses primeiros 110 estados já teriam sido contabilizados nos dois primeiros espaços. Isso nos deixa com 82 estados. Portanto, neste sistema numérico, a representação de 192 na base 10 é 082.
O código C # usando um índice base zero é
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;
}
// Postagem antiga
Uma solução baseada em zero em 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;
}