İlk yazımda bir hata buldum, bu yüzden oturmaya ve matematik yapmaya karar verdim. Bulduğum, Excel sütunlarını tanımlamak için kullanılan sayı sisteminin, başka bir kişinin yayınladığı gibi bir temel 26 sistemi olmadığıdır. Taban 10'da aşağıdakileri göz önünde bulundurun. Bunu alfabenin harfleriyle de yapabilirsiniz.
Boşluk: ......................... S1, S2, S3: S1, S2, S3
............ ........................ 0, 00, 000: .. A, AA, AAA
............. ....................... 1, 01, 001: .. B, AB, AAB
.............. ......................…,…,…: ..…,…,…
............... ..................... 9, 99, 999: .. Z, ZZ, ZZZ
Uzayda Toplam Durum: 10, 100, 1000: 26, 676, 17576
Toplam Eyaletler: ............... 1110 ................ 18278
Excel, 26 tabanını kullanarak tek tek alfabetik boşluklardaki sütunları numaralandırır. Genel olarak, durum alanı ilerlemesinin bazı taban a için a, a ^ 2, a ^ 3,… olduğunu ve toplam durum sayısının + a olduğunu görebilirsiniz. ^ 2 + a ^ 3 +….
İlk N boşluğundaki toplam A durumu sayısını bulmak istediğinizi varsayalım. Bunu yapmak için formül A = (a) (a ^ N - 1) / (a-1) 'dir. Bu önemlidir, çünkü indeksimiz K'ye karşılık gelen N alanını bulmamız gerekir. K'nin sayı sisteminde nerede bulunduğunu bulmak istersem, A'yı K ile değiştirmem ve N için çözmem gerekir. Çözüm N = log { baz a} (A (a-1) / a +1). A = 10 ve K = 192 örneğini kullanırsam, N = 2.23804… olduğunu biliyorum. Bu bana K'nin üçüncü alanın başında olduğunu ve ikiden biraz daha büyük olduğunu söylüyor.
Bir sonraki adım, mevcut alanda tam olarak ne kadar olduğumuzu bulmaktır. Bunu bulmak için, N'nin tabanı kullanılarak oluşturulan KA'dan çıkar. Bu örnekte, N'nin tabanı ikidir. Dolayısıyla, ilk iki boşluğun durumlarını birleştirdiğinizde beklendiği gibi A = (10) (10 ^ 2 - 1) / (10-1) = 110. Bu K'den çıkarılmalıdır, çünkü bu ilk 110 durum ilk iki alanda zaten açıklanmış olacaktı. Bu bizi 82 eyalete bırakıyor. Yani, bu sayı sisteminde, taban 10'da 192'nin temsili 082'dir.
Sıfır temel indeksi kullanan C # kodu:
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;
}
// Eski Gönderi
C # 'da sıfır tabanlı bir çözüm.
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;
}