30 de octubre de 2015

Insertar una imagen en Excel

Desde VFP y con Automation, insertamos una imagen en Excel y le configuramos su tamaño.

LOCAL lcImagen, lcPlanilla, lo
*-- Selecciono imagen y nombre de planilla (xls)
lcImagen = GETPICT()
lcPlanilla = PUTFILE("Nombre","MiPlanilla","xls")
*-- Creo objeto Excel
lo = CREATEOBJECT("Excel.Application")
*-- Añado un libro nuevo
lo.Workbooks.Add
*-- Selecciono la celda donde estará la posición de la imagen
lo.Cells(3,3).Select
lo.ActiveSheet.Pictures.Insert(lcImagen).Select
lo.Selection.ShapeRange.LockAspectRatio = 0
lo.Selection.ShapeRange.Height = 320 && pixeles
lo.Selection.ShapeRange.Width = 240 && pixeles
*-- Guardo planilla
lo.ActiveWorkbook.SaveAs(lcPlanilla)
lo.Quit
lo = .Null.

Luis María Guayán

5 comentarios :

  1. Buenos días. Utilicé tu propuesta y funciona, pero cuando abro el excel en otro equipo, ya no muestra las imágenes, como que guardara solo el "link" y no la imagen en sí. ¿Alguna idea?

    ResponderBorrar
  2. Hola ami tambien me pasa lo mismo, encontraron cual es la solucion?

    ResponderBorrar
  3. El problema efectivamente es que solo se guarda un link, para guardar la imagen en sí deberás de utilizar la instrucción oAplicacion.ActiveSheet.Shapes.AddPicture().

    Pero ahora tenemos otro problema, ya que aquí no se marca la celda en la que se inserta, sino la posición en la que se quiere insertar de la hoja, y por tanto hay que calcularla antes.

    En este caso, como además las imágenes tenían distintos tamaños, las reduzco para que todas encajen en la celda correspondiente.

    IF FILE("&lcImagen")
    * Carga imagen
    _SCREEN.oImg.PICTURE = lcImagen
    _SCREEN.oImg.STRETCH = 0
    ancho2=_SCREEN.oImg.WIDTH
    alto2=_SCREEN.oImg.HEIGHT
    Ancho=INT(20*ancho2/alto2) &&calcula el ancho para 20 pixeles de alto
    Alto=20
    IF Ancho>140 && Si aún así sobrepasa los 140 pixeles de ancho, se reduce aún más
    Alto=INT(140*Alto/Ancho)
    Ancho=140
    ENDIF

    * Calcular la posición de la celda
    Izquierda = 268
    Arriba = -34 + tuFila * 21 && Mis celdas tienen una altura de 21 pixeles
    oAplicacion.ActiveSheet.Shapes.AddPicture(lcImagen, .F., .T., Izquierda, Arriba, Ancho, Alto)
    ENDIF

    ResponderBorrar
    Respuestas
    1. hola: he probado este codigo y no me funciona, olmg no me toma o es una variable?

      Borrar
  4. Luis María Guayán.

    Con el Objetivo de asegurar que la imágenes queden guardadas en el Libro de Excel y superar el inconveniente de que no se muestren en otra PC, les hago el siguiente ajuste:

    If File(lcImagen)
    *-- Selecciono la celda donde estará la posición de la imagen
    lo.Cells(lnFila,1).Select
    lo.Selection.RowHeight = 35

    *-- Insertamos la imagen y luego se redimensiona
    With lo.ActiveSheet.Shapes.AddPicture(lcImagen, .F., .T., 0, 0, -1, -1)
    .LockAspectRatio = 0
    .Top = lo.ActiveCell.Top
    .Left = lo.ActiveCell.Left
    .Width = lo.ActiveCell.Width
    .Height = lo.ActiveCell.Height
    Endwith

    Endif

    Con ésto se asegura que la imágenes queden ajustadas al ancho y alto de la celda.

    Saludos desde Nicaragua.

    Allan Raúl Acuña
    -NicaFox-

    ResponderBorrar

Los comentarios son moderados, por lo que pueden demorar varias horas para su publicación.