Como você converte um número numérico em um nome de coluna do Excel em C # sem usar a automação para obter o valor diretamente do Excel.
O Excel 2007 tem um intervalo possível de 1 a 16384, que é o número de colunas que ele oferece suporte. Os valores resultantes devem estar na forma de nomes de colunas do Excel, por exemplo, A, AA, AAA etc.
Respostas:
Aqui está como eu faço:
fonte
StringBuilder
. Demora cerca do dobro do tempo. É uma sequência muito curta (no máximo 3 caracteres - o Excel 2010 vai até a coluna XFD), portanto, no máximo 2 concatenações de sequência. (Eu usei 100 iterações para traduzir os números inteiros 1 a 16384, ou seja, as colunas Excel A a XFD, como teste).modulo
, chamarToString()
e aplicar o(int)
elenco. Considerando que na maioria dos casos no mundo C # você começaria a numerar de 0, aqui está minha revisão: <! - language: c # -> string estática pública GetColumnName (int index) // com base em zero {const byte BASE = 'Z '-' A '+ 1; nome da string = String.Empty; do {name = Convert.ToChar ('A' + índice% BASE) + nome; índice = índice / BASE - 1; } while (índice> = 0); nome de retorno; }Se alguém precisar fazer isso no Excel sem o VBA, aqui está uma maneira:
onde colNum é o número da coluna
E no VBA:
fonte
Desculpe, este é Python em vez de C #, mas pelo menos os resultados estão corretos:
fonte
Você pode precisar de conversão nos dois sentidos, por exemplo, do endereço da coluna do Excel como AAZ para número inteiro e de qualquer número inteiro para o Excel. Os dois métodos abaixo farão exatamente isso. Assume uma indexação baseada em 1, o primeiro elemento em suas "matrizes" é o número 1 do elemento. Aqui não há limites de tamanho, então você pode usar endereços como ERROR e esse seria o número da coluna 2613824 ...
fonte
Descobri um erro no meu primeiro post, então decidi me sentar e fazer as contas. O que descobri é que o sistema numérico usado para identificar as colunas do Excel não é um sistema básico 26, como outra pessoa postou. Considere o seguinte na base 10. Você também pode fazer isso com as letras do alfabeto.
Espaço: ......................... S1, S2, S3: S1, S2, S3
............ ....................... 0, 00, 000: .. A, AA, AAA
............. ....................... 1, 01, 001: .. B, AB, AAB
.............. ......................…,…,…: ..…,…,…
............... ..................... 9, 99, 999: .. Z, ZZ, ZZZ
Total de estados no espaço: 10, 100, 1000: 26, 676, 17576
Total de estados: ............... 1110 ................ 18278
O Excel numera colunas nos espaços alfabéticos individuais usando a base 26. Você pode ver que, em geral, a progressão do espaço de estados é a, a ^ 2, a ^ 3,… para alguma base a, e o número total de estados é a + a ^ 2 + a ^ 3 +….
Suponha que você queira encontrar o número total de estados A nos primeiros N espaços. A fórmula para fazer isso é A = (a) (a ^ N - 1) / (a-1). Isso é importante porque precisamos encontrar o espaço N que corresponde ao nosso índice K. Se eu quiser descobrir onde K se encontra no sistema numérico, preciso substituir A por K e resolver por N. A solução é N = log { base a} (A (a-1) / a +1). Se eu usar o exemplo de a = 10 e K = 192, sei que N = 2,23804…. Isso me diz que K está no início do terceiro espaço, pois é um pouco maior que dois.
O próximo passo é descobrir exatamente a que distância estamos do espaço atual. Para encontrar isso, subtraia de K o A gerado usando o piso de N. Neste exemplo, o piso de N é dois. Portanto, A = (10) (10 ^ 2 - 1) / (10-1) = 110, conforme o esperado quando você combina os estados dos dois primeiros espaços. Isso precisa ser subtraído de K, porque esses primeiros 110 estados já teriam sido contabilizados nos dois primeiros espaços. Isso nos deixa com 82 estados. Portanto, neste sistema numérico, a representação de 192 na base 10 é 082.
O código C # usando um índice base zero é
// Postagem antiga
Uma solução baseada em zero em C #.
fonte
Atualização : O comentário de Peter está certo. É o que recebo para escrever código no navegador. :-) Minha solução não estava compilando, estava faltando a letra mais à esquerda e estava construindo a sequência na ordem inversa - tudo agora corrigido.
Bugs à parte, o algoritmo está basicamente convertendo um número da base 10 para a base 26.
Atualização 2 : Joel Coehoorn está certo - o código acima retornará AB para 27. Se fosse o número base 26 real, AA seria igual a A e o próximo número depois de Z seria BA.
fonte
Fácil com recursão.
fonte
Apenas lançando uma implementação simples de C # de duas linhas usando recursão, porque todas as respostas aqui parecem muito mais complicadas do que o necessário.
fonte
..E convertido em php:
fonte
ord('A')
vez de 65.Estou surpreso que todas as soluções até agora contenham iteração ou recursão.
Aqui está a minha solução que é executada em tempo constante (sem loops). Esta solução funciona para todas as colunas possíveis do Excel e verifica se a entrada pode ser transformada em uma coluna do Excel. As colunas possíveis estão no intervalo [A, XFD] ou [1, 16384]. (Isso depende da sua versão do Excel)
fonte
int
é, o nome da coluna resultante poderia ser arbitrariamente longo (que é o caso da resposta python, por exemplo)Esta resposta está em javaScript:
fonte
A mesma implementação em Java
fonte
Depois de examinar todas as versões fornecidas aqui, desci para fazer uma, usando recursão.
Aqui está a minha versão do vb.net:
fonte
Um pouco tarde para o jogo, mas aqui está o código que eu uso (em C #):
fonte
IndexOf
é bastante lento, é melhor pré-calcular o mapeamento reverso.Eu queria jogar na minha classe estática que eu uso, para interoperabilidade entre o índice col e o col Label. Eu uso uma resposta aceita modificada para o meu método ColumnLabel
Use isso como ...
fonte
se você apenas deseja uma fórmula de célula sem código, aqui está uma fórmula:
fonte
Em Delphi (Pascal):
fonte
Não é exatamente a base 26, não há 0 no sistema. Se houvesse, 'Z' seria seguido por 'BA' e não por 'AA'.
fonte
Em perl, para uma entrada de 1 (A), 27 (AA) etc.
fonte
Refinando a solução original (em C #):
fonte
Aqui está uma versão do Actionscript:
fonte
Solução JavaScript
fonte
Estes meus códigos para converter um número específico (o índice começa em 1) na coluna do Excel.
Meu teste de unidade:
fonte
Embora eu esteja atrasado para o jogo, a resposta de Graham está longe de ser ótima. Particularmente, você não precisa usar o elenco
modulo
, ligarToString()
e aplicar o(int)
elenco. Considerando que na maioria dos casos no mundo C # você começaria a numerar de 0, aqui está minha revisão:fonte
Outra maneira de VBA
fonte
Aqui está minha implementação super tardia em PHP. Este é recursivo. Eu escrevi antes de encontrar este post. Eu queria ver se outras pessoas já haviam resolvido esse problema ...
fonte
Estou tentando fazer a mesma coisa em Java ... Eu escrevi o seguinte código:
Agora, quando eu o executei com columnNumber = 29, ele me dará o resultado = "CA" (em vez de "AC") algum comentário do que estou perdendo? Eu sei que posso revertê-lo por StringBuilder .... Mas, olhando para a resposta de Graham, estou um pouco confuso ...
fonte
columnName = Convert.ToChar(65 + modulo).ToString() + columnName
(ou seja, valor + ColName). Hasan diz:columnName += val;
(ie ColName + valor)columnName = columnName + val
.Versão Ruby coerente e elegante :
fonte
Esta é a pergunta que todos os outros, bem como o Google redirecionam, estou postando isso aqui.
Muitas dessas respostas estão corretas, mas são muito complicadas para situações simples, como quando você não tem mais de 26 colunas. Se você tiver alguma dúvida se pode entrar em colunas de caracteres duplos, ignore esta resposta, mas se tiver certeza de que não, poderá fazê-lo da maneira mais simples possível em C #:
Caramba, se você está confiante sobre o que está passando, pode até remover a validação e usar esta linha:
Isso será muito semelhante em muitos idiomas, para que você possa adaptá-lo conforme necessário.
Novamente, use isso apenas se tiver 100% de certeza de que não terá mais de 26 colunas .
fonte
Obrigado pelas respostas aqui !! me ajudou a criar essas funções auxiliares para alguma interação com a API do Google Sheets em que estou trabalhando no Elixir / Phoenix
aqui está o que eu vim com (provavelmente poderia usar alguma validação extra e tratamento de erros)
No Elixir:
E a função inversa:
E alguns testes:
fonte