none
Ler xls e atualizar SQL C# RRS feed

  • Pergunta

  •  

    estou com um projeto web aspx

    e ai veio a ideia de atualizar os preços dos produtos atravez de um xls

    onde ele contera o id do produto, quantida  e o preço,

     

    como ler esse arquivos xls ?

    exite limitacao de linhas no xls p/ leitura?

    por exemplo se eu tiver 1000 itens cadastrados ele lera todas as 1000 linhas?

     

    obrigado

    sexta-feira, 27 de junho de 2008 21:08

Respostas

  • bom eu conseguir fazer normal

    como os dados q vai estar no excel é gerado pelo meu sistema interno, nao terei q tratar tanto dados entao vou por aqui a solucao q achei p/ fazer a atualizacao no execel
    colocarei o codigo da pagina e a classe assim pode ser util a algum membro do forum

    abraço

    CODIGO:

     string codigo;
            int estoque;
            double valor;

            if (FileUpExcel.FileName == "preço.xls")
            {
               
                string urlArquivo = FileUpExcel.FileName;
                FileUpExcel.SaveAs(Server.MapPath(@"~/adm/xls/" + urlArquivo));
                try
                {
                    LblError.Visible = false;
                    excel lendo = new excel();

                    DataTable dt = lendo.LerExcel();

                    for (int i = 0; i < dt.Rows.Count; i++)
                    {
                        codigo = dt.RowsIdea["f1"].ToString();
                        estoque = Convert.ToInt16(dt.RowsIdea["f2"].ToString());
                        valor = Convert.ToDouble(dt.RowsIdea["f3"].ToString());

                        try
                        {
                            lendo.UpdateDb(codigo, estoque, valor);
                           
                        }
                        catch (Exception ex)
                        {
                            LblError.Text = ex.Message.ToString();
                        }

                    }
                    LblError.Text = "Preços Atualizados com Sucesso!";
                    LblError.Visible = true;
           
                }
                catch (Exception ex)
                {
                    LblError.Text = ex.Message.ToString();
                    LblError.Visible = true;

                }
               

            }
            else
            {

                FileUpExcel.BackColor = System.Drawing.Color.Black;
                FileUpExcel.ForeColor = System.Drawing.Color.White;
                LblError.Visible = true;

            }


    CLASSE:

     public System.Data.DataTable LerExcel()
        {
            //string cnn = @"Provider=Microsoft.Jet.OLEDB.4.0; Data Source=C:\\preco.xls;Extended Properties='Excel 8.0;HDR=NO;'";
            string _conectionstring;
            _conectionstring = @"Provider=Microsoft.Jet.OLEDB.4.0;";
            _conectionstring += String.Format("Data Source={0};", ConfigurationManager.AppSettings["caminhoExcel"]);
            //_conectionstring += "Data Source=" + Server.mappath("~/adm/xls/preço.xls") + ";";
            _conectionstring += "Extended Properties='Excel 8.0;HDR=NO;'";


            OleDbConnection cn = new OleDbConnection(_conectionstring);
            OleDbCommand cmd = new OleDbCommand("Select * from [Plan1$]", cn);
           
            OleDbDataAdapter da = new OleDbDataAdapter(cmd);
            System.Data.DataTable dt = new System.Data.DataTable();
            da.Fill(dt);
           
            try
            {
                cmd.CommandType = CommandType.Text;
                cn.Open();
                cmd.ExecuteReader();
                return dt;
            }
            catch (OleDbException ex)
            {
                throw new Exception(ex.Message.ToString());
            }
            catch (Exception ex)
            {
                throw new Exception(ex.Message.ToString());
            }
            finally
            {
                cn.Close();
                cn.Dispose();
                cmd.Dispose();
            }

        }

        public void UpdateDb(string codigo, int qtdade, double valor)
        {
            SqlInsert cnString = new SqlInsert();
            string cnn = cnString.cnn;
            SqlConnection cn = new SqlConnection(cnn);
            SqlCommand cmd = new SqlCommand("update Produto set qtdade = @qtdade, valor = @valor where id_prod = @codigo", cn);
            cmd.Parameters.Add("@codigo", SqlDbType.VarChar).Value = codigo;
            cmd.Parameters.Add("@qtdade", SqlDbType.Int).Value = qtdade;
            cmd.Parameters.Add("@valor", SqlDbType.Decimal).Value = valor;
            try
            {
                cmd.CommandType = CommandType.Text;
                cn.Open();
                cmd.ExecuteNonQuery();
            }
            catch (SqlException ex)
            {
                throw new Exception(ex.Message.ToString());
            }
            catch (Exception ex)
            {
                throw new Exception(ex.Message.ToString());
            }
            finally
            {
                cn.Close();
                cn.Dispose();
                cmd.Dispose();
            }

       
       
        }


    Abraço a todos e bom proveito do codigo...

    Tsunamy

    segunda-feira, 25 de agosto de 2008 14:47

