У першій публікації я виявив помилку, тому вирішив сісти і зайнятися математикою. Я знайшов, що система числення, яка використовується для ідентифікації стовпців Excel, не є базовою системою 26, як опублікувала інша людина. Розглянемо наступне в базі 10. Ви також можете зробити це за допомогою букв алфавіту.
Простір: ......................... S1, S2, S3: S1, S2, S3
............ ........................ 0, 00, 000: .. A, AA, AAA
............. ....................... 1, 01, 001: .. B, AB, AAB
.............. ......................…,…,…: ..…,…,…
............... ..................... 9, 99, 999: .. Z, ZZ, ZZZ
Всього станів у просторі: 10, 100, 1000: 26, 676, 17576
Всього штатів: ............... 1110 ................ 18278
Excel чисел стовпців в окремих алфавітних просторах, використовуючи базу 26. Ви можете бачити, що загалом прогресія простору стану є a, a ^ 2, a ^ 3,… для деякої бази a, а загальна кількість станів - a + a ^ 2 + a ^ 3 +….
Припустимо, ви хочете знайти загальну кількість станів A в перших N просторах. Формула для цього - A = (a) (a ^ N - 1) / (a-1). Це важливо, тому що нам потрібно знайти простір N, який відповідає нашому індексу K. Якщо я хочу дізнатися, де лежить K у системі чисел, мені потрібно замінити A на K і вирішити для N. Рішення - N = log { база a} (A (a-1) / a +1). Якщо я використовую приклад a = 10 і K = 192, я знаю, що N = 2,223804…. Це говорить мені, що K лежить на початку третього простору, оскільки він трохи більше двох.
Наступний крок - точно знайти, наскільки далеко ми в поточному просторі. Щоб знайти це, відніміть з K A A, що генерується, використовуючи підлогу N. У цьому прикладі підлогу N - два. Отже, A = (10) (10 ^ 2 - 1) / (10-1) = 110, як очікується при поєднанні станів перших двох проміжків. Це потрібно відняти від K, оскільки ці перші 110 станів уже були б враховані в перших двох просторах. Це залишає нас із 82 державами. Отже, у цій системі числення представлення 192 у базі 10 дорівнює 082.
Код C # з використанням базового індексу дорівнює нулю
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;
}
// Стара публікація
Рішення на основі нуля в 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;
}