segunda-feira, dezembro 10, 2007

Importar dados do Excel com C#

Após muito procurar pela internet como fazer uma simples leitura dos dados num ficheiro excel, cheguei a uma solução que considero fácil de perceber. As soluções que encontrei passavam sempre por abrir uma conecção OleDb que eu queria evitar por achar que não deveria ser preciso tanto, achava (e bem) que conseguia através de objectos/métodos recolher a informação de determinadas células.

O primeiro coisa a fazer é adicional uma referência para a dll de COM com o nome "Microsoft Excel 11.0 Object Library". Depois, e ainda não percebi porquê, é necessário que os regional settings da máquina estejam iguais aos do Excel, se não levamos com a excepção "Old format or invalid type library".

O código é tão simples como o seguinte:
private static void ReadExcelInfo(string fullFilePath)
{
    //Get Excel interop object
    Application objExcel = new Application();

    //Validate object allocation
    if (objExcel == null)
    {
           return;
    }

    //Don't show Excel windows
    objExcel.Visible = false;

    //Open a connection to the excel file
    Workbook objWorkbook = objExcel.Workbooks.Open(fullFilePath, 0, true, 5,"", "",
                                             true, XlPlatform.xlWindows, "\t",
                                             false, false, 0, true,null,null);

    //Get sheets collection
    Sheets sheets = objWorkbook.Worksheets;

    //Get first sheet (like others interop objects the start index is 1)
    Worksheet objWorkSheet = (Worksheet) sheets.get_Item(1);

    //Get cell value from A1 to A3
      for (int i = 1; i <= 3; ++i)      
     {      
          string data = (string) objWorkSheet.get_Range("A"+i.ToString(), Missing.Value ).Text;
     }
    //Close the connection
    objWorkbook.Close(false,null,null);
}

4 comentários:

Anónimo disse...

não te esqueças isso que abre um processo de Excel, igual em tudo a abrir a aplicação Excel num desktop. Isso num servidor pode ser overkill, a solução mais escalável e by-the-book é mesmo utilizar uma conexão oledb ou equivalente.

Tiago Sousa disse...

Tens toda a razão, eu não dei todo o meu contexto. O meu cenário é de inicialização de dados, imagina que são valores por omissão que vais receber como requisitos da tua aplicação, e já que recebo vários ficheiros xls com o mesmo formato aproveito para me poupar trabalho e crio um processo automático em vez de andar a copiar os dados um por um, o que era de todo impensável. Isto é feito uma única vez, ficando os dados armazenados na base de dados.

Ylton Guarnieri disse...

Olá...
Você determinou a leitura de A1 a A3. Tem como eu fazer um loop dinâmico, por exemplo, até onde a planilha tem dados? Obrigado.

Tiago Sousa disse...

Sugiro que vejas um post mais recente que fiz sobre o assunto.

Nos meus loops o que faço é verificar se a linha corrente tem dados, se não tiver assumo que a restante folha está vazia. Mas esta condição de paragem depende totalmente do modelo que tiveres no excel, se permitires linhas vazias vais ter de encontrar outra condição de paragem. Na pior das hipóteses tens de ler até ao fim do excel.