Как преобразовать числовое число в имя столбца Excel в C # без автоматизации, получая значение непосредственно из Excel.
В Excel 2007 возможен диапазон от 1 до 16384, то есть число поддерживаемых столбцов. Полученные значения должны быть в форме имен столбцов Excel, например, A, AA, AAA и т. Д.
Ответы:
Вот как я это делаю:
источник
StringBuilder
. Это занимает примерно вдвое больше времени. Это очень короткая строка (не более 3 символов - Excel 2010 переходит в столбец XFD), поэтому максимум 2 конкатенации строк. (Я использовал 100 итераций перевода целых чисел от 1 до 16384, то есть столбцы Excel от A до XFD, в качестве теста).modulo
, вызыватьToString()
и применять(int)
приведение. Учитывая, что в большинстве случаев в мире C # вы начинаете нумерацию с 0, вот моя ревизия: <! - language: c # -> открытая статическая строка GetColumnName (int index) // на основе нуля {const byte BASE = 'Z '-' A '+ 1; имя строки = String.Empty; do {name = Convert.ToChar ('A' + index% BASE) + name; index = index / BASE - 1; } while (index> = 0); вернуть имя; }Если кому-то нужно сделать это в Excel без VBA, вот способ:
где colNum - номер столбца
И в VBA:
источник
Извините, это Python вместо C #, но по крайней мере результаты верны:
источник
Вам может потребоваться преобразование в обоих направлениях, например, из адреса столбца Excel, например AAZ, в целое число и из любого целого числа в Excel. Два метода ниже сделают именно это. При условии индексации на основе 1, первым элементом в ваших «массивах» является элемент номер 1. Здесь нет ограничений по размеру, поэтому вы можете использовать адреса, такие как ОШИБКА, и это будет номер столбца 2613824 ...
источник
Я обнаружил ошибку в своем первом посте, поэтому я решил сесть и посчитать. Я обнаружил, что система счисления, используемая для идентификации столбцов 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 #, использующий нулевой базовый индекс:
// Старый пост
Решение на основе нуля в C #.
источник
Обновление : комментарий Питера прав. Вот что я получаю за написание кода в браузере. :-) Мое решение не компилировалось, оно пропускало крайнюю левую букву и строило строку в обратном порядке - все теперь исправлено.
Помимо ошибок, алгоритм в основном конвертирует число из базы 10 в базу 26.
Обновление 2 : Джоэл Коухорн прав: приведенный выше код вернет AB для 27. Если бы это было действительное число с основанием 26, AA было бы равно A, а следующее число после Z было бы BA.
источник
Легко с рекурсией.
источник
Просто добавьте простую двухстрочную реализацию C # с использованием рекурсии, потому что все ответы здесь кажутся гораздо более сложными, чем необходимо.
источник
..И конвертируется в php:
источник
ord('A')
вместо 65.Я удивлен, что все решения до сих пор содержат итерацию или рекурсию.
Вот мое решение, которое работает в постоянное время (без петель). Это решение работает для всех возможных столбцов Excel и проверяет возможность преобразования входных данных в столбец Excel. Возможные столбцы находятся в диапазоне [A, XFD] или [1, 16384]. (Это зависит от вашей версии Excel)
источник
int
s, результирующее имя столбца могло быть произвольно длинным (например, в случае с ответом python)Этот ответ в javaScript:
источник
Та же реализация в Java
источник
Посмотрев все предоставленные здесь Версии, я решил сделать одну сам, используя рекурсию.
Вот моя версия vb.net:
источник
Немного опоздал к игре, но вот код, который я использую (в C #):
источник
IndexOf
довольно медленно, вам лучше пересчитать обратное отображение.Я хотел добавить свой статический класс, который я использую, для взаимодействия между индексом col и col Label. Я использую измененный принятый ответ для моего метода ColumnLabel
Используйте это как ...
источник
если вы просто хотите это для формулы ячейки без кода, вот формула для нее:
источник
В Дельфи (Паскаль):
источник
Это не совсем база 26, в системе нет 0. Если бы это было, за «Z» следовал бы «BA», а не «AA».
источник
В perl для ввода 1 (A), 27 (AA) и т. Д.
источник
Уточнение исходного решения (в C #):
источник
Вот версия Actionscript:
источник
Решение JavaScript
источник
Эти мои коды для преобразования определенного числа (индекс начинается с 1) в столбце Excel.
Мой юнит тест:
источник
Хотя я опаздываю к игре, ответ Грэма далеко не оптимален. В частности, вам не нужно использовать
modulo
, вызыватьToString()
и применять(int)
приведение. Учитывая, что в большинстве случаев в мире C # вы начинаете нумерацию с 0, вот моя ревизия:источник
Еще один способ VBA
источник
Вот моя супер поздняя реализация в PHP. Этот рекурсивный. Я написал это как раз перед тем, как нашел этот пост. Я хотел посмотреть, решили ли другие эту проблему уже ...
источник
Я пытаюсь сделать то же самое в Java ... Я написал следующий код:
Теперь, когда я запустил его с columnNumber = 29, он дает мне результат = "CA" (вместо "AC") любые комментарии, которые я пропускаю? Я знаю, что могу изменить это с помощью StringBuilder .... Но, глядя на ответ Грэма, я немного растерялся ...
источник
columnName = Convert.ToChar(65 + modulo).ToString() + columnName
(то есть значение + ColName). Хасан говорит:columnName += val;
(то есть ColName + значение)columnName = columnName + val
.Изысканная и элегантная версия Ruby :
источник
Это вопрос, который перенаправляют все остальные, а также Google, поэтому я публикую это здесь.
Многие из этих ответов верны, но слишком громоздки для простых ситуаций, например, когда у вас нет более 26 столбцов. Если у вас есть какие-либо сомнения в том, что вы можете перейти в двухбуквенные столбцы, тогда проигнорируйте этот ответ, но если вы уверены, что этого не сделаете, вы можете сделать это так же просто, как это в C #:
Черт возьми, если вы уверены в том, что вы передаете, вы можете даже удалить проверку и использовать эту строку:
Это будет очень похоже на многие языки, так что вы можете адаптировать его по мере необходимости.
Опять же, используйте это , только если вы на 100% уверены, что у вас не будет более 26 столбцов .
источник
Спасибо за ответы здесь! помог мне придумать эти вспомогательные функции для некоторого взаимодействия с API Google Sheets, над которым я работаю в Elixir / Phoenix
вот что я придумал (возможно, мог бы использовать дополнительную проверку и обработку ошибок)
В эликсире:
И обратная функция:
И некоторые тесты:
источник