Todas as Respostas

  •  

    Mas simples é vc ler em formato CSV e usar split
    sexta-feira, 22 de agosto de 2008 22:05
  • Tsu, estou trabalhando com arquivos excel, esta minha planilha tem 6 colunas, a questao de velocidade depende do que voce irá fazer com a planilha depois de carregada, aqui tenho que validar os dados que foram inseridos em cada linha, entao um arquivo com 1600  registros em média, demora certa 3 minutos e meio para processar, devidas as validaçoes que faço, mas este tempo pode diminuir ou aumentar dependendo do que voce for fazer, concordo que trabalhar com arquivo texto é mais rápido, mas melhor ainda é trabalhar com XML. Trabalho no formato excel, pois os usuários que enviam informaçoes estao mais familiarizados com excel e nao querem um sistema para entrarem com informaçoes.

     

    Abraço

     

    Estevam

    segunda-feira, 25 de agosto de 2008 13:32
  • bom eu conseguir fazer normal

    como os dados q vai estar no excel é gerado pelo meu sistema interno, nao terei q tratar tanto dados entao vou por aqui a solucao q achei p/ fazer a atualizacao no execel
    colocarei o codigo da pagina e a classe assim pode ser util a algum membro do forum

    abraço

    CODIGO:

     string codigo;
            int estoque;
            double valor;

            if (FileUpExcel.FileName == "preço.xls")
            {
               
                string urlArquivo = FileUpExcel.FileName;
                FileUpExcel.SaveAs(Server.MapPath(@"~/adm/xls/" + urlArquivo));
                try
                {
                    LblError.Visible = false;
                    excel lendo = new excel();

                    DataTable dt = lendo.LerExcel();

                    for (int i = 0; i < dt.Rows.Count; i++)
                    {
                        codigo = dt.RowsIdea["f1"].ToString();
                        estoque = Convert.ToInt16(dt.RowsIdea["f2"].ToString());
                        valor = Convert.ToDouble(dt.RowsIdea["f3"].ToString());

                        try
                        {
                            lendo.UpdateDb(codigo, estoque, valor);
                           
                        }
                        catch (Exception ex)
                        {
                            LblError.Text = ex.Message.ToString();
                        }

                    }
                    LblError.Text = "Preços Atualizados com Sucesso!";
                    LblError.Visible = true;
           
                }
                catch (Exception ex)
                {
                    LblError.Text = ex.Message.ToString();
                    LblError.Visible = true;

                }
               

            }
            else
            {

                FileUpExcel.BackColor = System.Drawing.Color.Black;
                FileUpExcel.ForeColor = System.Drawing.Color.White;
                LblError.Visible = true;

            }


    CLASSE:

     public System.Data.DataTable LerExcel()
        {
            //string cnn = @"Provider=Microsoft.Jet.OLEDB.4.0; Data Source=C:\\preco.xls;Extended Properties='Excel 8.0;HDR=NO;'";
            string _conectionstring;
            _conectionstring = @"Provider=Microsoft.Jet.OLEDB.4.0;";
            _conectionstring += String.Format("Data Source={0};", ConfigurationManager.AppSettings["caminhoExcel"]);
            //_conectionstring += "Data Source=" + Server.mappath("~/adm/xls/preço.xls") + ";";
            _conectionstring += "Extended Properties='Excel 8.0;HDR=NO;'";


            OleDbConnection cn = new OleDbConnection(_conectionstring);
            OleDbCommand cmd = new OleDbCommand("Select * from [Plan1$]", cn);
           
            OleDbDataAdapter da = new OleDbDataAdapter(cmd);
            System.Data.DataTable dt = new System.Data.DataTable();
            da.Fill(dt);
           
            try
            {
                cmd.CommandType = CommandType.Text;
                cn.Open();
                cmd.ExecuteReader();
                return dt;
            }
            catch (OleDbException ex)
            {
                throw new Exception(ex.Message.ToString());
            }
            catch (Exception ex)
            {
                throw new Exception(ex.Message.ToString());
            }
            finally
            {
                cn.Close();
                cn.Dispose();
                cmd.Dispose();
            }

        }

        public void UpdateDb(string codigo, int qtdade, double valor)
        {
            SqlInsert cnString = new SqlInsert();
            string cnn = cnString.cnn;
            SqlConnection cn = new SqlConnection(cnn);
            SqlCommand cmd = new SqlCommand("update Produto set qtdade = @qtdade, valor = @valor where id_prod = @codigo", cn);
            cmd.Parameters.Add("@codigo", SqlDbType.VarChar).Value = codigo;
            cmd.Parameters.Add("@qtdade", SqlDbType.Int).Value = qtdade;
            cmd.Parameters.Add("@valor", SqlDbType.Decimal).Value = valor;
            try
            {
                cmd.CommandType = CommandType.Text;
                cn.Open();
                cmd.ExecuteNonQuery();
            }
            catch (SqlException ex)
            {
                throw new Exception(ex.Message.ToString());
            }
            catch (Exception ex)
            {
                throw new Exception(ex.Message.ToString());
            }
            finally
            {
                cn.Close();
                cn.Dispose();
                cmd.Dispose();
            }

       
       
        }


    Abraço a todos e bom proveito do codigo...

    Tsunamy

    segunda-feira, 25 de agosto de 2008 14:47
  • Descupe postado no topico errado mas ja esta postado no asp.net

    descupe ai aos moderadores
    Smile
    segunda-feira, 25 de agosto de 2008 14:58
  • Meu brother,

    Primeiro queria agradecer pelo script realmente me ajudou bastante, porém estou com um problema referente ao mesmo. Em uma das colunas exitem dados do tipo: "CY234" e outros do tipo:"234" contece que quando possue as letras antes do número ele pega o valor da célula, quando não possue as letras ele não trás o valor da célula. Adianto que já acrescentei no cabeçalho a opção IMEX = 1, porém nada adiantou. Será que você poderia me ajudar?

    Alguém do fórum já teve esse problema?

    Obs.: O arquivo xls é do excel 2007.

    Att, 

    quinta-feira, 25 de novembro de 2010 16:02
  • Mas onde que esta a classe excel()?

    Eu notei que voce se utilizou de duas classes e postou somente uma

            excel lendo = new excel();

                    DataTable dt = lendo.LerExcel();

    quinta-feira, 22 de março de 2012 19:43