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

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/