none
Conversão do tipo dos campos de uma importação de Excel no C# RRS feed

  • Pergunta

  • Em uma leitura de uma planilha Excel (xlsx) o campo F4 está sendo reconhecido como um campo "double" o que ocasiona um erro com o valor do campo que apesar de numérico é uma chave que excede o tamanho do "double", se eu entro na no arquivo e converto o a coluna toda para texto o problema está resolvido, mas o objetivo é que não haja interação do usuário com o arquivo físico, para isto preciso poder converter o campo F4 no ato da importação para que não ocorra o problema e a consequente perda de informação. 

    Alguém teria alguma ideia de como proceder?

    /**/

                    OleDbCommand cmd = new OleDbCommand("SELECT F1,F2,F3, CONVERT ( nvarchar(510) , F4) as  F4,F5,F5,F6,F7,F8,F9 FROM [" + sheet + "]", conn);

    /**/

    string strConexao = string.Format("Provider=Microsoft.ACE.OLEDB.12.0;Data Source={0};Extended Properties=\"Excel 12.0;HDR=Yes;IMEX=0\"", arquivo);
                OleDbConnection conn = new OleDbConnection(strConexao);
                conn.Open();
                DataTable dt = conn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, new object[] { null, null, null, "TABLE" });


                //****** Lista as informações das tabSheet encontradas no arquivo *********
                DataTable dtCols = conn.GetSchema("Columns");
                grdExibirDadosCampos.DataSource = dtCols;
                grdExibirDadosCampos.AutoGenerateColumns = true;
                //*************************************************************************

                //Cria o objeto dataset para receber o conteúdo do arquivo Excel
                DataSet output = new DataSet();

                foreach (DataRow row in dt.Rows)
                {
                    // obtem o noma da planilha corrente
                    string sheet = row["TABLE_NAME"].ToString();
                    // obtem todos as linhas da planilha corrente 

    // preciso que o funcionamento abaixo seja corrigido

                    OleDbCommand cmd = new OleDbCommand("SELECT F1,F2,F3, CONVERT ( nvarchar(510) , F4) as  F4,F5,F5,F6,F7,F8,F9 FROM [" + sheet + "]", conn);

                    cmd.CommandType = CommandType.Text;
                    // copia os dados da planilha para o datatable
                    DataTable outputTable = new DataTable(sheet);
                    output.Tables.Add(outputTable);


                    new OleDbDataAdapter(cmd).Fill(outputTable);               
                }

                    
    sexta-feira, 13 de janeiro de 2017 18:48

Todas as Respostas

  • Olá Nynrod CAS,

    Não é possivel utilizar Cast com o provider ACE OLEDB.
    Se vc mudar sua conn string para HDR=YES;IMEX=1 vocÊ consegue carregar o que esta como double como texto, e depois tratar-lo(convertendo depois de ja carregado em memoria)
    []'s

    --

    Se a resposta for relevante ou tenha resolvido seu problema, não esqueça marcar como útil/resposta!

    sexta-feira, 13 de janeiro de 2017 21:55
  • Show, funciona só tive que reescrever a importação pois ela era baseada na tipagem dos campos.
    segunda-feira, 16 de janeiro de 2017 11:26