Я обнаружил ошибку в своем первом посте, поэтому я решил сесть и посчитать. Я обнаружил, что система счисления, используемая для идентификации столбцов 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.23804…. Это говорит мне, что K лежит в начале третьего пространства, так как оно немного больше двух.
Следующим шагом будет точное определение того, как далеко мы находимся в текущем пространстве. Чтобы найти это, вычтите из K 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;
}