none
Enviar MSChart a excel (Lenguaje vb) RRS feed

  • Pregunta

  • Hola colegas abusando de su sabiduría nuevamente. Tengo una duda que no he podido resolver, espero ustedes me puedan ayudar. 

    Lo que deseo hacer y hasta ahora no he podido es mostrar un objeto chart de VS en un libro de excel. Es decir en la aplicación genero un gráfico y deseo poder mostrar este gráfico en Excel no importa que sea como imagen, solamente deseo mostrarlo. 

    ¿Esto es posible? ¿Me pueden orientar?

    ¿Cómo podría indicar el tamaño y la ubicación?

    martes, 26 de agosto de 2014 14:48

Respuestas

  • Imports Excel
    
    Public Class Form1
    
        Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
    
            Dim _excel As New Excel.Application
            Dim _workbook As Excel.Workbook = _excel.Workbooks.Add
            Dim _worksheet As Excel.Worksheet = CType(_workbook.Worksheets.Add, Excel.Worksheet)
            Dim _oleObj As Excel.OLEObjects = CType(_worksheet.OLEObjects, Excel.OLEObjects)
    
            '_excel.Visible = True
    
            Dim png As String = Environment.ExpandEnvironmentVariables("%TEMP%") & "\chart.png"
    
            Chart1.SaveImage(png, System.Drawing.Imaging.ImageFormat.Png)
            _oleObj.Add(Filename:=png, Left:=100, Top:=100)
    
            _workbook.SaveAs("c:\walter\libro_chart.xls")
            _excel.Quit()
    
            _worksheet = Nothing
            _workbook = Nothing
            _excel = Nothing
    
        End Sub
    End Class
    


    [W]

    • Marcado como respuesta Misael 2 viernes, 5 de septiembre de 2014 14:58
    sábado, 30 de agosto de 2014 19:06
  • Eso es OLE. Su fortaleza y su debilidad.

    Ni tu programa ni excel se hacen responsables de que el usuario pueda ver la imagen. Esa es responsabilidad del usuario. Él es quien debe instalar el handler que hará el render.

    En esta pc evidentemente el handler ole para el png existe porque yo veo la imagen. Probá otro formato, gif/jpg/bmp imagino que alguno tendrás.

    ---

    Si espío en el registro, los archivos png en esta pc tienen registrado un CLSID

    [HKEY_CLASSES_ROOT\pngfile\CLSID]
    @="{11943940-36DE-11CF-953E-00C0A84029E9}"

    Si me muevo hasta ese lugar, puedo leer

    Fotografía de Microsoft Photo Editor 3.0
    C:\PROGRA~1\COMMON~1\MICROS~1\PhotoEd\PHOTOED.EXE

    Ese es el programa pinta la imagen en excel (ole significa que otro es quien se hace cargo). Si lo tienes, puedes ir al registro del pngfile y agregar ese CLSID.

    O puedes ir al registro de otras clases de archivos de imagen, ver si tiene un CLSID registrado, buscar el nombre del progra y, si vos sabés que ese programa también trabaja con png, colgar ese mismo CLSID bajo la clave pngfile.

    Creo que es todo lo que se precisa para registrar el handler.


    [W]


    • Editado [Walter] miércoles, 3 de septiembre de 2014 19:20
    • Marcado como respuesta Misael 2 viernes, 5 de septiembre de 2014 14:58
    miércoles, 3 de septiembre de 2014 18:54

Todas las respuestas

  • Imports Excel
    
    Public Class Form1
    
        Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
    
            Dim _excel As New Excel.Application
            Dim _workbook As Excel.Workbook = _excel.Workbooks.Add
            Dim _worksheet As Excel.Worksheet = CType(_workbook.Worksheets.Add, Excel.Worksheet)
            Dim _oleObj As Excel.OLEObjects = CType(_worksheet.OLEObjects, Excel.OLEObjects)
    
            '_excel.Visible = True
    
            Dim png As String = Environment.ExpandEnvironmentVariables("%TEMP%") & "\chart.png"
    
            Chart1.SaveImage(png, System.Drawing.Imaging.ImageFormat.Png)
            _oleObj.Add(Filename:=png, Left:=100, Top:=100)
    
            _workbook.SaveAs("c:\walter\libro_chart.xls")
            _excel.Quit()
    
            _worksheet = Nothing
            _workbook = Nothing
            _excel = Nothing
    
        End Sub
    End Class
    


    [W]

    • Marcado como respuesta Misael 2 viernes, 5 de septiembre de 2014 14:58
    sábado, 30 de agosto de 2014 19:06
  • Hola Walter, gracias por tu respuesta seguí tu ejemplo, pero sólo veo el objeto incrustado, como un icono. lo que yo deseo es ver la imagen como tal así como indicarle la posición y el tamaño ya que mostrare varias gráficas en una hoja de excel y deseo poder acomodarlas y darle formato. Además me gustaría que se mostrara en un archivo de excel ya existente para agregarle notas y títulos que ya estén predeterminados. 

    Espero puedan iluminarme! Gracias por su ayuda. 

    miércoles, 3 de septiembre de 2014 18:02
  • Eso es OLE. Su fortaleza y su debilidad.

    Ni tu programa ni excel se hacen responsables de que el usuario pueda ver la imagen. Esa es responsabilidad del usuario. Él es quien debe instalar el handler que hará el render.

    En esta pc evidentemente el handler ole para el png existe porque yo veo la imagen. Probá otro formato, gif/jpg/bmp imagino que alguno tendrás.

    ---

    Si espío en el registro, los archivos png en esta pc tienen registrado un CLSID

    [HKEY_CLASSES_ROOT\pngfile\CLSID]
    @="{11943940-36DE-11CF-953E-00C0A84029E9}"

    Si me muevo hasta ese lugar, puedo leer

    Fotografía de Microsoft Photo Editor 3.0
    C:\PROGRA~1\COMMON~1\MICROS~1\PhotoEd\PHOTOED.EXE

    Ese es el programa pinta la imagen en excel (ole significa que otro es quien se hace cargo). Si lo tienes, puedes ir al registro del pngfile y agregar ese CLSID.

    O puedes ir al registro de otras clases de archivos de imagen, ver si tiene un CLSID registrado, buscar el nombre del progra y, si vos sabés que ese programa también trabaja con png, colgar ese mismo CLSID bajo la clave pngfile.

    Creo que es todo lo que se precisa para registrar el handler.


    [W]


    • Editado [Walter] miércoles, 3 de septiembre de 2014 19:20
    • Marcado como respuesta Misael 2 viernes, 5 de septiembre de 2014 14:58
    miércoles, 3 de septiembre de 2014 18:54
  • Gracias! Me sirvió de mucho tu ayuda, pude solucionar el problema.
    viernes, 5 de septiembre de 2014 14:58