none
[RESOLVIDO]como importar uma tabela do excel para o access ? RRS feed

  • Pergunta

  • oi eu estou tentando automatizar algumas coisas aqui estou usando c# e access 2010 como DB.]

    o meu problema esta na hora de importar para o access uma tabela do Excel. eu tentei usar um macro pronto do access mas me falaram que era inviável pois o Usuário iria ter que entrar no access para importar a tabela e isso deveria ser feiro direto do programa. mas eu não sei como fazer isso =/. me falaram pra usar o interup ou jet db mas não estou conseguindo. sou novo no ramo ira ficar muito grato se alguém me ajuda-se.

    Obrigado.



    terça-feira, 13 de agosto de 2013 18:00

Respostas

  • o lbltable seria o nome da tabela

    Julio Arruda __________________________________ Se foi util, marque como resposta

    • Sugerido como Resposta Julio ArrudaMVP quarta-feira, 14 de agosto de 2013 13:07
    • Marcado como Resposta Guilherme Gamboa quarta-feira, 14 de agosto de 2013 13:21
    quarta-feira, 14 de agosto de 2013 13:07
  • obrigado julio eu fiz as mudanças com os nomes do meu manco e planilhas mas ele esta dando o seguinte erro :

     O mecanismo de banco de dados do Microsoft Access não pôde encontrar o objeto 'Pasta1'. Verifique se o objeto existe e se você digitou o nome e o caminho corretamente. Se 'Pasta1' não for um objeto local, verifique a conexão de rede ou contate o administrador do servidor.

    outra duvida eh se seria o nome da tabela access ou da folha do excel 

    o codigo ficou assim :

    OleDbConnection conn = new OleDbConnection(("Provider=Microsoft.ACE.OLEDB.12.0; " + ("data source=C:\\Pasta1.xlsx; " + "Extended Properties=Excel 12.0;")));
                // Select the data from Sheet1 of the workbook.
    
    
                OleDbDataAdapter ada = new OleDbDataAdapter("select * from Pasta1", conn);
                DataSet ds = new DataSet();
    
                ada.Fill(ds);
                conn.Close();
    
    
                OleDbConnection myConnection = new OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=\"C:\\Database.accdb\";Persist Security Info=False;");
                myConnection.Open();
    
                string queryString = "SELECT * from Teste Teste  ";//+ lblTable.Text;
    
                OleDbDataAdapter adapter = new OleDbDataAdapter(queryString, myConnection);
    
                DataTable dtAccess = new DataTable();
    
                DataTable dtCSV = new DataTable();
    
                dtCSV = ds.Tables[0];
    
                using (new OleDbCommandBuilder(adapter))
                {
                    adapter.Fill(dtAccess);
                    dtAccess.Merge(dtCSV);
                    adapter.Update(dtAccess);
                }
    
                myConnection.Close();

    Tenta colocar assim "Select * from [Plan1$]"

    onde [Plan1$] é o nome da guia da planilha que está utilizando


    Julio Arruda __________________________________ Se foi util, marque como resposta

    • Sugerido como Resposta Julio ArrudaMVP quarta-feira, 14 de agosto de 2013 13:28
    • Marcado como Resposta Guilherme Gamboa quarta-feira, 14 de agosto de 2013 13:33
    quarta-feira, 14 de agosto de 2013 13:28
  • Tudo depende de como esta sua tabela excel.

    Para isso vc deve ler a tabela excel no C#, armazenar a leitura em um datatable e depois usar esse datatable para atualizar o access,

    Para ler uma planilha do excel com C# faça assim:

    OleDbConnection conn = new OleDb.OleDbConnection(("provider=Microsoft.Jet.OLEDB.4.0; " + ("data source=C:\\myData.xls; " + "Extended Properties=Excel 8.0;")));
    // Select the data from Sheet1 of the workbook.
    OleDbDataAdapter ada = new OleDbDataAdapter("select * from Sheet1$]", conn);
    DataSet ds = new DataSet();
    ada.Fill(ds);
    conn.Close();

    Como eu disse... isso só vai funcionar se seu excel for bem simples, sem formatos, formulas, macros, sem colunas mescladas... tem que ser algo bem linear.

    Caso nao seja, sugiro que vc crie uma macro no excel que crie uma nova folha(sheet) contendo somente os dados que sejam interessansantes para importaçao.

    Depois do datatable criado, fica bem facil exportar para excel com c#

    OleDbConnection myConnection = new OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=\"C:\\Database.accdb\";Persist Security Info=False;");
                    myConnection.Open();
    
                    string queryString = "SELECT * from " + lblTable.Text;
    
                    OleDbDataAdapter adapter = new OleDbDataAdapter(queryString, myConnection);
    
                    DataTable dtAccess = new DataTable();
    
                    DataTable dtCSV = new DataTable();
    
                    dtCSV = ds.Tables[0];
    
                    using (new OleDbCommandBuilder(adapter))
                    {
                        adapter.Fill(dtAccess);
                        dtAccess.Merge(dtCSV);
                        adapter.Update(dtAccess);
                    }
    
                    myConnection.Close();

    a magica se faz com o comando merge.... para isso os dados do excel tem que o mesmo formato da tabela do access.

    Att


    William John Adam Trindade
    Analyste-programmeur
    ----------------------------------------------------------

    Sogi informatique ltée

    • Marcado como Resposta Guilherme Gamboa quarta-feira, 14 de agosto de 2013 13:21
    terça-feira, 13 de agosto de 2013 23:14
  • A ideia é criar um dataset com a tabela do access e fazer um merge com o dataset do excel.. por isso vc faz um select e o datapater se encarrega do resto.


    O problema que para isso a estrutura dos dados tem que ser identica.


    Uma outra coisa que pode ser feita (creio que seja mais simples e flexivel) é ao invez de usar o merge, usar um insert

    foreach (DataRow dtRow in dtCSV.Rows)
    {
    
    using (OleDbCommand cmd = myConnection.CreateCommand())
          {
               // create command with placeholders
               cmd.CommandText = 
                  "INSERT INTO teste"+
                  "(campo1,campo2,  campo3) "+
                  "VALUES(@campo1, @campo2, @campo3)";
    
               // add named parameters
               cmd.Parameters.AddRange(new OleDbParameter[]
               {
                   new OleDbParameter("@campo1", dtRow["campo1"]),
                   new OleDbParameter("@campo2", dtRow["campo2"]),
                   new OleDbParameter("@campo3", dtRow["campo3"])
               });
    
               // execute
               cmd.ExecuteNonQuery();
          }
    }

    com isso vc pode controlar o que vai em cada campo da tabela Teste.

    Att


    William John Adam Trindade
    Analyste-programmeur
    ----------------------------------------------------------

    Sogi informatique ltée


    quarta-feira, 14 de agosto de 2013 14:29

