Usuário com melhor resposta
Ler xls e atualizar SQL C#

Pergunta
-
estou com um projeto web aspx
e ai veio a ideia de atualizar os preços dos produtos atravez de um xlsonde 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
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.Rows["f1"].ToString();
estoque = Convert.ToInt16(dt.Rows["f2"].ToString());
valor = Convert.ToDouble(dt.Rows["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
Todas as Respostas
-
-
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
-
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.Rows["f1"].ToString();
estoque = Convert.ToInt16(dt.Rows["f2"].ToString());
valor = Convert.ToDouble(dt.Rows["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 -
-
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,
-