Devolver todas las fuentes visibles en LibreOffice. Mire FontDescriptor
-fonts = app.fonts()
-for f in fonts:
- app.debug(f'Nombre: {f.Name} - Estilo: {f.StyleName}')
-
Devolver todos los filtros soportados en LibreOffice. Mire la ayuda y en API FilterFactory para más detalles.
-filtros = app.filters()
-for f in filtros:
- info = f"Nombre UI: {f['UIName']} - Nombre: {f['Name']} - Tipo: {f['Type']}"
- app.debug(info)
-
Ejecutar cualquier comando UNO
de LibreOffice, mire la lista de comandos y API dispatch.
Este método automáticamente agrega el prefijo necesario: .uno:
doc = app.active
-comando = 'Gallery'
-app.dispatch(doc, comando)
-
Use este método solamente si no hay un método equivalente en easymacro
o directamente en el API de LibreOffice.
Envíar contenido al portapapeles.
-app.clipboard.set('Los 7 samuráis')
-
Recuperar contenido del portapapeles.
-content = app.clipboard.get()
-app.debug(content)
-
Deshabilitar un comando. Para una lista de comandos mire DispatchCommands.
-comando = 'OpenFromCalc'
-resultado = app.cmd.disable(comando)
-app.debug(resultado)
-
OpenFromCalc
es la opción para abrir documentos en Calc, deshabilita o habilita la entrada del menú y el icono en la barra de herramientas.
Habilitar un comando.
-comando = 'OpenFromCalc'
-resultado = app.cmd.enabled(comando)
-app.debug(resultado)
-
Obtener valores de la configuración de LibreOffice.
-nombre_node = '/org.openoffice.Office.Common/Help'
-clave = 'System'
-valor = app.get_config(nombre_node, clave)
-app.debug(valor)
-
-nombre_node = '/org.openoffice.Office.Common/Misc/'
-clave = 'FirstRun'
-valor = app.get_config(nombre_node, clave)
-app.debug(valor)
-
-clave = 'UseSystemFileDialog'
-valor = app.get_config(nombre_node, clave)
-app.debug(valor)
-
17/08/2022 14:14:12 - DEBUG - UNIX
-17/08/2022 14:14:12 - DEBUG - False
-17/08/2022 14:14:12 - DEBUG - True
-
Establece un nuevo valor en la configuración de LibreOffice.
-nombre_nodo = '/org.openoffice.Office.UI/ColorScheme'
-clave = 'CurrentColorScheme'
-nuevo_valor = 'LibreOffice Dark'
-resultado = app.set_config(nombre_nodo, clave, nuevo_valor)
-app.debug(resultado)
-
Algunos nodos y claves interesantes:
-/org.openoffice.Office.Common/Save/Document
-No todos los valores de los nodos se pueden cambiar, algunos valores son de solo lectura.
-Insertar nuevo menú en Calc.
-En la propiedad CommandURL
es posible establecer tanto un comando UNO de LibreOffice, como un diccionario con los datos de una macro.
El nombre del menú es importante para cuando se quiera eliminar.
-nombre_menu = 'zaz.my.menu'
-menu = {
- 'Label': 'My menu',
- 'CommandURL': nombre_menu,
- 'Submenu': [
- {
- 'Label': 'Open Macros Dialog...',
- 'CommandURL': 'MacroDialog',
- },
- {
- 'Label': '-',
- },
- {
- 'Label': 'My macro',
- 'CommandURL': {'library': 'test', 'name': 'hola'},
- },
- {
- 'Label': 'Execute macro...',
- 'CommandURL': 'RunMacro',
- 'ShortCut': 'Shift+Ctrl+Alt+E',
- },
- ]
-}
-
-menus_calc = app.menus['calc']
-menus_calc.insert(menu)
-
Eliminar un menú existente.
-nombre_menu = 'zaz.my.menu'
-menus_calc = app.menus['calc']
-menus_calc.remove(nombre_menu)
-
Dentro del menú Herramientas (tools
), después de la opción Macros...
menu = app.menus['calc']['tools']
-
-menu_nombre = 'zaz.my.menu'
-menu_nuevo = {
- 'Label': 'My menu',
- 'CommandURL': menu_nombre,
- 'Submenu': [
- {
- 'Label': 'Open Macros Dialog...',
- 'CommandURL': 'MacroDialog',
- },
- {
- 'Label': '-',
- },
- {
- 'Label': 'My macro',
- 'CommandURL': {'library': 'test', 'name': 'hello'},
- },
- {
- 'Label': 'Execute macro...',
- 'CommandURL': 'RunMacro',
- 'ShortCut': 'Shift+Ctrl+Alt+E',
- },
- ]
-}
-
-if menu_nombre in menu:
- menu.remove(menu_nombre)
-else:
- menu.insert(menu_nuevo, '.uno:MacrosMenu')
-
Para saber los nombres de cualquier menú.
-menu = app.menus['calc']['tools']
-menu.debug()
-
(0) .uno:SpellDialog
-(1) .uno:SpellOnline
-(2) .uno:ThesaurusDialog
-(3) .uno:LanguageMenu
- ├─ (0) .uno:SetLanguageAllTextMenu
- ├─ (1) ----------
- ├─ (2) .uno:Hyphenate
- ├─ (3) .uno:ChineseConversion
- ├─ (4) .uno:HangulHanjaConversion
- ├─ (5) ----------
- ├─ (6) .uno:MoreDictionaries
-(4) ----------
-(5) .uno:AutoCorrectDlg
-(6) .uno:AutoComplete
-(7) .uno:ImageMapDialog
-(8) ----------
-(9) .uno:RedactDoc
-(10) .uno:AutoRedactDoc
-(11) ----------
-(12) .uno:GoalSeekDialog
-(13) .uno:SolverDialog
-(14) .uno:AuditMenu
- ├─ (0) .uno:ShowPrecedents
- ├─ (1) .uno:ShowDependents
- ├─ (2) ----------
- ├─ (3) .uno:ClearArrows
- ├─ (4) .uno:ClearArrowPrecedents
- ├─ (5) .uno:ClearArrowDependents
- ├─ (6) ----------
- ├─ (7) .uno:ShowErrors
- ├─ (8) .uno:RefreshArrows
- ├─ (9) ----------
- ├─ (10) .uno:AuditingFillMode
- ├─ (11) .uno:AutoRefreshArrows
- ├─ (12) .uno:ShowInvalid
-(15) .uno:ScenarioManager
-(16) ----------
-(17) .uno:ToolsFormsMenu
- ├─ (0) .uno:SwitchControlDesignMode
- ├─ (1) .uno:UseWizards
- ├─ (2) ----------
- ├─ (3) .uno:ControlProperties
- ├─ (4) .uno:FormProperties
- ├─ (5) ----------
- ├─ (6) .uno:ShowFmExplorer
- ├─ (7) .uno:TabDialog
- ├─ (8) .uno:AddField
- ├─ (9) ----------
- ├─ (10) .uno:OpenReadOnly
- ├─ (11) .uno:AutoControlFocus
-(18) ----------
-(19) .uno:ShareDocument
-(20) .uno:Protect
-(21) .uno:ToolProtectionDocument
-(22) ----------
-(23) .uno:MacrosMenu
- ├─ (0) .uno:MacroRecorder
- ├─ (1) .uno:RunMacro
- ├─ (2) .uno:BasicIDEAppear
- ├─ (3) .uno:ScriptOrganizer
- ├─ (4) ----------
- ├─ (5) .uno:MacroSignature
- ├─ (6) .uno:MacroOrganizer?TabId:short=1
- ├─ (7) ----------
- ├─ (8) .uno:OpenXMLFilterSettings
-(24) .uno:DevelopmentToolsDockingWindow
-(25) ----------
-(26) service:com.sun.star.deployment.ui.PackageManagerDialog
-(27) .uno:ConfigureDialog
-(28) .uno:OptionsTreeDialog
-
-
-
-
-
-
-
-
- Iterar en todos los accesos directos. Accesos directos disponibles para todas las aplicaciones.
-for acceso_directo, comando in app.shortcuts:
- app.debug(acceso_directo, comando)
-
Devolver una lista de tuplas con toda la información.
-datos = app.shortcuts.get_all()
-app.debug(datos)
-
Verificar si un acceso directo esta asignado.
-acceso_directo = 'Shift+Ctrl+Alt+T'
-app.debug(acceso_directo in app.shortcuts)
-
Establecer un acceso directo a un comando.
-sc = app.shortcuts
-acceso_directo = 'Shift+Ctrl+Alt+T'
-comando = 'MacroDialog'
-sc.set(acceso_directo, comando)
-
Establecer un acceso directo a una macro.
-sc = app.shortcuts
-acceso_directo = 'Shift+Ctrl+Alt+M'
-macro = {'library': 'test', 'name': 'pruebas'}
-sc.set(acceso_directo, macro)
-
Devolver el comando asociado a un acceso directo.
-sc = app.shortcuts
-acceso_directo = 'Shift+Ctrl+Alt+M'
-comando = sc.get_by_shortcut(acceso_directo)
-app.debug(comando)
-
Devolver el acceso directo asociado a un comando. Puede haber más de uno.
-sc = app.shortcuts
-comando = 'MacroDialog'
-acceso_directo = sc.get_by_command(comando)
-app.debug(acceso_directo)
-
Eliminar por acceso directo.
-sc = app.shortcuts
-acceso_directo = 'Shift+Ctrl+Alt+T'
-sc.remove_by_shortcut(acceso_directo)
-
Eliminar por comando.
-sc = app.shortcuts
-macro = {'library': 'test', 'name': 'pruebas'}
-sc.remove_by_command(macro)
-
Reiniciar todas las modificaciones.
-app.shortcuts.reset()
-
Por ejemplo Calc.
-sc = app.shortcuts['calc']
-
Los métodos son los mismos que los globales.
-Para las demas aplicaciones: writer
, draw
, impress
, math
.
Referencia por selección actual.
-seleccion = app.selection
-app.debug(seleccion)
-
20/08/2022 15:32:36 - DEBUG - Cell: $Sheet1.$A$2
-20/08/2022 15:32:39 - DEBUG - Range: $Sheet1.$C$8:$D$11
-
Referencia por dirección.
-hoja = app.active_sheet
-celda = hoja['A1']
-rango = hoja['C10:D15']
-
-app.debug(celda)
-app.debug(rango)
-
Referencia por posición.
-Para celdas: HOJA[fila,columna]
Para rangos: HOJA[fila_inicial:fila_final, columna_inicial:columna_final]
hoja = app.active_sheet
-
-# ~ Cell A10
-celda = hoja[9,0]
-
-# ~ Range A1:C10
-rango = hoja[0:10,0:3]
-
Iterar cada celda de un rango.
-hoja = app.active_sheet
-rango = hoja['B10:C15']
-
-for celda in rango:
- app.debug(celda)
-
Verificar si un rango esta dentro de otro.
-hoja = app.active_sheet
-
-celda = hoja['C5']
-rango = hoja['A1:E10']
-
-resultado = celda in rango
-app.debug(resultado)
-
-celda = hoja['C50']
-resultado = celda in rango
-app.debug(resultado)
-
Limpia el rango. Por default solo borra datos. Mire API CellFlags para más información.
-rango.clear()
-
Para borrar todo.
-rango.clear(app.ALL)
-
Verdadero (True) si el rango es de una sola celda.
-hoja = app.active_sheet
-
-celda = hoja['A1']
-app.debug(celda.is_cell)
-
-rango = hoja['A1:C5']
-app.debug(rango.is_cell)
-
Devuelve la dirección de la celda o rango como texto.
-hoja = app.active_sheet
-
-celda = hoja['A1']
-app.debug(celda.name)
-
-rango = hoja['A1:C5']
-app.debug(rango.name)
-
Devuelve la dirección de la celda como una estructura: com.sun.star.table.CellAddress
hoja = app.active_sheet
-
-celda = hoja['A1']
-if celda.is_cell:
- app.debug(celda.address)
-
Devuelve la dirección del rango como una estructura: com.sun.star.table.CellRangeAddress
hoja = app.active_sheet
-
-rango = hoja['A1:C5']
-if not rango.is_cell:
- app.debug(rango.range_address)
-
Devolver el tamaño del rango en filas y columnas.
-hoja = app.active_sheet
-
-rango = hoja['A1:E100']
-filas = len(rango)
-columnas = rango.len_columns
-app.debug(filas, columnas)
-
Devuelve la hoja padre.
-rango = hoja['A1:C5']
-
-hoja = rango.sheet
-app.debug(hoja)
-
Devuelve el documento padre.
-rango = hoja['A1:C5']
-
-doc = rango.doc
-app.debug(doc)
-
Devuelve o aplica el estilo de celda.
-rango = hoja['A1:C5']
-rango.style = 'Good'
-
Devuelve la región actual.
-celda = hoja['A1']
-rango = celda.current_region
-app.debug(rango)
-
Devuelve la región actual del rango excepto la primer fila.
-celda = hoja['A1']
-rango = celda.range_data
-app.debug(rango)
-
Devuelve o aplica el color de fondo del rango.
-rango = hoja['A1:E10']
-rango.back_color = 'red'
-
Devuelve el tipo de contenido de la celda: texto, número o formula.
-celda = hoja['A1']
-app.debug(celda.type)
-
Si la celda tiene una formula con error, devuelve el número de error.
-celda = hoja['A1']
-app.debug(celda.error)
-
Devuelve o establece el contenido de la celda como texto.
-celda = hoja['A1']
-celda.string = 'Maldito Mundo'
-app.debug(celda.type, celda.string)
-
-celda = hoja['A2']
-celda.string = 12345
-app.debug(celda.type, celda.string)
-
Devuelve o establece el contenido de la celda como valor.
-celda = hoja['A1']
-celda.float = 12345
-app.debug(celda.type, celda.float)
-
Devuelve o establece la formula de la celda.
-celda = hoja['A1']
-celda.formula = '=RAND()'
-app.debug(celda.type, celda.formula)
-
Devuelve o establece el contenido de la celda como fecha.
-celda = hoja['A1']
-celda.date = app.dates.date(1974, 1, 15)
-app.debug(type(celda.date), celda.date)
-
20/08/2022 18:38:53 - DEBUG - <class 'datetime.date'> 1974-01-15
-
Devuelve o establece el contenido de la celda como tiempo.
-celda = hoja['A1']
-celda.time = app.dates.time(10, 11, 12)
-app.debug(type(celda.time), celda.time)
-
Devuelve o establece el contenido de la celda como fecha y tiempo.
-celda = hoja['A1']
-celda.datetime = app.dates.datetime(1974, 1, 15, 10, 11, 12)
-app.debug(type(celda.datetime), celda.datetime)
-
Devuelve o establece el valor de la celda, estableciendo el tipo de dato automáticamente.
-hoja = app.active_sheet
-
-celda = hoja['A1']
-celda.value = 'Soy Texto'
-app.debug(celda.type, celda.value)
-
-celda = hoja['A2']
-celda.value = 12345
-app.debug(celda.type, celda.value)
-
-celda = hoja['A3']
-celda.value = '=RAND()'
-app.debug(celda.type, celda.value)
-
-celda = hoja['A4']
-celda.value = app.dates.date(1974, 1, 15)
-app.debug(celda.type, celda.value)
-
Devuelve o establece los datos de un rango. Es un alias de DataArray.
-rango = app.selection
-datos = rango.data_array
-app.debug(datos)
-rango.data_array = datos
-
El tamaño de los datos, debe ser exactamente del tamaño del rango destino. De lo contrario obtendrá un error.
-Devuelve o establece los datos de un rango. Es un alias de FormulaArray.
-rango = app.selection
-
-datos = rango.data_array
-app.debug(datos)
-datos = rango.formula_array
-app.debug(datos)
-rango.formula_array = datos
-
data_array devolverá los resultados de las celdas con formulas. formula_array devolverá las formulas en dichas celdas.
-Alias de data_array
al obtener los datos. Al establecer los datos, si es un rango se comporta como data_array
, pero si es una celda, se autoajusta al tamaño de los datos.
hoja = app.active_sheet
-celda = hoja['A1']
-datos = (
- (1, 'Uno'),
- (2, 'Dos'),
- (3, 'Tres'),
-)
-
-celda.data = datos
-app.debug(celda.current_region.data)
-
Siempre valide que haya suficientes celdas libres para los datos para evitar sobreescribirlos.
-Devuelve o establece los datos como diccionarios.
-hoja = app.active_sheet
-celda = hoja['A1']
-
-datos = (
- {'No': 1, 'Nombre': 'Ingrid'},
- {'No': 2, 'Nombre': 'Sophia'},
- {'No': 3, 'Nombre': 'Scarlette'},
-)
-
-celda.dict = datos
-app.debug(celda.current_region.dict)
-
Devuelve la siguiente celda libre después de la región actual.
-hoja = app.active_sheet
-celda = hoja['A1']
-
-celda_libre = celda.next_free
-app.debug(celda_libre)
-
doc = app.active
-app.debug(doc.type)
-
Mostrar u ocultar encabezados de filas y columnas.
-doc = app.active
-app.msgbox(doc.headers)
-doc.headers = not doc.headers
-app.msgbox(doc.headers)
-doc.headers = not doc.headers
-
Mostrar u ocultar las pestañas de las hojas.
-doc = app.active
-app.msgbox(doc.tabs)
-doc.tabs = not doc.tabs
-app.msgbox(doc.tabs)
-doc.tabs = not doc.tabs
-
Devolver la selección activa.
-doc = app.active
-seleccion = doc.selection
-app.debug(seleccion)
-
Cuidado, la selección actual pueden ser muchas cosas diferentes.
-Devolver una tupla con los nombres de todas las hojas.
-doc = app.active
-nombres = doc.names
-app.debug(nombres)
-
Devuelve la hoja activa.
-doc = app.active
-hoja = doc.active
-app.debug(hoja)
-
Activar hoja, argumento como objeto.
-doc = app.active
-hoja = doc[-1]
-doc.activate(hoja)
-
Activar hoja por nombre.
-doc = app.active
-doc.activate('Hoja3')
-
Seleccionar una celda o rango.
-doc = app.active
-cell = doc[0]['A1']
-doc.select(cell)
-
NO es necesario seleccionar celdas o rangos para manipularlos.
-Permitir al usuario seleccionar un rango. Es necesario pasarle una clase con el nombre que prefiera (Eventos
es recomendable) con dos métodos para procesar la captura como en el siguiente ejemplo:
class Eventos():
-
- def __init__(self, doc):
- self.doc = doc
-
- def range_selection_done(self, range_selection):
- if range_selection:
- app.debug(range_selection)
- self.doc.remove_range_selection_listener()
- return
-
- def range_selection_aborted(self):
- self.doc.remove_range_selection_listener()
- return
-
-
-def main():
- doc = app.active
- doc.start_range_selection(Eventos)
- return
-
Inserta una nueva hoja.
-doc = app.active
-hoja = doc.insert('OtraHoja')
-
Insertar varias hojas. Devolverá la última insertada.
-nombres = ('Enero', 'Febrero', 'Marzo')
-hoja = doc.insert(nombres)
-app.debug(hoja)
-
Creando una nueva instancia y asignandola.
- doc = app.active
- doc['NuevaHoja'] = doc.new_sheet()
-
Si la hoja existe, obtendrá un error, verifique siempre que no exista primero.
-Mover hojas.
-Pasar la hoja como objeto, de forma predetermianda se mueve a la última posición.
-doc = app.active
-hoja = doc[0]
-doc.move(hoja)
-
Pasar la hoja por nombre.
-doc = app.active
-doc.move('Hoja1')
-
Especificar la posición destino.
-doc = app.active
-hoja = doc[0]
-doc.move(hoja, 2)
-
Eliminar hoja.
-doc = app.active
-sheet = doc[0]
-
-doc.remove(sheet)
-
Eliminar por nombre.
-doc.remove('Hoja2')
-
Copiar hoja dentro del mismo documento.
-doc = app.active
-hoja = doc[0]
-
-doc.copy_sheet(hoja, 'Otra hoja')
-
Por nombre.
-doc.copy_sheet('Hoja1', 'Hoja2')
-
Si no se establece el nuevo nombre, se generá de forma automática: nombre + índice
.
doc.copy_sheet(hoja)
-
Copiar hojas de otro documento. Copiar con el mismo nombre.
-doc = app.active
-documento_origen = app.docs['Contactos.ods']
-nombre_origen = 'Nombres'
-
-doc.copy_from(documento_origen, nombre_origen)
-
Copiar con un nuevo nombre.
-doc.copy_from(documento_origen, nombre_origen, 'NuevoNombre')
-
Si solo se establece el documento origen, se copian todas las hojas.
-doc.copy_from(documento_origen)
-
Ordenar hojas en orden alfabetico.
-doc = app.active
-doc.sort()
-
Ordenar de forma inversa.
-doc = app.active
-doc.sort(True)
-
Obtener una tupla con los eventos soportados por el documento.
-doc = app.active
-nombres = doc.events.names
-app.debug(nombres)
-
def doc_on_focus(event):
- app.debug('Documento activado...')
- return
-
-
-def main():
- doc = app.active
- events = doc.events
- if 'OnFocus' in events:
- macro = {'library': 'test', 'name': 'doc_on_focus'}
- events['OnFocus'] = macro
- return
-
doc = app.active
-doc.events['OnFocus'] = {}
-
O
-doc = app.active
-doc.events.remove('OnFocus')
-
Obtener una referencia desde la selección actual. Deben de estar seleccionados más de un rango de celdas.
-doc = app.active
-seleccion = doc.selection
-app.debug(seleccion)
-
20/08/2022 13:21:17 - DEBUG - Ranges: ('Sheet1.A5:C8', 'Sheet1.E11:F14')
-
Contar los rangos.
-doc = app.active
-contar = len(doc.selection)
-app.debug(contar)
-
Iterar entre los rangos.
-doc = app.active
-for rango in doc.selection:
- app.debug(rango)
-
20/08/2022 13:27:03 - DEBUG - Range: $Sheet1.$B$4:$D$7
-20/08/2022 13:27:03 - DEBUG - Range: $Sheet1.$G$10:$H$14
-
Referencia a un rango por índice.
-doc = app.active
-rangos = doc.selection
-
-rango = rangos[1]
-app.debug(rango)
-
Referencia a un rango por su dirección.
-rango = rangos['Hoja1.A1:B5']
-app.debug(rango)
-
Verificar si un rango esta en la colección.
-doc = app.active
-hoja = doc.active
-rangos = doc.selection
-
-resultado = hoja['D5:F10'] in rangos
-app.debug(resultado)
-
Crear un nuevo contender de rangos vacío.
-doc = app.active
-rangos = doc.ranges()
-app.debug(rangos)
-
doc = app.active
-hoja = doc.active
-
-rangos = doc.ranges()
-rangos.add(hoja['A1:B2'])
-rangos.add(hoja['D5:F10'])
-app.debug(rangos)
-
rangos.remove(hoja['A1:B2'])
-
Devolver las direcciones de los rangos.
-doc = app.active
-rangos = doc.selection
-
-nombres = rangos.names
-app.debug(nombres)
-
Devolver y establecer datos.
-doc = app.active
-rangos = doc.selection
-
-datos = rangos.data
-app.debug(datos)
-rangos.data = datos
-
Cada rango debe tener exactamente el mismo tamaño.
-Establecer el estilo de todos los rangos.
-doc = app.active
-rangos = doc.selection
-rangos.style = 'Good'
-
Obtener una tupla con los eventos soportados por la hoja.
-hoja = app.active.active
-nombres = hoja.events.names
-app.debug(nombres)
-
def on_select(source):
- app.debug(source.AbsoluteName)
- return
-
-
-def main():
- doc = app.active
- hoja = doc.active
-
- if 'OnSelect' in hoja.events:
- macro = {'library': 'test', 'name': 'on_select'}
- hoja.events['OnSelect'] = macro
-
- return
-
hoja.events['OnSelect'] = {}
-
O
-hoja.events.remove('OnFocus')
-
doc = app.active
-hoja = doc[0]
-app.debug(hoja.name)
-
doc = app.active
-hoja = doc['datos']
-app.debug(hoja.name)
-
Verificar por nombre si una hoja existe.
-doc = app.active
-existe = 'Hoja2' in doc
-app.debug(existe)
-
Contar la cantidad de hojas en el documento.
-doc = app.active
-contar = len(doc)
-app.debug(contar)
-
Recorrer todas las hojas.
- doc = app.active
- for hoja in doc:
- app.debug(hoja)
-
Quitar contraseña.
-hoja = app.active.active
-
-hoja.password = 'siscaloburropanzon'
-app.msgbox(hoja.is_protected)
-
-hoja.unprotect('siscaloburropanzon')
-app.msgbox(hoja.is_protected)
-
Pasar el foco a la hoja.
-doc = app.active
-hoja = doc[-1]
-hoja.activate()
-
Mover a la última posición.
-doc = app.active
-hoja = doc[0]
-hoja.move()
-
Mover a una posición especifica.
-doc = app.active
-hoja = doc[0]
-hoja.move(3)
-
Remover hoja.
-sheet = app.active.active
-sheet.remove()
-
Siempre debe existir al menos una hoja.
-Siempre valida que no exista el nuevo nombre.
-doc = app.active
-hoja = doc[0]
-
-nuevo_nombre = f'{hoja.name}_2'
-if not nuevo_nombre in doc:
- hoja.copy(nuevo_nombre)
-
Si no se establece el nuevo nombre, se generá de forma automática: nombre + índice
.
hoja.copy()
-
Copiar la hoja a otro documento. Se usa el mismo nombre.
-doc = app.active
-hoja = doc.active
-
-documento_nuevo = app.docs.new()
-hoja.copy_to(documento_nuevo)
-
Usar un nuevo nombre.
-hoja.copy_to(documento_nuevo, 'Nuevo nombre')
-
Devuelve al documento Calc donde esta la hoja.
-doc = app.active
-hoja = doc.active
-
-doc = hoja.doc
-app.debug(doc.title)
-
Nombre visible y editable por el usuario.
-doc = app.active
-hoja = doc.active
-
-app.msgbox(hoja.name)
-hoja.name = 'Nuevo Nombre'
-app.msgbox(hoja.name)
-
Nombre editable y accesible solo por código.
-doc = app.active
-hoja = doc.active
-
-app.msgbox(hoja.code_name)
-hoja.code_name = 'datos'
-app.msgbox(hoja.code_name)
-
Muestra u oculta la hoja
-hoja = app.active.active
-
-app.msgbox(hoja.visible)
-hoja.visible = not hoja.visible
-app.msgbox(hoja.visible)
-hoja.visible = not hoja.visible
-
Solo funcionará con dos o más hojas, por que debe haber al menos una visible.
-Color de la pestaña.
-hoja = app.active.active
-app.msgbox(hoja.color)
-
-hoja.color = 'red'
-app.msgbox(hoja.color)
-
-# RGB
-hoja.color = (125, 200, 10)
-app.msgbox(hoja.color)
-
Referencia al área de usuario actual.
-hoja = app.active.active
-
-rango = hoja.used_area
-app.debug(rango)
-
Devuelve verdadero (True) si la hoja esta protegida
-hoja = app.active.active
-
-esta_protegida = hoja.is_protected
-app.debug(esta_protegida)
-
Establecer una contraseña.
-hoja = app.active.active
-hoja.password = 'siscaloburropanzon'
-app.debug(hoja.is_protected)
-
Crear un cuadro de diálogo desde un archivo xdl
previamente creado desde el editor de cuadros de diálogo dentro de LibreOffice y exportado a un archivo.
def crear_cuadro_de_dialogo():
- path = '/home/mau/Desktop/Dialog1.xdl'
- propiedades = {'Path': path}
-
- dialog = app.dialog.create(propiedades)
- dialog.open()
- return
-
Si el cuadro de diálogo esta en la librería Standard
.
def crear_cuadro_de_dialogo():
- propiedades = {
- 'Location': 'user',
- 'Name': 'Dialog1',
- }
- dialog = app.dialog.create(propiedades)
- dialog.open()
- return
-
Si el cuadro de diálogo esta en otra librería.
-def crear_cuadro_de_dialogo():
- propiedades = {
- 'Location': 'user',
- 'Library': 'MiAplicacion',
- 'Name': 'Dialog2',
- }
- dialog = app.dialog.create(propiedades)
- dialog.open()
- return
-
Si el cuadro de diálogo esta en el documento activo en la librería Standard
.
def crear_cuadro_de_dialogo():
- propiedades = {
- 'Location': 'document',
- 'Name': 'miApp',
- }
- dialog = app.dialog.create(propiedades)
- dialog.open()
- return
-
Crear un cuadro de diálogo vacío.
-def crear_cuadro_de_dialogo():
- dialog = app.dialog.create()
- dialog.open()
- return
-
Documento activo.
-doc = app.active
-app.msgbox(doc.title)
-
Iterar en todos los documentos abiertos.
-for doc in app.docs:
- app.debug(doc.type, doc.title)
-
Contar los documentos abiertos.
-cuantos = len(app.docs)
-app.debug(cuantos)
-
Verificar si un documento esta en la colección.
-resultado = 'mi_archivo.ods' in app.docs
-app.debug(resultado)
-
Devolver por índice.
-doc = app.docs[1]
-app.debug(doc.type, doc.title)
-
Devolver por nombre.
-nombre = 'mi_archivo.ods'
-if nombre in app.docs:
- doc = app.docs[nombre]
- app.debug(doc.type, doc.title)
-
Crear nuevo documento, la aplicación predeterminada es Calc.
-doc = app.docs.new()
-app.debug(doc.type)
-
Para un nuevo documento writer
.
doc = app.docs.new('writer')
-app.debug(doc.type)
-
Otros documentos.
-doc = app.docs.new('draw')
-app.debug(doc.type)
-
-doc = app.docs.new('impress')
-app.debug(doc.type)
-
-doc = app.docs.new('math')
-app.debug(doc.type)
-
Crear con argumentos.
-propiedades = {'Hidden': True}
-doc = app.docs.new('writer', propiedades)
-mensaje = f'{doc.type} - {doc.title}'
-app.msgbox(mensaje)
-doc.visible = True
-
No es necesario que el documento este visible para manipularse.
-Abrir archivos.
-ruta = '/home/mau/Mi_archivo.ods'
-doc = app.docs.open(ruta)
-
No es necesario pasar las rutas en formato URL.
-Puede abrir cualquier archivo que sea soportado por LibreOffice.
-ruta = '/home/mau/ejemplo.xlsx'
-doc = app.docs.open(ruta)
-
Abrir con argumentos.
-ruta = '/home/mau/ejemplo.ods'
-argumentos = {'Password': 'siscaloburropanzon'}
-doc = app.docs.open(ruta, argumentos)
-
Guardar un nuevo documento.
-path = '/home/mau/nuevo_documento.ods'
-doc = app.docs.new()
-doc.save(path)
-
Cualquier archivo, previamente guardado, que sea modificado puede ser guardado con:
-doc.save()
-
Abrir un archivo existente y guardarlo con otro nombre.
-ruta = '/home/mau/ejemplo.ods'
-doc = app.docs.open(ruta)
-nueva_ruta = '/home/mau/otro_nombre.ods'
-doc.save(nueva_ruta)
-
Cerrar un archivo.
-doc = app.docs.new()
-app.msgbox(doc.title)
-doc.close()
-
Exportar a PDF.
-doc = app.active
-ruta = '/home/mau/ejemplo.pdf'
-doc.to_pdf(ruta)
-
Si no se establece una ruta, se devuelve el PDF en memoria.
-doc = app.active
-pdf = doc.to_pdf()
-app.debug(pdf)
-
Mire las opciones del filtro de exportación a PDF, puede pasarlas como un diccionario como segundo argumento de este método.
-Exportar a otros formatos.
-doc = app.docs.new()
-ruta = '/home/mau/miarchivo.xlsx'
-filtro = 'xlsx'
-doc.export(ruta, filtro)
-
-ruta = '/home/mau/miarchivo.xls'
-filtro = 'xls'
-doc.export(ruta, filtro)
-
-doc = app.docs.new('writer')
-ruta = '/home/mau/miarchivo.docx'
-filtro = 'docx'
-doc.export(ruta, filtro)
-
-ruta = '/home/mau/miarchivo.doc'
-filtro = 'doc'
-doc.export(ruta, filtro)
-
-ruta = '/home/mau/miarchivo.rtf'
-filtro = 'rtf'
-doc.export(ruta, filtro)
-
Exportar en memoria.
-doc = app.docs.new()
-filtro = 'xlsx'
-excel_doc = doc.export(filter_name=filtro)
-
Enviar el foco al documento.
-for doc in app.docs:
- app.debug(doc.title)
- doc.set_focus()
- app.sleep(1)
-
Copiar la selección activa al portapapeles.
-doc = app.active
-doc.copy()
-
Copiar el contenido del portapapeles, en la selección actual.
-doc = app.active
-doc.paste()
-
Mostrar el cuadro de diálogo Pegado Especial
.
Solo se mostrará si existe contenido en el portapapeles.
-doc = app.active
-doc.paste_special()
-
Pegar solo los valores.
-doc = app.active
-doc.paste_values()
-
Si el destino no esta vacío, el usuario verá el cuadro de mensaje de confirmación.
-La mayoría de las acciones realizadas por código, quedan en el historial de acciones, por lo que el usuario puede deshacerlas. Para eviar esto se puede limpiar este historial.
-doc = app.active
-doc.clear_undo()
-
Solo lectura. Devolver el objeto original pyUNO.
-doc = app.active
-app.debug(type(doc))
-app.debug(type(doc.obj))
-
18/08/2022 21:59:05 - DEBUG - <class 'easymacro.easycalc.LOCalc'>
-18/08/2022 21:59:05 - DEBUG - <class 'pyuno'>
-
Título del documento.
-doc = app.active
-app.debug(doc.title)
-doc.title = 'Nuevo Titulo'
-app.debug(doc.title)
-
Solo lectura. Devolver el tipo de documento: calc, writer, etc.
-doc = app.active
-app.debug(doc.type)
-
Solo lectura. Devolver el valor interno RuntimeUID del documento.
-doc = app.active
-app.debug(doc.uid)
-
Solo lectura. Si el documento ya ha sido guardado en disco.
-doc = app.active
-app.debug(doc.is_saved)
-
Solo lectura. Si el documento ha sido modificado.
-doc = app.active
-app.debug(doc.is_modified)
-
Solo lectura. Si el documento es de solo lectura.
-doc = app.active
-app.debug(doc.is_read_only)
-
Solo lectura. Devolver la ruta en disco del documento.
-doc = app.active
-app.debug(doc.path)
-
Solo lectura. Devolver solo el directorio de la ruta en disco del documento.
-doc = app.active
-app.debug(doc.dir)
-
Solo lectura. Devolver el nombre con extensión de la ruta del documento.
-doc = app.active
-app.debug(doc.file_name)
-
Solo lectura. Devolver el nombre sin extensión de la ruta del documento.
-doc = app.active
-app.debug(doc.name)
-
Ocultar o mostrar un documento.
-doc = app.active
-doc.visible = False
-app.msgbox(doc.visible)
-doc.visible = True
-
No es necesario que el documento este visible para manipularse.
-Devolver o establecer el porcentaje de zoom del documento.
-doc = app.active
-zoom = doc.zoom
-app.msgbox(zoom)
-doc.zoom = zoom * 2
-app.msgbox(doc.zoom)
-doc.zoom = zoom
-
Controlar la barra de estado, es importante siempre actualizar en otro hilo.
-@app.run_in_thread
-def controlar_barra_estado(sb, texto, limite):
- sb.start(texto, limite)
- for i in range(limite):
- sb.setValue(i)
- app.sleep(1)
- sb.end()
- return
-
-def main():
- doc = app.active
- controlar_barra_estado(doc.status_bar, 'Línea: ', 10)
- return
-
Es importante siempre devolver el control de la barra de estado a la aplicación con el método end
.
Devolver la selección actual.
-doc = app.active
-selection = doc.selection
-app.debug(selection)
-
Cuidado, la selección actual pueden ser muchas cosas diferentes.
-easymacro es una librería para desarrollar más fácilmente macros en LibreOffice con Python. Es una capa de abstracción entre la extensa y compleja API UNO de LibreOffice y tu código.
-Probablemente, será más feliz si la usa :)
-Puede utilizar easymacro con cualquier extensión o directamente en sus macros.
-Aportaciones en Junas (G1)
-A5DdXxCKPw3QKWVdDVs7CzkNugNUW1sHu5zDJFWxCU2h
-
-Este proyecto esta en continuo desarrollo.
-Clone el repositorio en su directorio de proyectos favorito.
-git clone https://git.cuates.net/elmau/easymacro
-
Muévase al directorio
-cd easymacro/source
-
copie la carpeta easymacro
a la carpeta pythonpath en la carpeta de macros Python dentro de su perfil de usuario. Reemplace USUARIO por su usuario real.
/home/`USUARIO`/.config/libreoffice/4/user/Scripts/python/pythonpath
-
o use un vínculo simbólico. Reemplace RUTA_ABSOLUTA por la ruta absoluta donde se localice easymacro en su sistema de archivos y USUARIO por su nombre de usuario.
-ln -s `RUTA_ABSOLUTA`/easymacro/source/easymacro /home/`USUARIO`/.config/libreoffice/4/user/Scripts/python/pythonpath/
-
En su archivo de macros favorito, por ejemplo mismacros.py. Use su editor de texto plano o IDE favorito.
-vim /home/`USUARIO`/.config/libreoffice/4/user/Scripts/python/mismacros.py
-
Copie el siguiente código:
-import easymacro as app
-
-def main():
- app.msgbox(app.INFO_DEBUG)
- return
-
Ejecute la macro main desde LibreOffice, si ve un cuadro de mensaje con información similar a la siguiente, !felicidades¡
- -Esta todo listo para empezar a desarrollar macros con easymacro.
-!Feliz programación!
- - - - - - - - -La fecha inicial en Calc y en Python es diferente.
-Obtener la fecha de hoy.
-d = app.dates
-app.msgbox(d.today)
-
Obtener la fecha y hora actuales.
-d = app.dates
-app.msgbox(d.now)
-
Obtener la hora actual.
-d = app.dates
-app.msgbox(d.now.time())
-
Obtener el tiempo Unix
-d = app.dates
-app.msgbox(d.epoch)
-
Devolver una fecha
-d = app.dates
-
-date = d.date(1974, 1, 15)
-app.msgbox(date)
-
Devolver un tiempo
-d = app.dates
-
-time = d.time(10, 20, 15)
-app.msgbox(time)
-
Devolver fecha y hora
-d = app.dates
-
-dt = d.datetime(1974, 1, 15, 10, 11, 12)
-app.msgbox(dt)
-
Convertir una cadena en fecha. Mira este excelente recurso
-d = app.dates
-
-cadena = '1974-01-15'
-plantilla = '%Y-%m-%d'
-fecha = d.str_to_date(cadena, plantilla)
-app.msgbox(fecha)
-app.msgbox(type(fecha))
-
Para obtener un valor válido para establecer en una celda de Calc.
-d = app.dates
-
-cadena = '1974-01-15'
-plantilla = '%Y-%m-%d'
-fecha = d.str_to_date(cadena, plantilla, True)
-app.msgbox(fecha)
-app.msgbox(type(fecha))
-
Convierte el valor de una celda en una fecha Python, por ejemplo, la fecha inicial configurada en Calc.
-d = app.dates
-
-value_from_cell = 1
-fecha = d.calc_to_date(value_from_cell)
-app.msgbox(fecha)
-app.msgbox(type(fecha))
-
Medir tiempo en segundos.
-d = app.dates
-
-d.start()
-app.sleep(5)
-seconds = d.end()
-app.msgbox(seconds)
-
Regresar timedelta en vez de segundos.
-d = app.dates
-
-d.start()
-app.sleep(5)
-td = d.end(False)
-app.msgbox(td)
-
Siempre guarda las contraseñas de la forma más segura posible.
-Enviar un correo electrónico.
-from conf import PASSWORD
-
-SERVER = dict(
- server = 'mail.correo.net' ,
- port = 405,
- ssl = True,
- user = 'no-responder@pruebas.mx',
- password = PASSWORD,
-)
-
-body = "Hola Ingrid\n\n¿Como estas?\n\nSaludos cordiales"
-
-message = dict(
- to = 'ingrid@bergman.mx',
- subject = 'Te amo...',
- body = body,
-)
-
-app.email.send(SERVER, message)
-
Puede usar los campos cc
(Con Copia) y bcc
(Con Copia Oculta), así como separar por comas las direcciones destino para enviar a más de un correo.
to = 'mail1@correo.com,mail2@correo.com,mail3@correo.com'
-cc = 'otro@correo.com'
-bcc = 'oculto@correo.com'
-
Podemos enviar más de un mensaje.
-mensaje1 = dict(
- to = 'ingrid@correo.net',
- subject = 'Te amo...',
- body = "Hola Ingrid\n\n¿Como estas?\n\nSaludos cordiales",
-)
-mensaje2 = dict(
- to = 'sophia@correo.net',
- subject = 'A ti también...',
- body = "Hola Sophia\n\n¿Como estas?\n\nSaludos cordiales",
-)
-mensajes = (mensaje1, mensaje2)
-
-app.email.send(SERVER, mensajes)
-
16/08/2022 13:01:49 - DEBUG - Connect to: mail.server.net
-16/08/2022 13:01:50 - DEBUG - Email sent...
-16/08/2022 13:01:51 - DEBUG - Email sent...
-16/08/2022 13:01:51 - DEBUG - Close connection...
-
Enviar un archivo adjunto.
-archivo = '/home/mau/temp.txt'
-mensaje = dict(
- to = 'ingrid@bergman.mx',
- subject = 'Te amo...',
- body = "Hola Ingrid\n\n¿Como estas?\n\nSaludos cordiales",
- files = archivo,
-)
-
-app.email.send(SERVER, mensaje)
-
O varios.
-archivos = (
- '/home/mau/temp.txt',
- '/home/mau/datos.csv',
-)
-
Si tu cliente de correo usa el formato mbox
, puede guardar los correos enviados en una carpeta dentro de la configuración de su cliente de correo.
ruta = '/home/mau/.thunderbird/7iznrbyw.default/Mail/Local Folders/LibreOffice'
-mensaje = dict(
- to = 'ingrid@bergman.mx',
- subject = 'Te amo...',
- body = "Hola Ingrid\n\n¿Como estas?\n\nSaludos cordiales",
- path = ruta,
-)
-
-app.email.send(SERVER, mensaje)
-
Todos los correos se envían siempre en otro hilo de ejecución.
-Recuerda, es necesario importar la librería.
-import easymacro as app
-
Obtener el sistema operativo.
-app.msgbox(app.OS)
-
Obtener el tipo de escritorio, solo en GNU/Linux.
-app.msgbox(app.DESKTOP)
-
Obtener el nombre de la computadora.
-app.msgbox(app.PC)
-
Obtener el nombre de usuario.
-app.msgbox(app.USER)
-
Saber si estamos en Windows.
-app.msgbox(app.IS_WIN)
-
Saber si estamos en OSX.
-app.msgbox(app.IS_MAC)
-
Nombre de la aplicación.
-app.msgbox(app.NAME)
-
Versión de la aplicación.
-app.msgbox(app.VERSION)
-
Lenguaje de la aplicación.
-app.msgbox(app.LANG)
-
Lenguaje con variante.
-app.msgbox(app.LANGUAGE)
-
Ejecutar cualquier macro, de forma predeterminada se llaman a las macros en Python localizadas en el perfil de usuario.
-import easymacro as app
-
-
-def mostrar_info():
- app.msgbox(app.INFO_DEBUG)
- return
-
-
-def main(args=None):
- macro = {
- 'library': 'test',
- 'name': 'mostrar_info',
- }
- app.macro.call(macro)
- return
-
Ejecutar una macro compartida en LibreOffice Macros.
-macro = {
- 'library': 'HelloWorld',
- 'name': 'HelloWorldPython',
- 'location': 'share',
-}
-app.macro.call(macro)
-
Ejecutar una macro Basic.
-Sub mostrar_info()
- MsgBox "Mejor usa Python :)"
-End Sub
-
macro = {
- 'language': 'Basic',
- 'library': 'Standard',
- 'module': 'Module1',
- 'name': 'mostrar_info',
-}
-app.macro.call(macro)
-
Cualquier macro se puede ejecutar en otro hilo.
-app.macro.call(macro, True)
-
Más información en: Scripting Framework URI Specification
- - - - - - - - -Mostrar mensaje estandar.
-mensaje = 'Maldito Mundo'
-titulo = 'Mi Macro'
-app.msgbox(mensaje, titulo)
-
Mostrar mensaje con icono de advertencia.
-mensaje = 'Cuidado, esta acción es peligrosa'
-titulo = 'Mi Macro'
-app.warning(mensaje, titulo)
-
Mostrar mensaje con icono de error.
-mensaje = 'ERROR: contacte a soporte'
-titulo = 'Mi Macro'
-app.errorbox(mensaje, titulo)
-
Hacer una pregunta mostrando el icono de interrogación y mostrando los botones de comando Si
y No
. La respuesta siempre es verdadera (True
) si el usuario selecciona si
y falsa (False
) en caso contrario.
mensaje = '¿Es fácil Python?'
-titulo = 'Mi Macro'
-resultado = app.question(mensaje, titulo)
-app.msgbox(resultado)
-
Muestra un mensaje al usuario, permitiendo capturar una respuesta.
-mensaje = 'Escribe tu nombre'
-nombre = app.inputbox(mensaje)
-app.msgbox(nombre)
-
Para ocultar solo en pantalla lo que captura el usuario, como contraseñas.
-mensaje = 'Captura la contraseña'
-echochar = '*'
-contraseña = app.inputbox(mensaje, echochar=echochar)
-app.msgbox(contraseña)
-
Obtener información de una ruta.
-ruta_archivo = '/home/mau/mi_archivo.ods'
-p = app.paths(ruta_archivo)
-
-app.debug(p.path)
-app.debug(p.file_name)
-app.debug(p.name)
-app.debug(p.ext)
-app.debug(p.size)
-app.debug(p.url)
-
15/08/2022 14:40:08 - DEBUG - /home/mau
-15/08/2022 14:40:08 - DEBUG - mi_archivo.ods
-15/08/2022 14:40:08 - DEBUG - mi_archivo
-15/08/2022 14:40:08 - DEBUG - ods
-15/08/2022 14:40:08 - DEBUG - 7011
-15/08/2022 14:40:08 - DEBUG - file:///home/mau/mi_archivo.ods
-
Obtener la misma información como un tupla.
-ruta_archivo = '/home/mau/mi_archivo.ods'
-p = app.paths(ruta_archivo)
-app.debug(p.info)
-
15/08/2022 14:43:01 - DEBUG - ('/home/mau', 'mi_archivo.ods', 'mi_archivo', 'ods', 7011, 'file:///home/mau/mi_archivo.ods')
-
O como diccionario.
-ruta_archivo = '/home/mau/mi_archivo.ods'
-p = app.paths(ruta_archivo)
-app.debug(p.dict)
-
15/08/2022 14:43:01 - DEBUG - {'path': '/home/mau', 'file_name': 'mi_archivo.ods', 'name': 'mi_archivo', 'ext': 'ods', 'size': 7011, 'url': 'file:///home/mau/mi_archivo.ods'}
-
Obtener la carpeta de inicio del usuario.
-p = app.paths
-app.debug(p.home)
-
Obtener la carpeta Documentos del usuario.
-p = app.paths
-app.debug(p.documents)
-
Obtener la ruta del perfil de usuario.
-p = app.paths
-app.debug(p.user_profile)
-
Obtener la ruta de la carpeta config
en el perfil de usuario.
p = app.paths
-app.debug(p.user_config)
-
Obtener la ruta del ejecutable python
p = app.paths
-app.debug(p.python)
-
Pasar una ruta en formato URL al formato del sistema de archivos del SO.
-p = app.paths
-ruta_url = 'file:///home/mau/mi_archivo.ods'
-ruta = p.to_system(ruta_url)
-app.debug(ruta)
-
Pasar una ruta del sistema de archivos del SO al formato URL.
-p = app.paths
-ruta = '/home/mau/mi_archivo.ods'
-ruta_url = p.to_url(ruta)
-app.debug(ruta_url)
-
Obtener rutas de la configuración de LibreOffice. Por default obtiene la ruta de Documentos
, para otras ruta mire Api XPathSettings
p = app.paths
-ruta = p.config()
-app.debug(ruta)
-
-ruta = p.config('UserConfig')
-app.debug(ruta)
-
Algunas rutas pueden ser más de una, separados por ;
, en este caso, el resultado es una lista con las rutas.
Concatenar rutas.
-p = app.paths
-ruta = p.join('/home/mau', 'pruebas', 'archivo.ods')
-app.debug(ruta)
-
Verificar si una ruta existe.
-p = app.paths
-resultado = p.exists('/home/mau/test/archivo.ods')
-app.debug(resultado)
-
Verificar si una aplicación existe.
-p = app.paths
-
-resultado = p.exists_app('noexiste')
-app.debug(resultado)
-
-resultado = p.exists_app('soffice')
-app.debug(resultado)
-
Verificar si la ruta es un directorio.
-p = app.paths
-resultado = p.is_dir('/home/mau')
-app.debug(resultado)
-
Verificar si la ruta es un archivo.
-p = app.paths
-resultado = p.is_file('/home/mau/mi_archivo.ods')
-app.debug(resultado)
-
Crear un archivo temporal, es borrado automáticamente al cerrarse.
-p = app.paths
-
-f = p.temp_file()
-f.write(app.INFO_DEBUG)
-f.close()
-
Usado en contexto
, se cierra automáticamente.
with p.temp_file() as f:
- app.debug(f.name)
- f.write('test')
-
Crear un directorio temporal, al salir del contexto, es eliminado junto con todo su contenido del sistema de archivos.
-p = app.paths
-
-with p.temp_dir() as d:
- app.debug(p.exists(d))
- app.debug(d)
-
-app.debug(p.exists(d))
-
Permitir al usuario seleccionar archivos, devuelve solo la ruta. De forma predeterminada abre en la carpeta Documentos
.
p = app.paths
-ruta = p.get()
-app.debug(ruta)
-
Establecer que abra en otro directorio.
-ruta = p.get('/tmp')
-app.debug(ruta)
-
Agregar un filtro.
-ruta = p.get(filters='ods')
-app.debug(ruta)
-
Agregar multiples filtros.
-ruta = p.get(filters='xml,txt')
-app.debug(ruta)
-
Permitir selecciones multiples.
-ruta = p.get(filters='xml,txt', multiple=True)
-app.debug(ruta)
-
Permitir al usuario seleccionar un directorio, devuelve solo la ruta. De forma predeterminada abre en la carpeta Documentos
.
p = app.paths
-ruta = p.get_dir()
-app.debug(ruta)
-
Establecer que abra en otro directorio.
-ruta = p.get_dir('/tmp')
-app.debug(ruta)
-
Permitir seleccionar un directorio y capturar el nombre del archivo, devuelve la ruta completa.
-p = app.paths
-ruta = p.get_for_save()
-app.debug(ruta)
-
Establecer que inicie en otro directorio.
-ruta = p.get_for_save('/tmp')
-app.debug(ruta)
-
Si se establece un filtro, automáticamente se agrega la extensión.
-ruta = p.get_for_save(filters='txt')
-app.debug(ruta)
-
Obtener archivos de una ruta, no recursivamente. De forma predeterminada regresa todos, incluyendo archivos ocultos.
-ruta = '/home/mau'
-
-p = app.paths
-archivos = p.files(ruta)
-for a in archivos:
- app.debug(a)
-
Filtrar por tipo de archivo.
-p = app.paths
-archivos = p.files(ruta, '*.pdf')
-
Obtener archivos de forma recursiva.
-p = app.paths
-archivos = p.files(ruta, '**/*.xml')
-
Obtener archivos de forma recursiva.
-p = app.paths
-ruta = '/home/mau/Documents'
-archivos = p.walk(ruta)
-for a in archivos:
- app.debug(a)
-
Con filtro.
-archivos = p.walk(ruta, 'ods')
-
Con filtros.
-archivos = p.walk(ruta, 'ods|odt')
-
Obtener los directorios de una ruta, no recursivamente.
-p = app.paths
-ruta = '/home/mau/Documents'
-folders = p.dirs(ruta)
-for f in folders:
- app.debug(f)
-
Obtener los directorios de una ruta, no recursivamente.
-p = app.paths
-ruta = '/home/mau/Documents'
-folders = p.walk_dirs(ruta)
-for f in folders:
- app.debug(f)
-
Obtener información en una lista de tuplas: (ID_FOLDER, ID_PADRE, NOMBRE)
-folders = p.walk_dirs(ruta, True)
-
Obtener la ruta de instalación de una extensión a partir de su ID.
-p = app.paths
-id_ext = 'net.elmau.zaz.talk'
-ruta = p.extension(id_ext)
-app.debug(ruta)
-
Reemplazar extensión de un archivo.
-p = app.paths
-ruta = '/home/mau/mi_archivo.ods'
-ruta_nueva = p.replace_ext(ruta, 'pdf')
-app.debug(ruta_nueva)
-
Abrir cualquier archivo con el programas predeterminado del SO.
-p = app.paths
-ruta = '/home/mau/archivo.pdf'
-p.open(ruta)
-
-ruta = '/home/mau/index.html'
-p.open(ruta)
-
Guardar y leer datos, el encoding predeterminado es UTF8.
-p = app.paths
-datos = """¿Quieres saber quién eres? No preguntes. Actúa.
-La acción te delineará y definirá.
-
-Thomas Jefferson
-"""
-
-ruta = '/home/mau/temp.txt'
-p.save(ruta, datos)
-
-datos = p.read(ruta)
-app.msgbox(datos)
-
Cambiar el encoding.
-app.paths.save(ruta, datos, 'iso-8859-1')
-
Guardar y leer datos binarios.
-p = app.paths
-datos = b'Datos binarios'
-
-ruta = '/home/mau/temp.bin'
-p.save_bin(ruta, datos)
-
-datos = p.read_bin(ruta)
-app.msgbox(datos)
-
Guardar y leer en formato json.
-p = app.paths
-
-ruta = '/home/mau/datos.json'
-datos = {
- 'tipo': 'calc',
- 'nombre': 'miarchivo.ods',
-}
-p.save_json(ruta, datos)
-
-datos = p.read_json(ruta)
-app.msgbox(datos)
-
Exportar e importar datos en formato CSV. Vea la documentación CSV para los argumentos que puede usar.
-p = app.paths
-
-ruta = '/home/mau/datos.csv'
-ahora = app.dates.now
-datos = (
- (1, 'uno', ahora),
- (2, 'dos', ahora),
- (3, 'tres', ahora),
-)
-p.save_csv(ruta, datos)
-
-datos = p.read_csv(ruta)
-app.msgbox(datos)
-
Borra archivos o directorios con todo su contenido. Devuelve verdadero (True) en caso de exito y falso (Falso) en cualquier otro caso.
- -Este proceso es destructivo, es buena practica siempre solicitar confirmación al usuario.
-p = app.paths
-
-ruta = '/home/mau/temp.bin'
-resultado = p.kill(ruta)
-app.msgbox(resultado)
-
Copiar archivos. Devuelve la ruta completa final destino.
-De un origen a una carpeta destino
-p = app.paths
-
-ruta_origen = '/home/mau/temp.txt'
-ruta_destino = '/home/mau/Desktop'
-ruta = p.copy(ruta_origen, ruta_destino)
-app.debug(ruta)
-
Cambiar el nombre destino.
-ruta_origen = '/home/mau/temp.txt'
-ruta_destino = '/home/mau/Desktop'
-nuevo_nombre = 'datos.csv'
-ruta = p.copy(ruta_origen, ruta_destino, nuevo_nombre)
-app.debug(ruta)
-
Las macros se ejecutan en un hilo que bloquea cualquier otro proceso dentro de la aplicación.
-Si ejecutas la siguiente macro main
, nota que no puedes hacer algo más dentro de LibreOffice durante los 5 segundos que dura el proceso.
import easymacro as app
-
-
-def hacer_pausa(segundos):
- app.sleep(segundos)
- app.debug('He terminado')
- return
-
-def main():
- hacer_pausa(5)
- app.msgbox('Fin...')
- return
-
Hasta que aparece el cuadro de mensaje con la palabra Fin
y lo cierras, el usuario puede seguir usando la aplicación.
Ahora ejecutamos la macro en otro hilo, “decorando” cualquier macro con run_in_thread
@app.run_in_thread
-def hacer_pausa(segundos):
- app.sleep(segundos)
- app.debug('He terminado')
- return
-
-def main():
- hacer_pausa(5)
- app.msgbox('Fin...')
- return
-
Nota que ahora el mensaje aparece inmediatamente y no tras los 5 segundos.
- -Ponga mucha atención en no ejecutar macros en otros hilo que dependen de algo suceptible de ser cambiado o interceptado por el usuario, por ejemplo, la celda activa.
-El timer
siempre se ejecuta en otro hilo.
Ejecutar macro una sola vez en X segundos.
-import easymacro as app
-
-
-NOMBRE = 'reloj'
-
-
-def mostrar_hora():
- app.debug(app.dates.now_time)
- return
-
-
-def iniciar_conteo():
- segundos = 5
- macro = {
- 'library': 'test',
- 'name': 'mostrar_hora',
- }
- app.timer.once(NOMBRE, segundos, macro)
- return
-
-
-def main(args=None):
- iniciar_conteo()
- return
-
Cancelar ejecución, antes del tiempo establecido.
-def main(args=None):
- iniciar_conteo()
- app.sleep(3)
- detener_conteo()
- return
-
-def detener_conteo():
- app.timer.cancel(NOMBRE)
- return
-
16/08/2022 21:18:50 - INFO - Event: "reloj", started... execute in 60 seconds
-16/08/2022 21:18:55 - INFO - Cancel event: "reloj", ok...
-
Ejecutar macro cada X segundos.
-NOMBRE = 'reloj'
-
-
-def mostrar_hora():
- app.debug(app.dates.now_time)
- return
-
-
-def iniciar_reloj():
- segundos = 1
- macro = {
- 'library': 'test',
- 'name': 'mostrar_hora',
- }
- app.timer.start(NOMBRE, segundos, macro)
- return
-
-def main(args=None):
- iniciar_reloj()
- return
-
Detener timer.
-def detener_reloj():
- app.timer.stop(NOMBRE)
- return
-
16/08/2022 21:25:37 - INFO - Timer 'reloj' started, execute macro: 'mostrar_hora'
-16/08/2022 21:25:38 - DEBUG - 21:25:38
-16/08/2022 21:25:39 - DEBUG - 21:25:39
-...
-16/08/2022 21:25:47 - DEBUG - 21:25:47
-16/08/2022 21:25:48 - DEBUG - 21:25:48
-16/08/2022 21:25:48 - INFO - Timer stopped...
-
-Asegurese siempre de establecer un nombre único para cada timer.
-Asegurese siempre de ejecutar macros que NO bloqueen la interfaz del usuario.
-Método get
.
def prueba_get():
-
- url = 'https://api.ipify.org'
- respuesta = app.url.get(url)
- if respuesta.status_code == 200:
- mi_ip = respuesta.body.decode()
- app.debug(f'IP: {mi_ip}')
- else:
- app.debug(respuesta.status_code)
-
- return
-
16/08/2022 22:14:13 - DEBUG - IP: 199.203.174.159
-
Respuestas en formato json.
-def prueba_get():
-
- url = 'https://api.ipify.org/?format=json'
- respuesta = app.url.get(url)
- if respuesta.status_code == 200:
- datos = respuesta.json()
- app.debug(f'IP: {datos["ip"]}')
- else:
- app.debug(respuesta.status_code)
-
- return
-
Convertir diccionarios en PropertyValue
-datos = {
- 'Hidden': True,
- 'Password': 'letmein',
-}
-propiedades = app.dict_to_property(datos)
-
-app.msgbox(propiedades)
-
Convertir PropertyValue
en diccionarios
datos = app.data_to_dict(propiedades)
-app.msgbox(datos)
-
Convertir tuplas
a diccionario.
tupla_de_tuplas = (
- ('Hidden', True),
- ('Password', 'letmein'),
-)
-datos = app.data_to_dict(tupla_de_tuplas)
-app.msgbox(datos)
-
Convertir listas
a diccionario.
lista_de_listas = [
- ['Hidden', True],
- ['Password', 'letmein'],
-]
-datos = app.data_to_dict(lista_de_listas)
-app.msgbox(datos)
-
Hacer una pausa de X segundos.
-app.sleep(5)
-
Reemplazar variables en cadenas de texto.
-plantilla = """Hola $nombre
-
-Te envío este archivo: $archivo
-
-Saludos cordiales
-"""
-
-datos = {
- 'nombre': 'Ingrid Bergman',
- 'archivo': 'carta_de_amor.odt'
-}
-
-resultado = app.render(plantilla, datos)
-
-app.msgbox(resultado)
-
Ejecutar un programa.
-nombre_aplicacion = 'gnome-calculator'
-app.shell.run(nombre_aplicacion)
-
Ejecutar comandos shell y capturar la salida.
-comandos = 'ls -lh ~'
-resultado = app.shell.run(comandos, True)
-app.debug(resultado)
-
drwxr-xr-x 4 mau mau 4.0K Aug 15 23:36 Desktop
-drwxr-xr-x 6 mau mau 4.0K Jun 9 23:32 Documents
-drwxr-xr-x 5 mau mau 4.0K Aug 16 13:09 Downloads
-drwxr-xr-x 3 mau mau 4.0K Aug 14 15:19 Pictures
-drwxr-xr-x 10 mau mau 4.0K Jun 19 19:36 Projects
-drwxr-xr-x 2 mau mau 4.0K May 11 22:36 Templates
-drwxr-xr-x 2 mau mau 4.0K Jul 19 13:37 Videos
-
Ejectuar comandos y capturar la salida línea a línea.
-comandos = 'ls -lh /home/mau'
-for line in app.shell.popen(comandos):
- app.debug(line)
-
Obtener hash. Por default se regresa en hexadecimal.
- datos = 'LibreOffice con Python'
-
- digest = app.hash.digest('md5', datos)
- app.debug('MD5 = ', digest)
-
- digest = app.hash.digest('sha1', datos)
- app.debug('SHA1 = ', digest)
-
- digest = app.hash.digest('sha256', datos)
- app.debug('SHA256 = ', digest)
-
- digest = app.hash.digest('sha512', datos)
- app.debug('SHA512 = ', digest)
-
16/08/2022 18:48:07 - DEBUG - MD5 = 3801759ead20abc3ce0d0095289bdcfd
-16/08/2022 18:48:07 - DEBUG - SHA1 = 1df74aaae9658c21074aa5a2d4c2055dcf79f0db
-16/08/2022 18:48:07 - DEBUG - SHA256 = 228e90b15b6259307e580677939b1f2f45e9317461e98f603af8fcac0f9a598f
-16/08/2022 18:48:07 - DEBUG - SHA512 = 3ef45f79f3bfd2b251d250489c91b631306456405510397fb1a7ee37005d196376b7d6ca86a9895f4eb97eb74813965c24d6564a383f4bdb1360665c8fbb192a
-
Para obtener bytes.
-digest = app.hash.digest('md5', datos, False)
-app.debug('MD5 = ', digest)
-
16/08/2022 18:48:07 - DEBUG - MD5 = b'8\x01u\x9e\xad \xab\xc3\xce\r\x00\x95(\x9b\xdc\xfd'
-
Puede guardar datos de configuración de su macro o extensión dentro del perfil de usuario.
-nombre = 'mi_extension'
-datos = {
- 'ruta': '/home/mau/pruebas',
- 'guardar': True,
-}
-
-if app.config.set(nombre, datos):
- app.debug('Configuración guardada...')
-
Y recuperarlos en cualquier momento.
-datos = app.config.get(nombre)
-app.debug(datos)
-
Puede ver los colores que puede usar en Wikipedia Colores Web
-color_nombre = 'darkblue'
-color = app.color(color_nombre)
-app.debug(color)
-
-color_rgb = (125, 200, 10)
-color = app.color(color_rgb)
-app.debug(color)
-
-color_html = '#008080'
-color = app.color(color_html)
-app.debug(color)
-
Mostrar información de depuración en un cuadro de mensaje.
-Si tiene cualquier problema en su código durante el desarrollo de sus macros, puede abrir un ticket de soporte en el sistema de ticket de este proyecto. Siempre copie la información de depuración mostrada en este mensaje.
-import easymacro as app
-
-def info():
- app.msgbox(app.INFO_DEBUG)
- return
-
Mostrar información en la terminal.
-import easymacro as app
-
-def test_debug():
- msg = 'Verificar esta información...'
- app.debug(msg)
- return
-
11/08/2022 18:15:45 - DEBUG - Verificar esta información...
-
Mostrar mensajes informativos en la terminal.
-import easymacro as app
-
-def test_info():
- msg = 'Iniciando proceso...'
- app.info(msg)
- return
-
11/08/2022 18:23:53 - INFO - Iniciando proceso...
-
Mostrar mensajes de error en la terminal.
-import easymacro as app
-
-def test_error():
- msg = 'Error 505'
- app.error(msg)
- return
-
11/08/2022 18:27:34 - ERROR - Error 505
-
Guardar registro en un archivo, automáticamente se agrega la fecha y hora.
-import easymacro as app
-
-def test_save_log():
-
- app.save_log('/home/mau/log.txt', 'PyUNO')
- app.save_log('/home/mau/log.txt', 'Maldito Mundo')
-
- return
-
cat ~/log.txt
-2022-08-11 18:30:11 - 'PyUNO'
-2022-08-11 18:30:11 - 'Maldito Mundo'
-
Mostrar cualquier información en un cuadro de mensaje.
-def message():
-
- msg = 'Por favor, consume menos.'
- app.msgbox(msg)
-
- msg = ('uno', 2, 'tres')
- app.msgbox(msg)
-
- msg = {'nombre': 'Teresa'}
- app.msgbox(msg)
-
- app.msgbox(app)
-
- return
-
Capturar cualquier error que se produzca al ejecutar una macro.
-@app.catch_exception
-def test_capturar_error():
- r = 1 / 0
- return
-
11/08/2022 18:44:36 - ERROR - test_capturar_error
-Traceback (most recent call last):
- File "/home/mau/.config/libreoffice/4/user/Scripts/python/pythonpath/easymacro/easytools.py", line 115, in func
- return f(*args, **kwargs)
- File "/home/mau/.config/libreoffice/4/user/Scripts/python/test.py", line 18, in test_capturar_error
- r = 1 / 0
-ZeroDivisionError: division by zero
-
-Usa este método solo en tiempo de desarrollo. No la uses en producción.
-MRI es la mejor extensión para inspeccionar cualquier objeto UNO de LibreOffice. Necesita instalarla primero para poder llamarla.
-def inspeccionar_objeto():
- obj = app.active
- app.mri(obj)
- return
-
Inspeccionar un objeto.
-def inspeccionar_objeto():
- doc = app.active
- data = app.inspect(doc)
- for p in data.properties:
- app.debug(p)
- for m in data.methods:
- app.debug(m)
- return
-
Vaciar en una hoja de calculo.
-def inspeccionar_objeto():
- doc = app.active
- app.inspect(doc, True)
- return
-
easymacro est une bibliothèque permettant de développer facilement des macros LibreOffice avec Python. Il s’agit d’une couche d’abstraction entre l’API étendue et complexe de LibreOffice UNO et votre code.
-Vous serez probablement plus heureux si vous l’utilisez :)
-Vous pouvez utiliser easymacro avec n’importe quelle extension ou directement dans vos macros.
- - - -easymacro it’s a library for easily develop macros en LibreOffice con Python. It is an abstraction layer between the extensive and complex LibreOffice API UNO and your code.
-Probably, you will be more happy if used it. :)
-You can used easymacro with any extension or directly in your macros.
- -This project is in continuous development.
-Clone repository in your favorite folder projects.
-git clone https://git.cuates.net/elmau/easymacro
-
and copy library into pythonpath in your macros.
-/home/USER/.config/libreoffice/4/user/Scripts/python/pythonpath/easymacro.py
-
or used hard link. Replace ABSOLUTE_PATH
for absolute path in your system and USER
for your real name user.
ln ABSOLUTE_PATH/easymacro/source/easymacro.py /home/USER/.config/libreoffice/4/user/Scripts/python/pythonpath/
-
In your favorite macros file, for example mymacros.py
:
vim /home/USER/.config/libreoffice/4/user/Scripts/python/mymacros.py
-
copy this code:
-import easymacro as app
-
-def main():
- app.msgbox(app.INFO_DEBUG)
- return
-
and execute from LibreOffice, if you see similar next info, great!
- -you are ready for develop with easymacro.
-Happy develop!
- - - - - - - - -