Foro de elhacker.net

Programación => Programación Visual Basic => Mensaje iniciado por: hunter18 en 17 Junio 2010, 22:27 pm



Título: Como exportar MSHFlexgrid1 a Excel? - Expertos en vb6.0
Publicado por: hunter18 en 17 Junio 2010, 22:27 pm
Tengo un codigo y funciona bien pero cuando el MSHFlexgrid1 tiene agrupaciones como en la imagen solo me imprime los encabezados Procesadores, Monitores, Televisores que pertenecen a la tabla categoria.

(http://r.i.elhacker.net/cache?url=http://img508.imageshack.us/img508/4697/mshflexgridtoexcel.png)

Código:
Dim rs As New ADODB.Recordset
Dim cn As New ADODB.Connection

Private Sub Command1_Click()

sSQL = "SHAPE {SELECT codcat,nomcat FROM categoria} AS CABECERA " & _
"APPEND ({SELECT codprod,nomprod,codcat FROM producto} AS DETALLE " & _
"RELATE codcat TO codcat) AS DETALLE"

rs.StayInSync = False
'cn.Open "Provider=MSDataShape.1;Extended Properties=Jet OLEDB:Database Password=;Persist Security Info=False;Data Source=c:\bd_01.mdb;Data Provider=MICROSOFT.JET.OLEDB.4.0"
 cn.Open "Provider=MSDataShape.1;Extended Properties=Jet OLEDB:Database Password=;Persist Security Info=False;Data Source=" & App.Path & "\bd_01.mdb;Data Provider=MICROSOFT.JET.OLEDB.4.0"
    
rs.Open sSQL, cn

Set MSHFlexGrid1.DataSource = rs

End Sub

Código:
Private Sub Command2_Click()
Call Exportar_HFlexgrid(App.Path & "\excel1.xls", MSHFlexGrid1)
End Sub


' -------------------------------------------------------------------------------------------
' \\ -- Función para crear un nuevo libro con el contenido del Grid
' -------------------------------------------------------------------------------------------
Public Function Exportar_HFlexgrid(sOutputPath As String, FlexGrid As Object) As Boolean
  
    On Error GoTo Error_Handler
  
    Dim o_Excel     As Object
    Dim o_Libro     As Object
    Dim o_Hoja      As Object
    Dim Fila        As Long
    Dim Columna     As Long
      
    ' -- Crea el objeto Excel, el objeto workBook y el objeto sheet
    Set o_Excel = CreateObject("Excel.Application")
    Set o_Libro = o_Excel.Workbooks.Add
    Set o_Hoja = o_Libro.Worksheets.Add
      
    ' -- Bucle para Exportar los datos
    With FlexGrid
        For Fila = 1 To .Rows - 1
            For Columna = 0 To .Cols - 1
                o_Hoja.Cells(Fila, Columna + 1).Value = .TextMatrix(Fila, Columna)
            Next
        Next
    End With
    o_Libro.Close True, sOutputPath
    ' -- Cerrar Excel
    o_Excel.Quit
    ' -- Terminar instancias
    Call ReleaseObjects(o_Excel, o_Libro, o_Hoja)
    Exportar_HFlexgrid = True
Exit Function
  
' -- Controlador de Errores
Error_Handler:
    ' -- Cierra la hoja y el la aplicación Excel
    If Not o_Libro Is Nothing Then: o_Libro.Close False
    If Not o_Excel Is Nothing Then: o_Excel.Quit
    Call ReleaseObjects(o_Excel, o_Libro, o_Hoja)
    If Err.Number <> 1004 Then MsgBox Err.Description, vbCritical
End Function
' -------------------------------------------------------------------
' \\ -- Eliminar objetos para liberar recursos
' -------------------------------------------------------------------
Private Sub ReleaseObjects(o_Excel As Object, o_Libro As Object, o_Hoja As Object)
    If Not o_Excel Is Nothing Then Set o_Excel = Nothing
    If Not o_Libro Is Nothing Then Set o_Libro = Nothing
    If Not o_Hoja Is Nothing Then Set o_Hoja = Nothing
End Sub







Título: Re: Como exportar MSHFlexgrid1 a Excel? - Expertos en vb6.0
Publicado por: karmany en 19 Junio 2010, 02:17 am
Prueba a modificar la propiedad del MSHFlexgrid: .MergeCells = flexMergeFree
Si le pones la propiedad sin combinar creo que te dará correcto, pero la presentación del control no será la adecuada.

¿Cómo haces para que te salga a la izquierda el + o - para expandir o contraer las filas? No sé si será una propiedad pues yo he modificado creo que todas y no lo logro, pero es posible que tu problema tenga que ver con eso.


Título: Re: Como exportar MSHFlexgrid1 a Excel? - Expertos en vb6.0
Publicado por: hunter18 en 19 Junio 2010, 03:43 am
Gracias por responder kermany.
No he modificado ninguna propiedad del MSHFlexgrid1 la agrupacion que vez y el simbolo mas y menos se genera automaticamente debido a la consulta SQL que utilizo con SHAPE, APPEND y RELATE

Aqui se explica sobre eso pero con treeview's lo unico que he hecho es pasar el recordset a un Hierarchical Flexgrid que para es dicho control aunque no he encontrado mucha info sobre estohttp://personal.lobocom.es/claudio/ado001.htm (http://personal.lobocom.es/claudio/ado001.htm)

No funciono aplicando .MergeCells = flexMergeFree y repito no he moidficado ninguna propiedad del MSHFlexgrid1 simplemente agrego el control al form y listo.

Espero alguien del foro pueda ayudarme! lo que devuelve al ejecutar es esto parece que hay que modificar la funcion:
(http://img194.imageshack.us/img194/8096/libroexcel01.png)

saludos



Título: Re: Como exportar MSHFlexgrid1 a Excel? - Expertos en vb6.0
Publicado por: BlackZeroX en 19 Junio 2010, 04:15 am

Podrias poner un archivo ".mdb" aquí, nunca he tenido que procesar un MSHFlexgrid1 con celdas combinadas ( es para ayudarte!¡. )

P.D.: No tengo Access ni nada de Offices por aqui xP.

Dulce Infierno Lunar!¡.


Título: Re: Como exportar MSHFlexgrid1 a Excel? - Expertos en vb6.0
Publicado por: hunter18 en 19 Junio 2010, 04:46 am
Dejo el archivo .mdb y el proyecto en rapidshare y megaupload para que lo descargues y no haya problema si alguno no funciona.

http://www.megaupload.com/?d=BTOQ0K3G (http://www.megaupload.com/?d=BTOQ0K3G)
http://rapidshare.com/files/400561951/Exportar_flexgrid.zip.html (http://rapidshare.com/files/400561951/Exportar_flexgrid.zip.html)

saludos y gracias por responder


Título: Re: Como exportar MSHFlexgrid1 a Excel? - Expertos en vb6.0
Publicado por: BlackZeroX en 19 Junio 2010, 11:43 am
Bueno la cosa es que en el FlexGrid cols da solo la cantidad de 2 es decir de tu tabla de Categorias pero no toma encuenta las demas con un simple proceso se soluciona!¡.

Código
  1.  
  2.  
  3. Option Explicit
  4.  
  5. Private WithEvents TmpAdoConector              As Cls_AdoConector      '   //  Modulo de clase para trabajar de forma limpia sobre el codigo xP.
  6.  
  7. ' -------------------------------------------------------------------------------------------
  8. ' \\ -- Función para contar las Columnas REALES de un MSHFlexgrid.
  9. ' -------------------------------------------------------------------------------------------
  10. Private Function GetColumns&(ByRef FlexGrid As MSHFlexgrid)
  11. On Error GoTo Terminar
  12. Dim Res$
  13.    Res$ = Space(1)
  14.    Do
  15.        Res$ = FlexGrid.TextMatrix(0, GetColumns&)
  16.        GetColumns& = GetColumns& + 1
  17.    Loop Until Not Err.Number <= 0
  18. Terminar:
  19.    GetColumns& = GetColumns& - 1
  20.    Err.Clear
  21. End Function
  22. ' -------------------------------------------------------------------------------------------
  23. ' \\ -- Función para crear un nuevo libro con el contenido del MSHFlexgrid
  24. ' -------------------------------------------------------------------------------------------
  25. Public Function Flexgrid_To_File_FormatExcel(ByVal sOutPutPath As String, ByRef FlexGrid As MSHFlexgrid) As Boolean
  26. On Error GoTo Error_Handler
  27. Dim Obj_Excel       As Object
  28. Dim Obj_Libro       As Object
  29. Dim Obj_Hoja        As Object
  30. Dim Fila&
  31. Dim TmpStr$
  32. Dim Columna&
  33. Dim CantCols&
  34.  
  35.    ' -- Crea el objeto Excel, el objeto workBook y el objeto sheet
  36.    Set Obj_Excel = CreateObject("Excel.Application")
  37.    If Not Obj_Excel Is Nothing Then
  38.        Set Obj_Libro = Obj_Excel.Workbooks.Add
  39.        If Not Obj_Libro Is Nothing Then
  40.            Set Obj_Hoja = Obj_Libro.Worksheets.Add
  41.            If Not Obj_Hoja Is Nothing Then
  42.  
  43.                ' -- Bucle para Exportar los datos
  44.                CantCols = GetColumns&(FlexGrid)
  45.                With FlexGrid
  46.                    For Fila = 1 To .Rows - 1
  47.                        For Columna = 0 To CantCols&
  48.                            TmpStr$ = .TextMatrix(Fila, Columna)
  49.                            If IsNumeric(TmpStr$) Then TmpStr$ = "'" & TmpStr$
  50.                            Obj_Hoja.Cells(Fila, Columna + 1).Value = TmpStr$
  51.                        Next
  52.                    Next
  53.                End With
  54.  
  55.                Obj_Libro.Close True, sOutPutPath
  56.                Call Obj_Excel.Quit
  57.  
  58.                Set Obj_Hoja = Nothing
  59.                Set Obj_Libro = Nothing
  60.                Set Obj_Excel = Nothing
  61.  
  62.                Flexgrid_To_File_FormatExcel = True
  63.  
  64.            End If
  65.        End If
  66.    End If
  67.    Exit Function
  68. Error_Handler:
  69.    Flexgrid_To_File_FormatExcel = False
  70.    Call Err.Clear
  71. End Function
  72.  
  73.  
  74.  
  75. Private Sub Cmd_Export_Click()
  76.    Call MsgBox(IIf(Flexgrid_To_File_FormatExcel("C:\Excel.xls", MS_DataGrid), "Exportacion Exitosa", "Exportacion Fallida"))
  77. End Sub
  78.  
  79. Private Sub Cmd_LoadData_Click()
  80. 'Dim TmpAdoConector              As Cls_AdoConector      '   //  Modulo de clase para trabajar de forma limpia sobre el codigo xP.
  81. Dim TmpRecordSet                As ADODB.Recordset
  82.  
  83.    Set TmpAdoConector = New Cls_AdoConector
  84.    With TmpAdoConector
  85.        .ConectionType = Other
  86.        .ConnectionString = "Provider               =   MSDataShape.1;" & _
  87.                            "Extended Properties    =   Jet OLEDB:Database Password=;" & _
  88.                            "Persist Security Info  =   False;" & _
  89.                            "Data Source            =   c:\bd_01.mdb;" & _
  90.                            "Data Provider          =   MICROSOFT.JET.OLEDB.4.0"
  91.        Set TmpRecordSet = .GetNew_RecordSet( _
  92.                                            "SHAPE {SELECT codcat,nomcat FROM categoria} AS CABECERA " & _
  93.                                            "APPEND ({SELECT codprod,nomprod,codcat FROM producto} AS DETALLE " & _
  94.                                            "RELATE codcat TO codcat) AS DETALLE" _
  95.                                            )
  96.        If Not TmpRecordSet Is Nothing Then
  97.            Set MS_DataGrid.DataSource = TmpRecordSet
  98.            With TmpRecordSet
  99.                Call .Close
  100.                Call .ActiveConnection.Close
  101.            End With
  102.            Set TmpRecordSet = Nothing
  103.        End If
  104.    End With
  105.    Set TmpAdoConector = Nothing
  106. End Sub
  107.  
  108. Private Sub TmpAdoConector_ErrorEvent(InfoError As ErrObject)
  109.    With Err
  110.        Debug.Print ""
  111.        Debug.Print String$(30, "-")
  112.        Debug.Print "Source:"; .Source
  113.        Debug.Print "Number:"; .Number
  114.        Debug.Print "Description:"; .Description
  115.        Debug.Print String$(30, "-")
  116.        Debug.Print ""
  117.    End With
  118. End Sub
  119.  
  120.  

Dulce Infierno Lunar!¡.


Título: Re: Como exportar MSHFlexgrid1 a Excel? - Expertos en vb6.0
Publicado por: BlackZeroX en 19 Junio 2010, 11:52 am
Se me olvido Usa GESHI!¡.

(http://img576.imageshack.us/img576/8084/screenexcel.jpg) (http://img576.imageshack.us/my.php?image=screenexcel.jpg)

Dulce Infierno Lunar!¡.


Título: Re: Como exportar MSHFlexgrid1 a Excel? - Expertos en vb6.0
Publicado por: karmany en 19 Junio 2010, 17:35 pm
Efectivamente como dice BlackZeroX el problema es el número de columnas. Tú haces lo siguiente:
Código
  1. With FlexGrid
  2.        For Fila = 1 To .Rows - 1
  3.            For Columna = 0 To .Cols - 1
  4.                o_Hoja.Cells(Fila, Columna + 1).Value = .TextMatrix(Fila, Columna)
  5.            Next
  6.        Next
  7. End With

y el valor de .Cols no es correcto.

El problema viene porque tienes dos tablas relacionadas:
(http://img535.imageshack.us/img535/7742/30232391.gif)

Decir que el código de BlackZeroX me parece muy bueno y se puede utilizar de forma general. Lo que dará error será Cls_AdoConector, parece ser un módulo de clase que desconozco.

Sabiendo que sólo vas a tener 5 columnas puedes hacer:
   
Código
  1. With FlexGrid
  2.        For Fila = 1 To .Rows - 1
  3.            For Columna = 1 To 5
  4.                o_Hoja.Cells(Fila, Columna).Value = .TextMatrix(Fila, Columna)
  5.            Next
  6.        Next
  7.    End With





Título: Re: Como exportar MSHFlexgrid1 a Excel? - Expertos en vb6.0
Publicado por: hunter18 en 19 Junio 2010, 18:33 pm
BlackZeroX excelente tus funciones, el codigo que tenia solo cogia las 2 primeras columnas lo cual solucionaste con tu funcion GetColumns, se agradece el tiempo empleado.

karmany, gracias por la aclaracion sobre donde estaba el error de logica y para utilizar el codigo de BlackZeroX basta con hacerlo con sus 2 funciones, la clase Cls_AdoConector es un modulo asumo que creado por BlackZeroX para facilitarse la tarea de conexion.

Finalmente podrian comentar como trabaja la funcion  GetColumns y tambien por que solo tomaba las dos primeras columnas las cuales estaban agrupadas si supuestamente MSHFlexGrid1.Cols recupera el numero de columnas de los encabezados?, de todas maneras voy a revisar el codigo.

saludos


Título: Re: Como exportar MSHFlexgrid1 a Excel? - Expertos en vb6.0
Publicado por: BlackZeroX en 19 Junio 2010, 23:00 pm
Finalmente podrian comentar como trabaja la funcion  GetColumns y tambien por que solo tomaba las dos primeras columnas las cuales estaban agrupadas si supuestamente MSHFlexGrid1.Cols recupera el numero de columnas de los encabezados?, de todas maneras voy a revisar el codigo.

Lo que pasa es que .Cols te va a devolver lo de tu primer FlexGrid aqui hay dos bueno se puede decir que son dos!¡ FlexGrid solo que anidados segun tu sentencia SQL (creo que es PL/SQL peo no estoy seguro...)

Bien bien si ven en el FlexGrid tiene los signos de -/+ para contraer los datos bueno cuando se contraen se muestran las Verdades Columnas del FlexGrid es decir de tu tabla categorias y los que fueron contraidos son los de tu tabla de Productos o algo asi se llamaban xP jeje. Bien la cosa es que solo va a contar las columnas de tu primera sentencia es decir de tu Tabla Columnas tal cual se lo as indicado en tu sentencia SQL

P.D.: NO TIENE NADA QUE VER la relacion de tablas dentro de Access o de una Base de datos, ya que una sentencia SQL puede ignorar (en este caso lo hace) las relaciones.

Nota:
 -> * Es mejor hacer un modulo de Clase para contener el objecto de Excel, ya que si la funcion se ve interrumpida o terminada la aplicacion por X motivo el Release Memory no se ejecutara (Ando haciendo un modulo de Clase pequeño y ergonomico cuando lo acabe lo publico en un nuevo Tema)!¡.

Dulce Infierno Lunar!¡.


Título: Re: Como exportar MSHFlexgrid1 a Excel? - Expertos en vb6.0
Publicado por: hunter18 en 20 Junio 2010, 02:17 am
Uhm!! ya veo asi era el asunto gracias por la aclaracion,estare pendiente haber cuando sale tu modulo de clase, saludos


Título: Re: Como exportar MSHFlexgrid1 a Excel? - Expertos en vb6.0
Publicado por: BlackZeroX en 20 Junio 2010, 03:09 am
Uhm!! ya veo asi era el asunto gracias por la aclaracion,estare pendiente haber cuando sale tu modulo de clase, saludos

http://foro.elhacker.net/programacion_visual_basic/srccls_clsexcelaplication_release_memory-t297215.0.html;msg1472257#msg1472257

Puedes usar en tu caso este!¡.

Código
  1.  
  2. '   //  Función para contar las Columnas REALES de un MSHFlexgrid.
  3. Private Function GetColumns&(ByRef FlexGrid As MSHFlexGrid)
  4. On Error GoTo Terminar
  5. Dim Res$
  6.    Res$ = Space(1)
  7.    Do
  8.        Res$ = FlexGrid.TextMatrix(0, GetColumns&)
  9.        GetColumns& = GetColumns& + 1
  10.    Loop Until Not Err.Number <= 0
  11. Terminar:
  12.    GetColumns& = GetColumns& - 1
  13.    Err.Clear
  14. End Function
  15.  
  16. '   //  Función para crear un nuevo libro con el contenido del MSHFlexgrid
  17. Public Function Flexgrid_To_File_FormatExcel(ByVal sOutPutPath As String, ByRef FlexGrid As MSHFlexGrid) As Boolean
  18. On Error GoTo Error_Handler
  19. Dim InstanciaExcel              As Cls_ExcelAplication                      '   //  Contenedor de la aplicacion Excel Con {Liberacion de Memoria} al descargar!¡).
  20. Dim Obj_Hoja                    As Object
  21. Dim Lng_UbHojas&
  22. Dim Fila&
  23. Dim TmpStr$
  24. Dim Columna&
  25. Dim CantCols&
  26.    Set InstanciaExcel = New Cls_ExcelAplication                            '   //  Crea el objeto Excel,   (Con {Liberacion de Memoria} Automatica)
  27.    If Not InstanciaExcel Is Nothing Then
  28.        With InstanciaExcel
  29.            Set Obj_Hoja = .Hoja                                            '   //  Creamos una nueva Hoja
  30.            CantCols = GetColumns&(FlexGrid)
  31.            With FlexGrid
  32.                For Fila = 1 To .Rows - 1                                   '   //  Bucle para Exportar los datos.
  33.                    For Columna = 0 To CantCols&                            '   //  Bucle para Exportar los datos.
  34.                        TmpStr$ = .TextMatrix(Fila, Columna)                                                                                                                                                                                                         '   //  Texto de Celda.
  35.                        If IsNumeric(TmpStr$) Then TmpStr$ = "'" & TmpStr$  '   //  Si es numero lo exportamos como tal {Seria como comentario...} !¡.
  36.                        Obj_Hoja.cells(Fila, Columna + 1).Value = TmpStr$
  37.                    Next
  38.                Next
  39.            End With
  40.            Call .Libro(, Obj_Hoja).Close(True, sOutPutPath)
  41.            Set Obj_Hoja = Nothing
  42.        End With
  43.    End If
  44. Error_Handler:
  45.    Set InstanciaExcel = Nothing                                            '   //  Se descarga la clase y la aplicacion Excel automaticamente.
  46.    Flexgrid_To_File_FormatExcel = Not CBool(Err.Number)
  47.    Call Err.Clear
  48. End Function
  49.  
  50.  

Dulce Infierno Luanr!¡.


Título: Re: Como exportar MSHFlexgrid1 a Excel? - Expertos en vb6.0
Publicado por: hunter18 en 20 Junio 2010, 04:37 am
Simplemente genial


Título: Re: Como exportar MSHFlexgrid1 a Excel? - Expertos en vb6.0
Publicado por: karmany en 20 Junio 2010, 13:10 pm
Un trabajo excelente. Está todo bien protegido de errores.
Efectivamente lo del + y - del MSHFlexGrid es causa de la consulta, realmente no tengo tiempo para analizar.

Felicidades, muy buen trabajo.