Uso de cookies

Utilizamos cookies propias y de terceros para mejorar nuestros servicios y mostrarle publicidad relacionada con sus preferencias mediante el análisis de sus hábitos de navegación. Si continúa navegando, consideramos que acepta su uso. Para obtener más información o bien conocer cómo cambiar la configuración lea nuestra Política de cookies

Revisión a fecha de 20:49 2 sep 2015; Salva (Discusión | contribuciones)

(dif) ← Revisión anterior | Revisión actual (dif) | Revisión siguiente → (dif)

Macros en Basic para Writer

Exportar un documento de Writer a PDF

Function Writer2Pdf( cRutayNombreURL as string, optional oDoc as Object ) as boolean
'--------------------------------------------------------------------------------------------    
' Exporta el documento actual a formato PDF en la ruta especificada como argumento
' La ruta tiene que estar indicada en formato URL
' Devuelve True si se exportó el documento
'          False si no es un documento Writer o no se exportó
 
Dim a(2) As New com.sun.star.beans.PropertyValue
Dim oDispatch as Object, oFrame as Object
 
On Local Error GoTo Error_NoEsUnDocumentoWriter 
 
  oDispatch = createUnoService("com.sun.star.frame.DispatchHelper")  
  oFrame = ThisComponent.CurrentController.Frame
 
  If IsMissing(oDoc) then oDoc = ThisComponent
  If oDoc.SupportsService("com.sun.star.text.TextDocument") then
 
    a(0).Name = "URL"
    a(0).Value = cRutayNombreURL ' formato URL, ejemplo "file:///H:/mi_documento.pdf"
    a(1).Name = "FilterName"
    a(1).Value = "writer_pdf_Export" 
 
    oDispatch.executeDispatch(oFrame, ".uno:ExportDirectToPDF", "", 0, a())
    Writer2Pdf = true	
  Else
 
Error_NoEsUnDocumentoWriter:
    Writer2Pdf = False
  End If
End Function

Definir el formato de página

Sub FormatoPagina(cmAncho as single, cmAlto as single, _
    cmMargenIzq as single, cmMargenDer as single, _
    cmMargenSup as single, cmMargenInf as single, _
    lOrientacionApaisada as boolean, _
    cDisenyoPagina as string )
'--------------------------------------------------------------------------------------------    
  ' cDisenyoPagina puede ser DI para derecha, izquierda
  ' R para reflejado, D para derecha, I para izquierda 
 
  Dim oStyleFamilies, oFamilies, oPageStyles, oStyle
  Dim oVCurs, oPageStyleName
  Dim oDoc
 
  oDoc = ThisComponent
  oVCurs = oDoc.CurrentController.getViewCursor() 
  oPageStyleName = oVCurs.PageStyleName
  oPageStyles = oDoc.StyleFamilies.getByName("PageStyles")
  oStyle  = oPageStyles.getByName(oPageStyleName)
 
  With oStyle
    .Width = cmAncho*1000
    .Height = cmAlto*1000 
    .LeftMargin = cmMargenIzq*1000
    .TopMargin = cmMargenSup *1000
    .RightMargin = cmMargenDer*1000
    .BottomMargin = cmMargenInf*1000
    .IsLandscape = lOrientacionApaisada
 
    select case uCase(cDisenyoPagina)
    case "DI"
        .PageStyleLayout = com.sun.star.style.PageStyleLayout.ALL
    case "R"
        .PageStyleLayout = com.sun.star.style.PageStyleLayout.MIRRORED
    case "I"
        .PageStyleLayout = com.sun.star.style.PageStyleLayout.LEFT
    case "D"
        .PageStyleLayout = com.sun.star.style.PageStyleLayout.RIGHT
    end select      
  End With
 
End Sub

Definir el ancho de las columnas de una tabla

Esta macro permite definir el ancho de las columnas de la tabla seleccionada de forma proporcional a las medidas indicadas.

Writer define el ancho de cada columna por la posición relativa que ocupa cada separador de columna.

Por lo tanto, una tabla con 5 columnas dispondrá de 4 separadores.

El ancho relativo de la tabla se establece en 10000, por lo que cada separador ocupa una posición relativa a este valor máximo.

Si las columnas de esa tabla tienen el mismo ancho, los separadores mostrarán los valores 2000,4000,6000 y 8000, respectivamente.

Esta macro permite definir el ancho de las columnas de forma proporcional; así, si las 5 columnas deseamos que se distribuyan en la proporción 1,1,5,2,1, lo especificaremos de esta forma en el diálogo que presenta la macro.

