DevMedia - asp.net, Java, Delphi, SQL e web Design, tudo em um só lugar!
Bem vindo a DevMedia!
LOGIN:     SENHA:
 
 

Função para retornar Célula do Excel – C#

Hoje vou passar para vocês uma função que converte uma determinada linha/coluna em uma célula do excel. Isso pode ser necessário quando manipulamos planilhas do excel.

[fechar]

Você não gostou da qualidade deste conteúdo?

(opcional) Você gostaria de comentar o que não lhe agradou?



Olá pessoal, trabalhando na exportação de uma planilha para o excel me deparei com a necessidade de gerar o relatório com fórmulas, sendo que estas fórmulas iriam variar de acordo com os dados do relatório. Me vi então diante da necessidade de converter uma determinada linha/coluna em uma célula do excel, visto que o número de colunas era dinâmico, chegando facilmente na casa de dezenas. Por exemplo, coluna 30 equivale a coluna AD do excel.

Diante disso criei uma classe com duas funções para atender a esta necessidade, classe esta que venho compartilhar com vocês:

    public class ExcelUtil

    {

        //Array com as letras das colunas

        public static String[] letras = { "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M",

                                          "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z"};

        //Função que retornar a letra da coluna pelo índice

        public static String GetColumnLetterByIndex(Int32 col){

            String celula = "";

            //Aqui verificamos se a coluna passada é maior do que 26

            //pois 26 equivale a ultima letra do excel, "Z"

            //a partir daí começamos a ter duas letras... AA, AB, AC, AD...

            if (col > 26)

            {

                //Aqui pegamos o valor absoluto do resultado da divisão do numero da coluna por 26

                //Este é o indice da primeira letra de nossa coluna

                //Ex.: Col = 50 -> 50/26 = 1,92

                //     idxPrimeiraLetra = 1

                Int32 idxPrimeiraLetra = Math.Abs(col / 26);

                //Para buscarmos o segundo índice, precisamos de um cálculo diferente

                //Devemos pegar a diferença entre o indice da coluna a ser localizada

                //e resultado da multiplicacao do indice da primeira letra por 26

                //Ex.: idxSegundaLetra = 50 - (1 * 26)

                //     idxSegundaLetra = 24

                Int32 idxSegundaLetra = col - (Math.Abs(col / 26) * 26);

                //Aqui verificamos se o indice da segunda letra é zero

                //isto acontecerá quando a coluna localizada for multiplo de 26, neste caso precisamos

                //considerar a ultima letra, sendo esta o índice 25 de nosso array

                //Caso contrário, retornamos concatenado de acordo com nosso array

                //as letras do indice da primeira e segunda letras respectivamente

                //Ex.: idxPrimeiraLetra = 1

                //     idxSegundaLetra = 24

                //     celula = AX

                if (idxSegundaLetra == 0)

                    celula = String.Concat(letras[idxPrimeiraLetra - 2], letras[25]);

                else

                    celula = String.Concat(letras[idxPrimeiraLetra - 1], letras[idxSegundaLetra - 1]);

            }else

                //Se for menor que 26, não há calculos a fazer, basta localizarmos no array

                celula = letras[col - 1];

            return celula;

        }

        //Função que retorna a célula pelo indice da coluna e número da linha

        public static String GetCelulaByColumnIndex(Int32 col, Int32 row){

            //buscamos a letra referente a coluna

            String celula = GetColumnLetterByIndex(col);

            //concatenamos com a linha passada no parâmetro

            return String.Concat(celula, row.ToString());

        }       

    }

É isso aí pessoal, vou ficando por aqui, 


Fiquem a vontade para dar feedback, críticas e sugestões de novos temas para os próximos artigos.

Um abraço.
Ricardo Coelho.
http://www.agilexp.blogspot.com/


Ricardo Da Silva Coelho
Graduado em Analise de Sistemas, Pós-graduando em Engenharia de software, mais de 7 anos de experiência em desenvolvimento de software, onde atuou em projetos de diversos seguimentos como varejo, telecomunicações, ERPs etc e nas mais variadas plataformas(Desktop, Web e Mobile). Articulista do portal...
O que você achou deste post?

    4 COMENTÁRIOS

[Fechar]

Este post é fechado - você precisa ter acesso ao post para incluir um comentário.



Thiago
Para essa função funcionar o usuário ou o servidor precisam ter o pacote Office instalado?

Obrigado!
[há +1 ano] - Responder

 

[autor] Ricardo Da Silva Coelho
Olá Thiago, creio que você não tenha entendido o propósito da função.

Esta função não retorna um objeto do tipo "Célula do Excel", ele retorna o nome da célula a partir de seu indice.

Ou seja, se quero a coluna 3, entao a funcao vai retornar "C" e assim sucessivamente.

Escrevi três posts sobre exportação para o excel:

http://www.devmedia.com.br/post-18115-Exportacao-para-o-Excel-em--Net-Formatando-celulas.html
http://www.devmedia.com.br/post-18114-Exportacao-para-o-Excel-em--Net-Realizando-uma-exportacao-simples.html
http://www.devmedia.com.br/post-18113-Exportacao-para-o-Excel-em--Net-Introducao.html

Neles falo sobre interação da aplicação com planilhas do excel e respondendo a sua pergunta, Sim, precisa do excel instalado poisa biblioteca do .net fará uso do excel para realizar a exportação dos dados. E o excel precisa estar instalado onde a aplicação estiver sendo executada.

Att
Ricardo Coelho.
[há +1 ano] - Responder
 

Ezequiel Matias
Ola tudo certo?

Achei interessante o que tu colocou pra nos, eu gostaria de saber se tu pode me ajudar!
Eu tenho que exportar uma StringGrid (Delphi 7) para uma planilha do Excel, eu ate consegui, so que criei uma Tstringlist e ela coloca somente em uma coluna e gostaria de criar mais colunas tipo

COLUNAS:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
L| 1
I| 2
N| 3
H| 4
A| 5
S| 6

Obrigado
[há +1 ano] - Responder

 

[autor] Ricardo Da Silva Coelho
Olá Ezequiel,

Pelo que entendi você quer exportar os dados de um StringGrid para o excel mas só está conseguindo exportar uma única coluna do seu StringGrid.
Neste caso você vai ter que fazer dois loops, um para as linhas e outro para as colunas. Por exemplo:

for i := 1 SuaStringGrid.RowCount do
begin
for j := 1 to SuaStringGrid.ColCount do
begin
//ROTINA PARA EXPORTAR NA CELULA DO EXCEL PODENDO
//USAR O IDENTIFICADOR DA CELULA(A1,A2,A3 etc...)
//com o método GetCelulaByColumnIndex(j, i).
end;
end;

Ahhh, já ia esquecendo, feliz natal amigo.

P.S.: E eu que achei que era o único louco a estar programando às véspera do natal rsrs.
[há +1 ano] - Responder
 
Cursos relacionados
Publicidade
[Fechar]

Você precisa estar logado para dar um feedback.

Clique aqui para efetuar o login
[Fechar]


Este post está fechado. Saiba mais sobre a assinatura MVP!
web-03
DevMedia  |  Anuncie  |  Fale conosco
Hospedagem web por Porta 80 Web Hosting
2013 - Todos os Direitos Reservados a web-03