none
Problemas con decimales al exportar archivo a Excel RRS feed

  • Pregunta

  • Buenos días. Soy nueva progrmaando en ASP.NET y requiero exportar un archivo de datos (que está en una base dedatos BD2 en OS/400) que contiene datos de cantidades y montos.

    Encontré una rutina de exportación sin emplear un grid, la adapté y me funciona. Sin embargo, las columnas que contienen montos y cantidades no me mantiene el formato numérico de la plantilla original, en su lugar les coloca un formato general. Esto impide que luego pueda hacer calculos directos sobre las celdas desde Excel.

    Quisiera saber que debo hacer para que los datos numéricos se muestren con dicho formato. Anexo el código del programa.

    Gracias

    Private Function myconnectionstring(ByVal extension As String) As String

            Dim retorno As String = ""

            Select Case extension

                Case ".xls"

                    retorno = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source={0};Extended Properties=""Excel 8.0;HDR=Yes;IMEX=0"""

                Case ".xlsx"

                    retorno = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source={0};Extended Properties=Excel 12.0 Xml"

            End Select

            Return retorno

        End Function

     

        Protected Sub Button1_Click(ByVal sender As Object, ByVal e As EventArgs) Handles Button1.Click

            Dim rutaOrigen As String = Server.MapPath("/PlatillaExcel/Plantilla.xls")

            Dim rutaDestino As String = Server.MapPath("/DownloadExcel/")

            Dim archivoDestino As String = "FileExcel" & Session.SessionID & ".xls"

            rutaDestino &= archivoDestino

     

            IO.File.Copy(Server.MapPath("/PlantillaExcel/Plantilla.xls"), rutaDestino, True)

     

            conOle.ConnectionString = String.Format(myconnectionstring(IO.Path.GetExtension(rutaDestino)), rutaDestino)

            adaole.InsertCommand = conOle.CreateCommand

            adaole.InsertCommand.CommandText = "Insert Into Consolidado (Compañia,Almacen,Orden_de_Compra,Linea_OC,Producto,Descripcion,UM_Existencias, Cantidad_Recibida, Precio_Unitario, Precio_Total, Codigo_Moneda) values (@compañia,@almacen,@ordencompra,@lineaOC,@producto,@descripcion,@umexistencias, @cantidadrecibida, @preciounitario, @preciototal, @moneda)"

            adaole.InsertCommand.CommandType = CommandType.Text

     

            With adaole.InsertCommand.Parameters

                .Add("@compañia", OleDb.OleDbType.VarChar, 2, "Compañia")

                .Add("@almacen", OleDb.OleDbType.VarChar, 3, "Almacen")

                .Add("@ordencompra", OleDb.OleDbType.VarChar, 8, "Orden_de_Compra")

                .Add("@lineaOC", OleDb.OleDbType.VarChar, 4, "Linea_OC")

                .Add("@producto", OleDb.OleDbType.VarChar, 35, "Producto")

                .Add("@descripcion", OleDb.OleDbType.VarChar, 50, "Descripcion")

                .Add("@umexistencias", OleDb.OleDbType.VarChar, 2, "UM_Existencias")

                .Add("@cantidadrecibida", OleDb.OleDbType.Double, 31, "Cantidad_Recibida")

                .Add("@preciounitario", OleDb.OleDbType.Double, 15, "Precio_Unitario")

                .Add("@preciototal", OleDb.OleDbType.Double, 31, "Precio_Total")

                .Add("@moneda", OleDb.OleDbType.VarChar, 3, "Codigo_Moneda")

            End With

     

            Try

                conOle.Open()

                adaole.Update(LeePUR3X005)

            Catch ex As Exception

                Label1.Text = ex.Message.ToString()

     

            Finally

                conOle.Close()

     

     

                Response.ClearContent()

                Response.ClearHeaders()

                Response.ContentType = "application/vnd.ms-excel" 'Excel 2003

                'Response.ContentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet" 'Excel 2007

                Response.WriteFile(rutaDestino)

                Response.Flush()

                Response.Close()

     

                IO.File.Delete(rutaDestino)

     

            End Try

        End Sub

     

        Function LeePUR3X005() As DataTable

     

            Dim CadenaSQL As String

            Dim selectCMD As OdbcCommand

            Dim dr As OdbcDataReader

     

            'Conexion al AS400

            Session("Cad") = "Dsn=P820USR;" & _

            "System=192.10.10.1;" & _

            "TRANSLATE=1;" & _

            "Uid=P3EGIL;" & _

            "Pwd=EUMA5;"

     

            'Definición de la conexion

            Dim MyODBCConnection As New OdbcConnection(Session("Cad"))

     

            'Open the connection

            MyODBCConnection.Open()

     

            'Define el SQL para buscar datos consolidados

            CadenaSQL = "select * FROM PUR3X005"

            'Crea el comando a ejecutar

            selectCMD = New OdbcCommand(CadenaSQL, MyODBCConnection)

     

            Dim temp As New Data.DataTable

            temp.Columns.Add("Compañia", GetType(String))

            temp.Columns.Add("Almacen", GetType(String))

            temp.Columns.Add("Orden_de_Compra", GetType(String))

            temp.Columns.Add("Linea_OC", GetType(String))

            temp.Columns.Add("Producto", GetType(String))

            temp.Columns.Add("Descripcion", GetType(String))

            temp.Columns.Add("UM_Existencias", GetType(String))

            temp.Columns.Add("Cantidad_Recibida", GetType(Double))

            temp.Columns.Add("Precio_Unitario", GetType(Double))

            temp.Columns.Add("Precio_Total", GetType(Double))

            temp.Columns.Add("Codigo_Moneda", GetType(String))

     

            'Ejecuta el SQL

            dr = selectCMD.ExecuteReader()

     

            If dr.Read() Then

                Do

                    Dim nuevo As DataRow = temp.NewRow

                    'Asigna valores al datatable

                    nuevo(0) = dr.Item(0).ToString

                    nuevo(1) = dr.Item(1)

                    nuevo(2) = dr.Item(2).ToString

                    nuevo(3) = dr.Item(3).ToString

                    nuevo(4) = dr.Item(4)

                    nuevo(5) = dr.Item(5)

                    nuevo(6) = dr.Item(6)

                    nuevo(7) = dr.Item(7)

                    nuevo(8) = dr.Item(8)

                    nuevo(9) = dr.Item(9)

                    nuevo(10) = dr.Item(10)

                    temp.Rows.Add(nuevo)

                Loop While (dr.Read())

            End If

            dr.Close()

     

            'Close the connection

            MyODBCConnection.Close()

            MyODBCConnection.Dispose()

            Returntemp

         End Function

     

     

    jueves, 2 de junio de 2011 15:44

Respuestas

  • "rodas27" escribió:
     
    > Probé el IMEX=1 pero no funciona porque este valor es para importación
    > de datos desde Excel. Mi necesidad es exportar datos a Excel, por ello
    > el IMEX debería ser "0".
    >
    > En mi caso los valores númericos se muestran con un apóstrofe al inicio.
    > Ejemplo: '123,7. Esto no me permite hacer calculos directos sobre los
    > datos en Excel.
     
    Hola:
     
    De poco te va a servir que establezcas el valor del parámetro IMEX a 0 o a 1, porque el problema que tú estás teniendo, entiendo que es del propio Microsoft Excel, el cual toma como texto los números que se le transfieren desde otro origen de datos. Es un problema bastante conocido e ignoro si existe alguna solución para que los tome como números al realizar la exportación de datos.
     
    > Que debo hacer para conseguir que se muestren en Excel, los datos
    > como númerico y respeten el formato de la columna.
     
    Para que te los tome como números, la primera fila de la hoja de cálculo, o del rango de celdas, con o sin nombre, tiene que tener un formato númerico. Pero si es así, en lugar de insertar los datos en la primera fila, lo hace a partir de la segunda fila.
     
    También puedes especificar unos valores numéricos en la primera fila, y posteriormente sí se insertarán como números los valores del objeto DataTable transferido a Excel. Cuando hablo de “primera fila”, no me refiero a la fila que contiene el nombre de las columnas; me refiero a la fila inmediatamente siguiente a la fila de encabezados de columna.
     
    Si lo anterior no te convence, no te va a quedar más remedio que abrir el propio libro de Excel y modificar el tipo de dato de las columnas para establecerle un formato numérico. Para ello, busca en la ayuda de Microsoft Excel el tema “Convertir en número los números guardados como texto”, donde se explican varias técnicas para efectuar la conversión.
     
    Insisto que en mi opinión es un problema de Excel, no de cómo se transfieren los datos a Excel, porque aunque los campos del objeto DataTable sean numéricos, en Excel aparecerán como texto, salvo que ya existan datos numéricos en las columnas numéricas de la hoja del libro de Excel, o en el rango de celdas donde queremos insertar los nuevos registros.
     
    Un saludo
     

    Enrique Martínez
      [MS MVP - VB]

    sábado, 4 de junio de 2011 17:26
    Moderador

Todas las respuestas

  • mm podrias verificar si lo mencionado aqui

    http://social.msdn.microsoft.com/Forums/es/vbes/thread/6088741b-3de4-4398-9cac-2ccd1dffb14d

    lo del IMEX=1 puede dar resultado

     

    despues veo que usas

    Dim nuevo As DataRow = temp.NewRow

    pero temp de donde sale ?

    imagino es un datatable, pero valida que las columnas de nuemros tengan el tipo correcto

     

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina
    jueves, 2 de junio de 2011 15:52
  • Buenas tardes!!

    Probé el IMEX=1 pero no funciona porque este valor es para importación de datos desde Excel. Mi necesidad es exportar datos a Excel, por ello el IMEX debería ser "0".

    En mi caso los valores númericos se muestran con un apóstrofe al inicio. Ejemplo: '123,7. Esto no me permite hacer calculos directos sobre los datos en Excel.

    Que debo hacer para conseguir que se muestren en Excel, los datos como númerico y respeten el formato de la columna.

    La pregunta sobre "temp" es un datatable.

    Gracias!!

    viernes, 3 de junio de 2011 21:15
  • "rodas27" escribió:
     
    > Probé el IMEX=1 pero no funciona porque este valor es para importación
    > de datos desde Excel. Mi necesidad es exportar datos a Excel, por ello
    > el IMEX debería ser "0".
    >
    > En mi caso los valores númericos se muestran con un apóstrofe al inicio.
    > Ejemplo: '123,7. Esto no me permite hacer calculos directos sobre los
    > datos en Excel.
     
    Hola:
     
    De poco te va a servir que establezcas el valor del parámetro IMEX a 0 o a 1, porque el problema que tú estás teniendo, entiendo que es del propio Microsoft Excel, el cual toma como texto los números que se le transfieren desde otro origen de datos. Es un problema bastante conocido e ignoro si existe alguna solución para que los tome como números al realizar la exportación de datos.
     
    > Que debo hacer para conseguir que se muestren en Excel, los datos
    > como númerico y respeten el formato de la columna.
     
    Para que te los tome como números, la primera fila de la hoja de cálculo, o del rango de celdas, con o sin nombre, tiene que tener un formato númerico. Pero si es así, en lugar de insertar los datos en la primera fila, lo hace a partir de la segunda fila.
     
    También puedes especificar unos valores numéricos en la primera fila, y posteriormente sí se insertarán como números los valores del objeto DataTable transferido a Excel. Cuando hablo de “primera fila”, no me refiero a la fila que contiene el nombre de las columnas; me refiero a la fila inmediatamente siguiente a la fila de encabezados de columna.
     
    Si lo anterior no te convence, no te va a quedar más remedio que abrir el propio libro de Excel y modificar el tipo de dato de las columnas para establecerle un formato numérico. Para ello, busca en la ayuda de Microsoft Excel el tema “Convertir en número los números guardados como texto”, donde se explican varias técnicas para efectuar la conversión.
     
    Insisto que en mi opinión es un problema de Excel, no de cómo se transfieren los datos a Excel, porque aunque los campos del objeto DataTable sean numéricos, en Excel aparecerán como texto, salvo que ya existan datos numéricos en las columnas numéricas de la hoja del libro de Excel, o en el rango de celdas donde queremos insertar los nuevos registros.
     
    Un saludo
     

    Enrique Martínez
      [MS MVP - VB]

    sábado, 4 de junio de 2011 17:26
    Moderador