Openoffice-macro-writer-ancho-columnas.png

También podemos indicar 10,10,50,20,10, o 100,100,500,200,100, o 1000,1000,5000,2000,1000, etc., ya que lo que se evalúa son las proporciones que mantienen las cifras indicadas.

Si deseamos indicar valores en cm o mm podemos hacerlo, pero teniendo en cuenta que la coma decimal debe indicarse como un punto decimal.

Así podremos indicar que las columnas midan 2.1, 2.8, 5.0, 7.3, 1.6; si la suma no coincide con el ancho de la tabla, la macro no redimensionará las columnas según estas medidas, sino según sus proporciones relativas.

Si queremos indicar las proporciones en % también podemos hacerlo, pero no debemos indicar el %; así, si queremos que se distribuyan como un 15%,20%,10%,30%,25% indicaremos 15,20,10,30,25, que en total suman 100; en realidad, la macro sigue teniendo en cuenta las proporciones entre las cifras indicadas.

Sub Writer_TablasColumnaAncho()
'--------------------------------------------------------------------------------------------    
  ' redimensiona según las proporciones indicadas las columnas de la tabla seleccionada
  Dim i As Long, n As Long
  Dim oTabla As Object      ' Tabla seleccionada
  Dim aAnchos() As Double   ' Matriz de anchos
  Dim cAnchos As String     ' Cadena con los anchos
  Dim cNAnchos As String    ' Cadena con los nuevos anchos
  Dim nColumnas As Long     ' Número de columnas
  Dim nFactor As Double     ' Factor
  Dim nAnchoTotal As Double ' Ancho total deseado
  Dim oTblColSeps           ' Separadores de columnas
  Dim oSeleccion As Object  ' Texto seleccionado
  Dim cTitulo As String     ' Título en los diálogos
 
  cTitulo = "Ancho Columnas"
  oSeleccion = ThisComponent.CurrentController.getViewCursor
  On Error GoTo error_NoHayTabla
  oTabla=oSeleccion.TextTable  ' Tabla seleccionada
  On Error GoTo 0
 
  oTblColSeps = oTabla.TableColumnSeparators ' separadores
  nColumnas = UBound(oTblColSeps)+2  ' Número de columnas
 
  ReDim aAnchos(nColumnas-1)
 
  ' el ancho de la columna viene definido por la posición relativa del separador
  ' calculo ancho de columnas
  For n=0 To UBound(oTblColSeps)
    aAnchos(n)=oTblColSeps(n).Position
  Next
  aAnchos(n)=10000
 
  For n=UBound(aAnchos) To 1 Step -1
    aAnchos(n) = aAnchos(n)-aAnchos(n-1)
  Next
 
  ' Solicito nuevos anchos
  cAnchos = Join(aAnchos,",")
  Do While True
    cNAnchos = InputBox( "Indique el ancho relativo de las " & _
    nColumnas & " columnas de la tabla, separados por comas:", _
    cTitulo, cAnchos)
 
    If cNAnchos="" Then Exit Sub ' cancelado por el usuario
 
    aAnchos = Split(cNAnchos, ",")
 
    If UBound(oTblColSeps)<>UBound(aAnchos)-1 Then ' Si no ha indicado un número correcto de columnas
      MsgBox "Error en '" & oTabla.getName() & "': ha indicado un número incorrecto de columnas", 176, cTitulo
    Else
      '  el array aAnchos es ahora tipo string; lo convierto a numérico
      For n=0 To UBound(aAnchos)
        aAnchos(n)=Val(aAnchos(n))
        nAnchoTotal = nAnchoTotal + aAnchos(n)
      Next
 
      nFactor = 10000/nAnchoTotal ' Calculamos el factor de conversión sobre el total de 10.000 que utiliza Writer
 
      oTblColSeps(0).position = nFactor * aAnchos(0) ' calculo la posición del primer separador
 
      For n = 1 To UBound(oTblColSeps) ' para el resto de separadores
        oTblColSeps(n).position =  oTblColSeps(n-1).position + (nFactor * aAnchos(n))
      Next
 
      oTabla.TableColumnSeparators = oTblColSeps ' actualizo la tabla con los nuevos anchos
      Exit Do
 
    End If
  Loop
  Exit Sub
 
error_noHayTabla:
  MsgBox ("No se ha seleccionado ninguna tabla", 176, cTitulo)
 
End Sub
Modificada el 2 sep 2015 20:49.   Visitas: 8453