Todas as Respostas

  • Tudo depende de como esta sua tabela excel.

    Para isso vc deve ler a tabela excel no C#, armazenar a leitura em um datatable e depois usar esse datatable para atualizar o access,

    Para ler uma planilha do excel com C# faça assim:

    OleDbConnection conn = new OleDb.OleDbConnection(("provider=Microsoft.Jet.OLEDB.4.0; " + ("data source=C:\\myData.xls; " + "Extended Properties=Excel 8.0;")));
    // Select the data from Sheet1 of the workbook.
    OleDbDataAdapter ada = new OleDbDataAdapter("select * from Sheet1$]", conn);
    DataSet ds = new DataSet();
    ada.Fill(ds);
    conn.Close();

    Como eu disse... isso só vai funcionar se seu excel for bem simples, sem formatos, formulas, macros, sem colunas mescladas... tem que ser algo bem linear.

    Caso nao seja, sugiro que vc crie uma macro no excel que crie uma nova folha(sheet) contendo somente os dados que sejam interessansantes para importaçao.

    Depois do datatable criado, fica bem facil exportar para excel com c#

    OleDbConnection myConnection = new OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=\"C:\\Database.accdb\";Persist Security Info=False;");
                    myConnection.Open();
    
                    string queryString = "SELECT * from " + lblTable.Text;
    
                    OleDbDataAdapter adapter = new OleDbDataAdapter(queryString, myConnection);
    
                    DataTable dtAccess = new DataTable();
    
                    DataTable dtCSV = new DataTable();
    
                    dtCSV = ds.Tables[0];
    
                    using (new OleDbCommandBuilder(adapter))
                    {
                        adapter.Fill(dtAccess);
                        dtAccess.Merge(dtCSV);
                        adapter.Update(dtAccess);
                    }
    
                    myConnection.Close();

    a magica se faz com o comando merge.... para isso os dados do excel tem que o mesmo formato da tabela do access.

    Att


    William John Adam Trindade
    Analyste-programmeur
    ----------------------------------------------------------

    Sogi informatique ltée

    • Marcado como Resposta Guilherme Gamboa quarta-feira, 14 de agosto de 2013 13:21
    terça-feira, 13 de agosto de 2013 23:14
  • oi tudo bom William John Adam Trindade ?

    então eu acredito que a tabela seja bem simples sim, mas estou com duvidas.  

    o lblTable.text seria oq ? 

    quarta-feira, 14 de agosto de 2013 12:57
  • o lbltable seria o nome da tabela

    Julio Arruda __________________________________ Se foi util, marque como resposta

    • Sugerido como Resposta Julio ArrudaMVP quarta-feira, 14 de agosto de 2013 13:07
    • Marcado como Resposta Guilherme Gamboa quarta-feira, 14 de agosto de 2013 13:21
    quarta-feira, 14 de agosto de 2013 13:07
  • É o Nome da tabela dentro do access.. O metodo é generico e pode ser usado para importas diversas tabelas...

    É claro que vc tem que adaptar o codigo que eu forneci... O que eu postei é somente a ideia do que vc tem que fazer, pois eu nao conheço nem suas tabelas e nem o conteudo do excel...

    Att


    William John Adam Trindade
    Analyste-programmeur
    ----------------------------------------------------------

    Sogi informatique ltée

    quarta-feira, 14 de agosto de 2013 13:18
  • obrigado julio eu fiz as mudanças com os nomes do meu manco e planilhas mas ele esta dando o seguinte erro :

     O mecanismo de banco de dados do Microsoft Access não pôde encontrar o objeto 'Pasta1'. Verifique se o objeto existe e se você digitou o nome e o caminho corretamente. Se 'Pasta1' não for um objeto local, verifique a conexão de rede ou contate o administrador do servidor.

    outra duvida eh se seria o nome da tabela access ou da folha do excel 

    o codigo ficou assim :

    OleDbConnection conn = new OleDbConnection(("Provider=Microsoft.ACE.OLEDB.12.0; " + ("data source=C:\\Pasta1.xlsx; " + "Extended Properties=Excel 12.0;")));
                // Select the data from Sheet1 of the workbook.
    
    
                OleDbDataAdapter ada = new OleDbDataAdapter("select * from Pasta1", conn);
                DataSet ds = new DataSet();
    
                ada.Fill(ds);
                conn.Close();
    
    
                OleDbConnection myConnection = new OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=\"C:\\Database.accdb\";Persist Security Info=False;");
                myConnection.Open();
    
                string queryString = "SELECT * from Teste Teste  ";//+ lblTable.Text;
    
                OleDbDataAdapter adapter = new OleDbDataAdapter(queryString, myConnection);
    
                DataTable dtAccess = new DataTable();
    
                DataTable dtCSV = new DataTable();
    
                dtCSV = ds.Tables[0];
    
                using (new OleDbCommandBuilder(adapter))
                {
                    adapter.Fill(dtAccess);
                    dtAccess.Merge(dtCSV);
                    adapter.Update(dtAccess);
                }
    
                myConnection.Close();

    quarta-feira, 14 de agosto de 2013 13:25
  • obrigado julio eu fiz as mudanças com os nomes do meu manco e planilhas mas ele esta dando o seguinte erro :

     O mecanismo de banco de dados do Microsoft Access não pôde encontrar o objeto 'Pasta1'. Verifique se o objeto existe e se você digitou o nome e o caminho corretamente. Se 'Pasta1' não for um objeto local, verifique a conexão de rede ou contate o administrador do servidor.

    outra duvida eh se seria o nome da tabela access ou da folha do excel 

    o codigo ficou assim :

    OleDbConnection conn = new OleDbConnection(("Provider=Microsoft.ACE.OLEDB.12.0; " + ("data source=C:\\Pasta1.xlsx; " + "Extended Properties=Excel 12.0;")));
                // Select the data from Sheet1 of the workbook.
    
    
                OleDbDataAdapter ada = new OleDbDataAdapter("select * from Pasta1", conn);
                DataSet ds = new DataSet();
    
                ada.Fill(ds);
                conn.Close();
    
    
                OleDbConnection myConnection = new OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=\"C:\\Database.accdb\";Persist Security Info=False;");
                myConnection.Open();
    
                string queryString = "SELECT * from Teste Teste  ";//+ lblTable.Text;
    
                OleDbDataAdapter adapter = new OleDbDataAdapter(queryString, myConnection);
    
                DataTable dtAccess = new DataTable();
    
                DataTable dtCSV = new DataTable();
    
                dtCSV = ds.Tables[0];
    
                using (new OleDbCommandBuilder(adapter))
                {
                    adapter.Fill(dtAccess);
                    dtAccess.Merge(dtCSV);
                    adapter.Update(dtAccess);
                }
    
                myConnection.Close();

    Tenta colocar assim "Select * from [Plan1$]"

    onde [Plan1$] é o nome da guia da planilha que está utilizando


    Julio Arruda __________________________________ Se foi util, marque como resposta

    • Sugerido como Resposta Julio ArrudaMVP quarta-feira, 14 de agosto de 2013 13:28
    • Marcado como Resposta Guilherme Gamboa quarta-feira, 14 de agosto de 2013 13:33
    quarta-feira, 14 de agosto de 2013 13:28
  • ahhh obrigado julio mas agora ele não esta encontrando o banco de dados. kkkkkkkkkkkkk 

    quarta-feira, 14 de agosto de 2013 13:36
  • Guilherme,

    Não seria por causa do seguinte comando:

     string queryString = "SELECT * from Teste Teste

    eu acredito que o correto seja:

     string queryString = "SELECT * from Teste


    Julio Arruda __________________________________ Se foi util, marque como resposta

    • Sugerido como Resposta Julio ArrudaMVP quarta-feira, 14 de agosto de 2013 13:38
    quarta-feira, 14 de agosto de 2013 13:38
  • voce tem que modificar esta linha:

        OleDbConnection myConnection = new OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=\"C:\\Database.accdb\";Persist Security Info=False;");
        

    Ele deve apontar para sua base.

    como eu disse o codigo tem que ser adaptado.

    att


    William John Adam Trindade
    Analyste-programmeur
    ----------------------------------------------------------

    Sogi informatique ltée

    quarta-feira, 14 de agosto de 2013 13:39
  • enta willian eu já tinha alterado mas mudei dinovo e foi mas agora ele nao faz nada, nao da erro mas tbm nao joga para a tabela "Teste" do access. 

    vc comento que o merge que eh quem joga pro access neh ? eu devo mudar algo na nessa parte :

    devo mudar o index do ds.table[0] ?

    DataTable dtAccess = new DataTable();
    
                DataTable dtCSV = new DataTable();
    
                dtCSV = ds.Tables[0];
    
                using (new OleDbCommandBuilder(adapter))
                {
                    adapter.Fill(dtAccess);
                    dtAccess.Merge(dtCSV);
                    adapter.Update(dtAccess);
                }
    
                myConnection.Close();

    quarta-feira, 14 de agosto de 2013 13:52
  • eu nao consigo entender o motivo de eu dar um select na  tabela teste se eu quero inserir os valores nela. vc poderia me explicar ? 
    quarta-feira, 14 de agosto de 2013 13:59
  • desculpa julio eu não tinha visto seu comentário, então eu já tinha visto esse erro e alterei. infelizmente o problema é outro agora. 
    quarta-feira, 14 de agosto de 2013 14:13
  • A ideia é criar um dataset com a tabela do access e fazer um merge com o dataset do excel.. por isso vc faz um select e o datapater se encarrega do resto.


    O problema que para isso a estrutura dos dados tem que ser identica.


    Uma outra coisa que pode ser feita (creio que seja mais simples e flexivel) é ao invez de usar o merge, usar um insert

    foreach (DataRow dtRow in dtCSV.Rows)
    {
    
    using (OleDbCommand cmd = myConnection.CreateCommand())
          {
               // create command with placeholders
               cmd.CommandText = 
                  "INSERT INTO teste"+
                  "(campo1,campo2,  campo3) "+
                  "VALUES(@campo1, @campo2, @campo3)";
    
               // add named parameters
               cmd.Parameters.AddRange(new OleDbParameter[]
               {
                   new OleDbParameter("@campo1", dtRow["campo1"]),
                   new OleDbParameter("@campo2", dtRow["campo2"]),
                   new OleDbParameter("@campo3", dtRow["campo3"])
               });
    
               // execute
               cmd.ExecuteNonQuery();
          }
    }

    com isso vc pode controlar o que vai em cada campo da tabela Teste.

    Att


    William John Adam Trindade
    Analyste-programmeur
    ----------------------------------------------------------

    Sogi informatique ltée


    quarta-feira, 14 de agosto de 2013 14:29
  • nossa cara vlw mesmo ele esta importando mas ele dando pau quando eu coloco os 2 últimos parâmetros.

    ele fala que a sintaxe do comando insert esta errada.

    quarta-feira, 14 de agosto de 2013 18:29
  • poste seu codigo bem como a mensagem recebida.

    Att


    William John Adam Trindade
    Analyste-programmeur
    ----------------------------------------------------------

    Sogi informatique ltée


    quarta-feira, 14 de agosto de 2013 18:35
  • entao eu ja arrumei era o nome dos campos, eles estavam corretos mas estavam dando comflito com o sistema o codigo final ficou assim. 
     OleDbConnection conn = new OleDbConnection(("Provider=Microsoft.ACE.OLEDB.12.0; " + ("data source=C:\\IBBA_Outsourcing_Consolidado_Lançamento_horas - WBS_2013_06 - Copy.xls; " + "Extended Properties=Excel 12.0;")));
                OleDbDataAdapter ada = new OleDbDataAdapter("select * from [IBBA_Outsourcing_Consolidado_La$]", conn);
                DataSet ds = new DataSet();
                ada.Fill(ds);
                conn.Close();
                OleDbConnection myConnection = new OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\\BbConsolida.accdb");
                myConnection.Open();
                string queryString = "SELECT * into RelatorioSAP from [IBBA_Outsourcing_Consolidado_La$]";//+ lblTable.Text;
                OleDbDataAdapter adapter = new OleDbDataAdapter(queryString, myConnection);
                DataTable dtAccess = new DataTable();
                DataTable dtCSV = new DataTable();
                dtCSV = ds.Tables[0];
                foreach (DataRow dtRow in dtCSV.Rows)
                {
    
                    using (OleDbCommand cmd = myConnection.CreateCommand())
                    {
                        // create command with placeholders
                        cmd.CommandText =
                           "INSERT INTO RelatorioSAP" +
                           "(Employee,Hours, ShortText, Categoria, Data, WBS) " +
                           "VALUES(@Employee,@Hours, @ShortText, @Categoria, @Data, @WBS)";
    
                        // add named parameters
                        cmd.Parameters.AddRange(new OleDbParameter[]
               {
                   //new OleDbParameter("@numero", dtRow["numero"]),
                   new OleDbParameter("@Employee", dtRow["Employee"]),
                   new OleDbParameter("@Hours", dtRow["Hours"]),
                   new OleDbParameter("@ShortText", dtRow["ShortText"]),
                  new OleDbParameter("@Categoria", dtRow["Categoria"]),
                 new OleDbParameter("@Data",dtRow["Data"]),
                 new OleDbParameter("@WBS", dtRow["WBS"])
                   
               });
                        cmd.ExecuteNonQuery();
                    }
                }
    
                myConnection.Close();

    quarta-feira, 14 de agosto de 2013 18:46