jueves, 16 de junio de 2022

Plantilla para importar imagenes en LibreOffice con Macro

Para importar imágenes en LibreOffice dentro de las celdas es incomodo, hay que importarlas una a una y luego ajustar el tamaño de las celdas.

En su día hice una macro en el excel de Microsoft, pero en LibreOffice no me reconocía unas funciones, por le que he hecho una nueva macro desde cero. El cual se importan las imágenes, simplemente se deben rellenar los cuadros azules de la derecha del botón. El primer ajuste es el número de imágenes que queremos en una columna y en un fila, dibujará una tabla de estas dimensiones. El segundo ajuste es la resolución que queremos que tengan las imágenes.

Cada vez que se pulsa el botón la macro se encarga de eliminar las imágenes existentes y dibujar la tabla con los ajustes ya mencionados. Todas la imágenes deben estar guardados dentro de una carpeta llamada "img" y el formato con el cual deben estar guardas es "img_xx.png", siendo xx un número entre 01 y 99. 




Código macro;

Rem Attribute VBA_ModuleType=VBAModule
Option VBASupport 1


Sub Imagenes1()


    Dim oDoc As Object
    Dim oDrawPage As Object
    Dim oShape As Object
    Dim iShape As Integer
    Dim iSheet As Integer
    oDoc = ThisComponent
    
   
   'Eliminar imagenes
   'https://ask.libreoffice.org/t/inserir-foto-c-macro-libreoffice/36492/4

        oDrawPage = oDoc.getSheets().getByName("Plantilla").getDrawPage()
         For iShape = oDrawPage.getCount() - 1 To 0 Step -1
            if oDrawPage.getCount()> 1 then 'Con esto evito elimnar el botón que llama a esta macro
                   oShape = oDrawPage.getByIndex(iShape)
                oDrawPage.remove(oShape)
            end if
        next


    Dim oPaginaDibujo As Object
    Dim oImagen As Object
    Dim sRuta As String
    Dim oCelda As Object
    Dim oTam As New com.sun.star.awt.Size
    Dim oX As Object
    Dim OY As object
    
    dim Ancho as string
    dim Largo as string
    dim numCeldas_x as integer
    dim numCeldas_y as integer

    oDoc = ThisComponent
    oPlan = oDoc.CurrentController.ActiveSheet
    Dim oSel As Object
    
     
    oPaginaDibujo = oPlan.getDrawPage()
    oCelda = oPlan.getCellByPosition( 5,0 ) 'leer parámeto ancho
    Ancho = ocelda.string

    oCelda = oPlan.getCellByPosition( 5,1 ) 'leer parámeto largo
    Largo = ocelda.string
    
    oCelda = oPlan.getCellByPosition( 3,0 ) 'leer número de celdas en x
    numCeldas_x=ocelda.string
    
    oCelda = oPlan.getCellByPosition( 3,1 ) 'leer número de celdas en y
    numCeldas_y=ocelda.string
    

    dim contador as integer 'contador el máximo sera = ixj
 'Cada vez ajusto las celdas a la posicón por defecto
    For i = 0 To 103 'Tamaño por defecto
        oY = oPlan.Rows(i).getRows() 'Anchura celdas
           oY.Height = 500
    Next
    
    For j = 0 To 100 'Tamaño por defecto
        ox = oPlan.Columns(j).getColumns() 'Altura celdas
           ox.Width = 1500
    Next
    
    Contador= 0
    dim str as string
    
    For i = 0 To numCeldas_y - 1
        oY = oPlan.Rows(3 + i).getRows() 'Anchura celdas
           oY.Height = Largo *10
        For j = 0 To numCeldas_x - 1
            ox = oPlan.Columns(j).getColumns() 'Altura celdas
               ox.Width = Ancho *10
               contador = contador + 1
               if contador < 10 then
                   str= "0" & contador
               else
                   str= contador
               end if
              
            sRuta = ConvertToURL(ThisWorkbook.Path & "\IMG\IMG_" & str & ".png") '& j & ".png") 'ruta de la iamgen
            oCelda = oPlan.getCellByPosition( j, i +3) 'Posicón de la celda donde se fijará la imagen
            If Dir(sRuta) <> "" Then 'Si le imagen existe, la cargo. En caso contrario no hago nada
           
               'Para crear y manipular imágenes
                 oImagen = oDoc.createInstance( "com.sun.star.drawing.GraphicObjectShape" )
                'Establecemos la ruta de la imagen
                oImagen.GraphicURL = sRuta
       
                'La agregamos a la página de dibujo, por ende, al conjunto de formas
                oPaginaDibujo.add( oImagen )
           
                'Establecemos el tamaño de la imagen, siempre establece un tamaño, si no
                'se insertará con un tamaño mínimo casi invisible.
                'La unidad viene dada en centésimas de milímetro
                oTam.Width = ancho*10
                oTam.Height = largo*10
                oImagen.setSize( oTam )
                oImagen.Anchor = oCelda
            END IF
        Next
    
    next   
    
    

End Sub



Descargar plantilla aquí:

https://drive.google.com/file/d/17M4JJNMrD-Q8SRfB2WyyioiXInKpeYZ2/view?usp=sharing