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.
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