Ho scoperto un errore nel mio primo post, quindi ho deciso di sedermi e fare i conti. Quello che ho scoperto è che il sistema numerico utilizzato per identificare le colonne di Excel non è un sistema di base 26, come pubblicato da un'altra persona. Considera quanto segue nella base 10. Puoi anche farlo con le lettere dell'alfabeto.
Spazio: ......................... S1, S2, S3: S1, S2, S3
............ ........................ 0, 00, 000: .. A, AA, AAA
............. ....................... 1, 01, 001: .. B, AB, AAB
.............. ...................... ..., ..., ...: .. ..., ..., ...
............... ..................... 9, 99, 999: .. Z, ZZ, ZZZ
Stati totali nello spazio: 10, 100, 1000: 26, 676, 17576
Stati totali: ............... 1110 ................ 18278
Excel numera le colonne nei singoli spazi alfabetici usando la base 26. Puoi vedere che in generale, la progressione dello spazio degli stati è a, a ^ 2, a ^ 3, ... per qualche base a, e il numero totale di stati è a + a ^ 2 + a ^ 3 +….
Supponiamo di voler trovare il numero totale di stati A nei primi N spazi. La formula per farlo è A = (a) (a ^ N - 1) / (a-1). Questo è importante perché dobbiamo trovare lo spazio N che corrisponde al nostro indice K. Se voglio scoprire dove si trova K nel sistema numerico, devo sostituire A con K e risolvere per N. La soluzione è N = log { base a} (A (a-1) / a +1). Se uso l'esempio di a = 10 e K = 192, so che N = 2.23804…. Questo mi dice che K si trova all'inizio del terzo spazio poiché è leggermente più grande di due.
Il prossimo passo è trovare esattamente quanto siamo lontani nello spazio attuale. Per trovare questo, sottrarre da K la A generata usando il piano di N. In questo esempio, il pavimento di N è due. Quindi, A = (10) (10 ^ 2 - 1) / (10-1) = 110, come previsto quando si combinano gli stati dei primi due spazi. Questo deve essere sottratto da K perché questi primi 110 stati sarebbero già stati contabilizzati nei primi due spazi. Questo ci lascia con 82 stati. Quindi, in questo sistema di numeri, la rappresentazione di 192 nella base 10 è 082.
Il codice C # che utilizza un indice di base pari a 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;
}
// Vecchia posta
Una soluzione a base zero in 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;
}