locked
EXCEL 2003 x VB.NET 2003 RRS feed

  • Pergunta

  • Mas uma do Excel com o VB.NET, que digasse de passagem, trabalham na mesma plataforma e são totalmente integrados (reza a lenda microsoft!).

    Amigos,

    Problema, mais um, é o seguinte:

    Meu sistema lê uma planilha excel e carrega um dataset. Em algumas máquinas funciona perfeitamente em outras máquinas as colunas que estão definidas como numéricas no excel são carregadas no dataset como null.

    Fiz o seguinte teste, transformei as colunas do excel que estão definidas como numéricas para texto. Bem, aê o problema se inverte. Nas máquinas que funcionavam com as colunas definidas como numéricas o valor é carregado no dataset como null e nas máquinas que não funcionavam com as colunas definidas como numérica o valor é carregado sem problemas.

    Deu pra entender?!

    Exemplo:

    Col excel numérica      DataSetMáquina1   DataSetMáquina2

    1,00                                1,00                           null

    2,00                                 2,00                          null

    Quando transformo a coluna para texto:

    Col excel texto      DataSetMáquina1   DataSetMáquina2

    1,00                        null                             1,00

    2,00                        null                              2,00

    Alguém tem alguma idéia do q possa estar ocorrendo?

    Já verifiquei as configurações da máquina no painel de controle e todas as máquinas estão iguais.

    Desde já agradeço.

    terça-feira, 20 de junho de 2006 19:37

Respostas

  • Problema resolvido:

    1) Criação do DataTable via código
    2) Leitura da planilha excel linha a linha, carregando no DataTable

    Ficou muito mais lento que no método anterior, mas foi a única forma que consegui para resolver o problema.

    Código Anterior:

    cmd_xls = New OleDbDataAdapter("SELECT * FROM [" & NomePlanilha & "$] ", conn)
    cmd_xls.Fill(dt_xls)


    E o código ficou assim:

    dc_xls_Coluna = New DataColumn
    dc_xls_Coluna.DataType = System.Type.GetType("System.String")
    dc_xls_Coluna.ColumnName = "ITEM"
    dc_xls_Coluna.ReadOnly = True
    dc_xls_Coluna.Unique = False
    dt_xls.Columns.Add(dc_xls_Coluna)

    dc_xls_Coluna = New DataColumn
    dc_xls_Coluna.DataType = System.Type.GetType("System.String")
    dc_xls_Coluna.ColumnName = "DESCRICAO"
    dc_xls_Coluna.ReadOnly = True
    dc_xls_Coluna.Unique = False
    dt_xls.Columns.Add(dc_xls_Coluna)

    dc_xls_Coluna = New DataColumn
    dc_xls_Coluna.DataType = System.Type.GetType("System.String")
    dc_xls_Coluna.ColumnName = "SERVICO"
    dc_xls_Coluna.ReadOnly = True
    dc_xls_Coluna.Unique = False
    dt_xls.Columns.Add(dc_xls_Coluna)

    dc_xls_Coluna = New DataColumn
    dc_xls_Coluna.DataType = System.Type.GetType("System.String")
    dc_xls_Coluna.ColumnName = "UN"
    dc_xls_Coluna.ReadOnly = True
    dc_xls_Coluna.Unique = False
    dt_xls.Columns.Add(dc_xls_Coluna)

    dc_xls_Coluna = New DataColumn
    dc_xls_Coluna.DataType = System.Type.GetType("System.Decimal")
    dc_xls_Coluna.ColumnName = "VALOR"
    dc_xls_Coluna.ReadOnly = True
    dc_xls_Coluna.Unique = False
    dt_xls.Columns.Add(dc_xls_Coluna)

    dc_xls_Coluna = New DataColumn
    dc_xls_Coluna.DataType = System.Type.GetType("System.Decimal")
    dc_xls_Coluna.ColumnName = "QTD"
    dc_xls_Coluna.ReadOnly = True
    dc_xls_Coluna.Unique = False
    dt_xls.Columns.Add(dc_xls_Coluna)

    dc_xls_Coluna = New DataColumn
    dc_xls_Coluna.DataType = System.Type.GetType("System.Decimal")
    dc_xls_Coluna.ColumnName = "TOTAL"
    dc_xls_Coluna.ReadOnly = True
    dc_xls_Coluna.Unique = False
    dt_xls.Columns.Add(dc_xls_Coluna)

                           
    For D = 12 To sheet.Range("A65536").End(Excel.XlDirection.xlUp).Row - 2
      If Not sheet.Range("A" & D & "").Value Is System.DBNull.Value And sheet.Range("A" & D & "").Value <> Nothing Then
                                                                   
      dr_xls_Linha = dt_xls.NewRow
      dr_xls_Linha("ITEM") = sheet.Range("A" & D & "").Value
      dr_xls_Linha("DESCRICAO") = sheet.Range("B" & D & "").Value
      dr_xls_Linha("SERVICO") = sheet.Range("C" & D & "").Value
      dr_xls_Linha("UN") = sheet.Range("D" & D & "").Value
      If Not sheet.Range("E" & D & "").Value Is System.DBNull.Value And sheet.Range("E" & D & "").Value <> Nothing Then
        dr_xls_Linha("VALOR") = sheet.Range("E" & D & "").Value
        dr_xls_Linha("QTD") = sheet.Range("F" & D & "").Value
        dr_xls_Linha("TOTAL") = sheet.Range("G" & D & "").Value
      End If
      dt_xls.Rows.Add(dr_xls_Linha)
      End If
    Next D

    dts_xls.Tables.Add(dt_xls)

    quarta-feira, 21 de junho de 2006 19:24

