Usuário com melhor resposta
Ao importar excel para um DataGridView, coluna lendo somente numeros automaticamente

Pergunta
-
Pessoal, eu fiz um código para importa um excel que uso para dentro de um datagridview windows forms, porem a coluna "Codigo de Fabrica" esta puxando somente numeros, e nao pode, pode esse codigo é alfanumerico.. como tratar isso??
Segue o codigo
private DataTable GetTabelaExcel(string arquivoExcel)
{
DataTable dt = new DataTable();
try
{
//pega a extensão do arquivo
string Ext = Path.GetExtension(arquivoExcel);
string connectionString = "";
//verifica a versão do Excel pela extensão
if (Ext == ".xls")
{ //para o Excel 97-03
connectionString = "Provider=Microsoft.Jet.OLEDB.4.0; Data Source =" + arquivoExcel + "; Extended Properties = 'Excel 8.0;HDR=YES'";
}
else if (Ext == ".xlsx")
{ //para o Excel 07 e superior
connectionString = "Provider=Microsoft.ACE.OLEDB.12.0; Data Source =" + arquivoExcel + "; Extended Properties = 'Excel 8.0;HDR=YES'";
}
OleDbConnection conn = new OleDbConnection(connectionString);
OleDbCommand cmd = new OleDbCommand();
OleDbDataAdapter dataAdapter = new OleDbDataAdapter();
cmd.Connection = conn;
conn.Open();
DataTable dtSchema;
dtSchema = conn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, null);
string nomePlanilha = dtSchema.Rows[0]["TABLE_NAME"].ToString();
conn.Close();
//le todos os dados da planilha para o Data Table
conn.Open();
cmd.CommandText = "SELECT * From [" + nomePlanilha + "]";
dataAdapter.SelectCommand = cmd;
dataAdapter.Fill(dt);
dataGridView1.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.ColumnHeader;
conn.Close();
}
catch (Exception ex)
{
throw ex;
}
return dt;
}private void CarregaDadosExcel()
{
try
{
//limpa o combobox
comboBox1.Items.Clear();
//converte os dados do Excel para um DataTable
DataTable dt = GetTabelaExcel(arquivoExcel);
//ajusta a largura das colunas aos dados
dataGridView1.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.AllCells;
dataGridView1.DataSource = dt;
//No total de registros
label3.Text = (dataGridView1.Rows.Count).ToString() + " Registros lidos";
string[] listaNomeColunas = dt.Columns.OfType<DataColumn>().Select(x => x.ColumnName).ToArray();
//Adiciona os nomes das colunas no Combobox
comboBox1.Items.AddRange(listaNomeColunas);
if (comboBox1.Items.Count > 0)
comboBox1.SelectedIndex = 0;
}
catch (Exception ex)
{
MessageBox.Show("Erro :" + ex.Message);
}
}Obrigado a todos
Respostas
-
eu fiz mais ou menos isso, porem coloquei um 'a'...
a formatação no excel ta como GENERAL, no excel aceita normal letra e numero.. na hora de importar mesmo que ele traz em branco aonde tem letra no meio...
o codigo que utilizei abaixo antes de preencher o datasource do grid... tive q colocar em 2 ou mais colunas para dar certo
Usei REGEX para verificar se é numero ou letra no começo da celula...se começar com letra, funciona normal
Segue o codigo:
//Regex que vc quer
string verifica = "^[0-9]";
string PrimeiroCaracter = "";
Microsoft.Office.Interop.Excel.Application excelApp = new Microsoft.Office.Interop.Excel.Application();
string myPath = textBox1.Text;
excelApp.Workbooks.Open(myPath);
/////////////////1° linha depois do cabeçalho///////////////
int rowIndex = 3;
int colIndex = 4;
PrimeiroCaracter = (excelApp.Cells[rowIndex, colIndex].Value.ToString().Substring(0, 1));
if (Regex.IsMatch(PrimeiroCaracter, verifica))
{
// MessageBox.Show(excelApp.Cells[rowIndex, colIndex].Value.ToString());
excelApp.Cells[rowIndex, colIndex].Value = "a" + excelApp.Cells[rowIndex, colIndex].Value();
// MessageBox.Show(excelApp.Cells[rowIndex, colIndex].Value.ToString());
}
else
{
}
/////////////////2° linha depois do cabeçalho///////////////
rowIndex = 4;
colIndex = 4;
PrimeiroCaracter = (excelApp.Cells[rowIndex, colIndex].Value.ToString().Substring(0, 1));
if (Regex.IsMatch(PrimeiroCaracter, verifica))
{
// MessageBox.Show(excelApp.Cells[rowIndex, colIndex].Value.ToString());
excelApp.Cells[rowIndex, colIndex].Value = "a" + excelApp.Cells[rowIndex, colIndex].Value();
// MessageBox.Show(excelApp.Cells[rowIndex, colIndex].Value.ToString());
}
else
{
}
- Marcado como Resposta JNFinfo sexta-feira, 20 de março de 2020 15:35
Todas as Respostas
-
Amigo, se não me engano você precisa alterar isso no excel, na formatação da coluna, definir a coluna como texto!
Se mesmo assim não funcionar, em cada registro coloque um o caractere ' , por exemplo o valor na coluna esta 1207678, ficaria '1207678. -
eu fiz mais ou menos isso, porem coloquei um 'a'...
a formatação no excel ta como GENERAL, no excel aceita normal letra e numero.. na hora de importar mesmo que ele traz em branco aonde tem letra no meio...
o codigo que utilizei abaixo antes de preencher o datasource do grid... tive q colocar em 2 ou mais colunas para dar certo
Usei REGEX para verificar se é numero ou letra no começo da celula...se começar com letra, funciona normal
Segue o codigo:
//Regex que vc quer
string verifica = "^[0-9]";
string PrimeiroCaracter = "";
Microsoft.Office.Interop.Excel.Application excelApp = new Microsoft.Office.Interop.Excel.Application();
string myPath = textBox1.Text;
excelApp.Workbooks.Open(myPath);
/////////////////1° linha depois do cabeçalho///////////////
int rowIndex = 3;
int colIndex = 4;
PrimeiroCaracter = (excelApp.Cells[rowIndex, colIndex].Value.ToString().Substring(0, 1));
if (Regex.IsMatch(PrimeiroCaracter, verifica))
{
// MessageBox.Show(excelApp.Cells[rowIndex, colIndex].Value.ToString());
excelApp.Cells[rowIndex, colIndex].Value = "a" + excelApp.Cells[rowIndex, colIndex].Value();
// MessageBox.Show(excelApp.Cells[rowIndex, colIndex].Value.ToString());
}
else
{
}
/////////////////2° linha depois do cabeçalho///////////////
rowIndex = 4;
colIndex = 4;
PrimeiroCaracter = (excelApp.Cells[rowIndex, colIndex].Value.ToString().Substring(0, 1));
if (Regex.IsMatch(PrimeiroCaracter, verifica))
{
// MessageBox.Show(excelApp.Cells[rowIndex, colIndex].Value.ToString());
excelApp.Cells[rowIndex, colIndex].Value = "a" + excelApp.Cells[rowIndex, colIndex].Value();
// MessageBox.Show(excelApp.Cells[rowIndex, colIndex].Value.ToString());
}
else
{
}
- Marcado como Resposta JNFinfo sexta-feira, 20 de março de 2020 15:35