none
Importar Excel .xls para DataSet RRS feed

  • Pergunta

  • Boa tarde Pessoal,

     

    Eu to com um problema aqui que não consigo resolver: Eu tenho um arquivo .xls que eu preciso importá-lo para dentro de um DataSet.

    Eu estou fazendo o seguinte método:

     

     

    public static DataSet ExcelData()

            {

                try

                {               

                    string fileName = "C:\\imoveis_18.xls";                                                           

     

    OleDbConnection dbConnection = new OleDbConnection(@"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\imoveis_18.xls;Extended Properties=""Excel 8.0;HDR=Yes;""");

                    dbConnection.Open();

     

                    Microsoft.Office.Interop.Excel.Application app = new Microsoft.Office.Interop.Excel.Application();                           

                    **Microsoft.Office.Interop.Excel.Workbook workbook = app.Workbooks.Open(fileName);

                    Microsoft.Office.Interop.Excel.Worksheet worksheet = workbook.Worksheets[1] as Microsoft.Office.Interop.Excel.Worksheet;

     

                    foreach (Microsoft.Office.Interop.Excel.Worksheet worksheet2 in workbook.Worksheets)

                    {

                        string firstSheetName = worksheet2.Name;                

                        OleDbCommand dbCommand = new OleDbCommand("SELECT * FROM [" + firstSheetName + "$"+ "]", dbConnection);                   

                        OleDbDataAdapter oAdapter = new OleDbDataAdapter();

                        oAdapter.SelectCommand = dbCommand;

     

                        DataSet oDataSet = new DataSet();

                        oAdapter.Fill(oDataSet);                   

                    }

     

    **Porém na linha em que eu marquei com ** tá gerando uma exceção

    'imoveis_18.xls' não pode ser acessado. O arquivo pode estar corrompido, localizado em um servidor que não está respondendo ou ser somente leitura.


    Só que meu arquivo está com todos os acessos liberados pra qualquer usuário da máquina. Já andei pesquisando no Google e não achei nada!

     

    POR FAVOR, se alguém puder me ajudar ou souber de outro código melhor pra eu importar um .xls para um DataSet.

     

    Obrigado.

     

     

    quinta-feira, 6 de outubro de 2011 17:16

Respostas

  • Você está fechando a conexão depois de ler o arquivo?

    eis como deixeo o seu código funcionando na minha máquina, roda quantas vezes eu mandar com sucesso :)

    public DataSet ExcelData()
            {
                string fileName = @"C:\Users\c008218\Documents\imoveis_18.xls";
                Microsoft.Office.Interop.Excel.Application app = new Microsoft.Office.Interop.Excel.Application();
                Microsoft.Office.Interop.Excel.Workbook workbook = app.Workbooks.Open(fileName);
                
                OleDbConnection dbConnection = new OleDbConnection(@"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\Users\c008218\Documents\imoveis_18.xls;Extended Properties=""Excel 8.0;HDR=Yes;""");
                try
                {
    
                    
                    dbConnection.Open();
    
                    
    
                    Microsoft.Office.Interop.Excel.Worksheet worksheet = workbook.Worksheets[1] as Microsoft.Office.Interop.Excel.Worksheet;
    
                    foreach (Microsoft.Office.Interop.Excel.Worksheet worksheet2 in workbook.Worksheets)
                    {
    
                        string firstSheetName = worksheet2.Name;
    
                        OleDbCommand dbCommand = new OleDbCommand("SELECT * FROM [" + firstSheetName + "$" + "]", dbConnection);
    
                        OleDbDataAdapter oAdapter = new OleDbDataAdapter();
    
                        oAdapter.SelectCommand = dbCommand;
    
                        DataSet oDataSet = new DataSet();
    
                        oAdapter.Fill(oDataSet);
                        return oDataSet;
                    }
                    return null;
                }
                catch (Exception ex)
                {
                    throw ex;
                }
                finally
                {
                    workbook.Close();
                    dbConnection.Close();
                }
            }
        }
    



    Olavo Oliveira Neto
    http://olavooneto.wordpress.com
    Twitter @Olavooneto
    Se for útil marque como resposta e faça um Developer feliz :)
    • Sugerido como Resposta Olavo Oliveira NetoModerator quinta-feira, 6 de outubro de 2011 23:31
    • Marcado como Resposta Gacc sexta-feira, 7 de outubro de 2011 12:36
    quinta-feira, 6 de outubro de 2011 20:01
    Moderador

