Este artigo surgiu de uma necessidade profissional de importar dados de uma planilha para um banco de dados porém era um sistema web e eu não podia instalar o interop do Office no servidor. Porntanto utilizei a Família OleDB do ADO para fazer essa importação e passei a não precisar mais do office para fazer importação de dados de planilha.<br />
A Leitura de uma planilha utilizando ADO funciona exatamente como se fosse uma leitura de um banco de dados qualquer, a única diferença é que devemos identificar qual a região da planilha deve ser lida quando vamos criar nosso select. O quadro abaixo exemplifica um select que lê a aba Sheet1 e começa na célula C3 e termina na célula W15

Select * from [Sheet1$C3:W15]

Para facilitar a didática fiz um protótipo que está disponível aqui e como podemos ver na figura a seguir é dividido em dois projetos, um site para testar o framework de importação chamado aplicacao e um projeto que é uma biblioteca de 4 classes chamado framework.



Começando pelo framework que possui uma classe Intervalo que abstrai a região da planilha que será lida e uma classe Excel que é a principal classe porquê é a responsável por ler os dados da Planilha. A classe estática ExtencoesExcel possui métodos de extenção para recuperar os valores dos campos de forma tratada.



O algoritimo do quadro seguir demostra a utilização da classe Excel para o carregamento dos dados da planilha e está em Default.aspx.cs do projeto aplicao

        private void carregaGrid(string path/* Caminho do arquivo xls */)
        {
            Excel _excel = new Excel(path);
            List _lista = _excel.getTodos(
                new Intervalo("Sheet1") { fim = "D" }, //Inicia na Célula A1 e vai até a coluna D, na aba Sheet1
                dados => //Método de montagem de Pessoas
                {
                    Pessoa _retorno = new Pessoa();
                    //...
                    _retorno.nome = dados.getValorCampo("Nome");
                    _retorno.nascimento = dados.getValorCampo("Nascimento");
                    _retorno.email = dados.getValorCampo("Email");
                    _retorno.filhos = dados.getValorCampo("Filhos");
                    //...
                    return _retorno;
                }
            );
            gvListagem.DataSource = _lista;
            gvListagem.DataBind();
        }