Todas as Respostas

  • Oi Natarelli,

    que código você está usando para carregar o DataSet?

    Pode ser algum problema com a configuração regional, especialmente porque seus números têm casas decimais.

    No VSTO 2003 eu apanhei bastante disto, acabei descobrindo esta solução:

    System.Threading.Thread.CurrentThread.CurrentCulture = System.Globalization.CultureInfo.CreateSpecificCulture("en-US")

    Isto deve ser feito antes de definir a instãncia do Excel.

    quarta-feira, 21 de junho de 2006 02:02
    Moderador
  • Luiz,

    Valeu pela dica mas o problema continua.

    O código para carregar a tabela é o seguinte:

    Public conn As New OleDbConnection

    Public cmd_xls As OleDbDataAdapter

    Public dt_xls As New Data.DataTable

    Public connString As String

    connString = "Provider=Microsoft.Jet.OleDb.4.0;data source=" & fldObra.FileName & ";Extended Properties=Excel 8.0;"

    conn.ConnectionString = connString

    conn.Open()

    'select da planilha excel

    cmd_xls = New OleDbDataAdapter("SELECT * FROM [" & NomePlanilha & "$] , conn)

    'preenche a tabela com dados da planilha Excel

    cmd_xls.Fill(dt_xls)

    'datagrid somente para visualizar os dados

    DataGrid1.DataSource = dt_xls

    quarta-feira, 21 de junho de 2006 13:26
  • Problema resolvido:

    1) Criação do DataTable via código
    2) Leitura da planilha excel linha a linha, carregando no DataTable

    Ficou muito mais lento que no método anterior, mas foi a única forma que consegui para resolver o problema.

    Código Anterior:

    cmd_xls = New OleDbDataAdapter("SELECT * FROM [" & NomePlanilha & "$] ", conn)
    cmd_xls.Fill(dt_xls)


    E o código ficou assim:

    dc_xls_Coluna = New DataColumn
    dc_xls_Coluna.DataType = System.Type.GetType("System.String")
    dc_xls_Coluna.ColumnName = "ITEM"
    dc_xls_Coluna.ReadOnly = True
    dc_xls_Coluna.Unique = False
    dt_xls.Columns.Add(dc_xls_Coluna)

    dc_xls_Coluna = New DataColumn
    dc_xls_Coluna.DataType = System.Type.GetType("System.String")
    dc_xls_Coluna.ColumnName = "DESCRICAO"
    dc_xls_Coluna.ReadOnly = True
    dc_xls_Coluna.Unique = False
    dt_xls.Columns.Add(dc_xls_Coluna)

    dc_xls_Coluna = New DataColumn
    dc_xls_Coluna.DataType = System.Type.GetType("System.String")
    dc_xls_Coluna.ColumnName = "SERVICO"
    dc_xls_Coluna.ReadOnly = True
    dc_xls_Coluna.Unique = False
    dt_xls.Columns.Add(dc_xls_Coluna)

    dc_xls_Coluna = New DataColumn
    dc_xls_Coluna.DataType = System.Type.GetType("System.String")
    dc_xls_Coluna.ColumnName = "UN"
    dc_xls_Coluna.ReadOnly = True
    dc_xls_Coluna.Unique = False
    dt_xls.Columns.Add(dc_xls_Coluna)

    dc_xls_Coluna = New DataColumn
    dc_xls_Coluna.DataType = System.Type.GetType("System.Decimal")
    dc_xls_Coluna.ColumnName = "VALOR"
    dc_xls_Coluna.ReadOnly = True
    dc_xls_Coluna.Unique = False
    dt_xls.Columns.Add(dc_xls_Coluna)

    dc_xls_Coluna = New DataColumn
    dc_xls_Coluna.DataType = System.Type.GetType("System.Decimal")
    dc_xls_Coluna.ColumnName = "QTD"
    dc_xls_Coluna.ReadOnly = True
    dc_xls_Coluna.Unique = False
    dt_xls.Columns.Add(dc_xls_Coluna)

    dc_xls_Coluna = New DataColumn
    dc_xls_Coluna.DataType = System.Type.GetType("System.Decimal")
    dc_xls_Coluna.ColumnName = "TOTAL"
    dc_xls_Coluna.ReadOnly = True
    dc_xls_Coluna.Unique = False
    dt_xls.Columns.Add(dc_xls_Coluna)

                           
    For D = 12 To sheet.Range("A65536").End(Excel.XlDirection.xlUp).Row - 2
      If Not sheet.Range("A" & D & "").Value Is System.DBNull.Value And sheet.Range("A" & D & "").Value <> Nothing Then
                                                                   
      dr_xls_Linha = dt_xls.NewRow
      dr_xls_Linha("ITEM") = sheet.Range("A" & D & "").Value
      dr_xls_Linha("DESCRICAO") = sheet.Range("B" & D & "").Value
      dr_xls_Linha("SERVICO") = sheet.Range("C" & D & "").Value
      dr_xls_Linha("UN") = sheet.Range("D" & D & "").Value
      If Not sheet.Range("E" & D & "").Value Is System.DBNull.Value And sheet.Range("E" & D & "").Value <> Nothing Then
        dr_xls_Linha("VALOR") = sheet.Range("E" & D & "").Value
        dr_xls_Linha("QTD") = sheet.Range("F" & D & "").Value
        dr_xls_Linha("TOTAL") = sheet.Range("G" & D & "").Value
      End If
      dt_xls.Rows.Add(dr_xls_Linha)
      End If
    Next D

    dts_xls.Tables.Add(dt_xls)

    quarta-feira, 21 de junho de 2006 19:24