Todas as Respostas

  • Voce ja tentou criar um arquivo novo no excel e tentou exportar esse arquivo? Isso é para validar se o problema esta no processo ou no arquivo.

    Abaixo um meio alternativo de export:

     

    using (CSVReader csv = new CSVReader(strFileName))
    {
        string[] fields;
        DataTable oTable = new DataTable();
        DataRow oRows;
        oTable = ds.Tables[dataTableIndex];
        int intCounter = 0;
        while ((fields = csv.GetCSVLine()) != null)
        {
            oRows = oTable.NewRow();
            foreach (string field in fields)
            {
                oRows[intCounter] = field;
                intCounter = intCounter + 1;
            }
            intCounter = 0;
            oTable.Rows.Add(oRows);
        }
    }


    Vinicius Nunes Macedo
    quinta-feira, 6 de outubro de 2011 17:41
  • Vinicius, mto obrigado pela resposta.

     

    Eu estou fazendo este método em Windows.application.

     

    Vc teria a dll do CSVReader pra me enviar? Ou sabe onde posso pegá-la?

    quinta-feira, 6 de outubro de 2011 17:54
  • http://www.codeproject.com/KB/database/CsvReader.aspx
    Vinicius Nunes Macedo
    quinta-feira, 6 de outubro de 2011 18:18
  • Vinicius eu referenciei a DLL LumenWorks.Framework.IO.Csv mas não funcionou.

     

    E na verade meu arquivo esta em .xls e não .csv.

     

    To procurando alguma solução no google mas nao estou conseguindo.

     

    Preciso importar um .xls para um DataSet!

     

    Pode me ajudar com algum outro código?

     

    Obrigado.

    quinta-feira, 6 de outubro de 2011 18:35
  • Esse link tem ate codigo para baixar.... http://www.codeproject.com/KB/office/ExcelToDataset.aspx

    ve se ajuda.


    Vinicius Nunes Macedo
    quinta-feira, 6 de outubro de 2011 18:53
  • Vinicius eu entrei e coloquei o código.

    Mas ta dando um mesmo problema que já ocorreu comigo. Nesta parte do código:

     

    DataTable schemaTable = conn.GetOleDbSchemaTable(

                      OleDbSchemaGuid.Tables, new object[] { null, null, null, "TABLE" });

    Ontem estava retornando normalmente, agora a partir de hoje não consigo mais pegar o schema do arquivo.

     

    Vc sabe dizer o problema disso? Pesquisei aqui no google e algumas pessoas já tiveram isso também. VEja esse link:

    http://social.msdn.microsoft.com/Forums/en/adodotnetdataproviders/thread/b70e021c-00e8-4c5f-b1e8-a05025f1f577

     

    quinta-feira, 6 de outubro de 2011 19:29
  • Amigo, consegui executar seu código com sucesso. a unica diferença foi que coloquei a planilha dentro da pasta de documentos do meu usuário logado. Entenda que o Windows 7 tem serias restrições de segurança. Provavelmente o VIsual Studio está tentando criar algum arquivo temporário no diretorio aonde o seu arquivo XLS está. Mas devido as restrições de segurança ele não está conseguindo. Se quiser tentar, de permissão para TODOS no C:\, e tente novamente.
    Olavo Oliveira Neto
    http://olavooneto.wordpress.com
    Twitter @Olavooneto
    Se for útil marque como resposta e faça um Developer feliz :)
    quinta-feira, 6 de outubro de 2011 19:33
    Moderador
  • Oi Olavo, obrigado pela resposta.

     

    Então...eu ja troquei este arquivo de pastas, já coloquei no C:, nos documentos do meu usuario logado...ta dificil !

     

    Eu ja consegui algumas vezes acessar o arquivo. Mas daí, qndo vou testar de novo, do nada ele não permite..não deixa! Da essa mensagem de erro:

    'imoveis_18.xls' não pode ser acessado. O arquivo pode estar corrompido, localizado em um servidor que não está respondendo ou ser somente leitura.

    Esta mensagem ocorre qndo eu tento utilizar o Microsoft.Office.Interop.Excel.Workbook.

     

    Agora quando eu tento utiliza OleDb ocorre outro problema:

    DataTable schemaTable = conn.GetOleDbSchemaTable(

                      OleDbSchemaGuid.Tables, new object[] { null, null, null, "TABLE" });

     

    Quando abro o schema ele retorna nenhuma linha do arquivo Excel.

     

    Quem tiver uma luz pra ajuda...obrigado!

     

     

    Eu 

    quinta-feira, 6 de outubro de 2011 19:53
  • Você está fechando a conexão depois de ler o arquivo?

    eis como deixeo o seu código funcionando na minha máquina, roda quantas vezes eu mandar com sucesso :)

    public DataSet ExcelData()
            {
                string fileName = @"C:\Users\c008218\Documents\imoveis_18.xls";
                Microsoft.Office.Interop.Excel.Application app = new Microsoft.Office.Interop.Excel.Application();
                Microsoft.Office.Interop.Excel.Workbook workbook = app.Workbooks.Open(fileName);
                
                OleDbConnection dbConnection = new OleDbConnection(@"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\Users\c008218\Documents\imoveis_18.xls;Extended Properties=""Excel 8.0;HDR=Yes;""");
                try
                {
    
                    
                    dbConnection.Open();
    
                    
    
                    Microsoft.Office.Interop.Excel.Worksheet worksheet = workbook.Worksheets[1] as Microsoft.Office.Interop.Excel.Worksheet;
    
                    foreach (Microsoft.Office.Interop.Excel.Worksheet worksheet2 in workbook.Worksheets)
                    {
    
                        string firstSheetName = worksheet2.Name;
    
                        OleDbCommand dbCommand = new OleDbCommand("SELECT * FROM [" + firstSheetName + "$" + "]", dbConnection);
    
                        OleDbDataAdapter oAdapter = new OleDbDataAdapter();
    
                        oAdapter.SelectCommand = dbCommand;
    
                        DataSet oDataSet = new DataSet();
    
                        oAdapter.Fill(oDataSet);
                        return oDataSet;
                    }
                    return null;
                }
                catch (Exception ex)
                {
                    throw ex;
                }
                finally
                {
                    workbook.Close();
                    dbConnection.Close();
                }
            }
        }
    



    Olavo Oliveira Neto
    http://olavooneto.wordpress.com
    Twitter @Olavooneto
    Se for útil marque como resposta e faça um Developer feliz :)
    • Sugerido como Resposta Olavo Oliveira NetoModerator quinta-feira, 6 de outubro de 2011 23:31
    • Marcado como Resposta Gacc sexta-feira, 7 de outubro de 2011 12:36
    quinta-feira, 6 de outubro de 2011 20:01
    Moderador
  • Fiz um post com um exemplo só que em vb, talvez te ajude é só usar um conversor.

    http://www.maestrodotnet.com.br/?p=439


    Bruno Ferreira de Souza
    MSP - Microsoft Student Partner
    MCTS .NET Framework - Windows Applications
    MCPD .NET Framework - Windows Applications
    MCC - Microsoft Community Contributor
    www.maestrodotnet.com.br
    @BrunoMaestro

    sexta-feira, 7 de outubro de 2011 00:14
  • Olavo, acredito que era isso mesmo!

     

    Realmente não estava fechando a conexão...a principio testei aqui e ta dando certo!

     

    Qq coisa eu retorno aqui!

     

    Muito obrigado!

    sexta-feira, 7 de outubro de 2011 12:36