[
{
	"uri": "https://doc.cuates.net/easymacro/es/application/shortcuts/",
	"title": "Accesos directos",
	"tags": [],
	"description": "",
	"content": "Globales Iterar en todos los accesos directos. Accesos directos disponibles para todas las aplicaciones.\nfor acceso_directo, comando in app.shortcuts: app.debug(acceso_directo, comando) Devolver una lista de tuplas con toda la información.\ndatos = app.shortcuts.get_all() app.debug(datos) Verificar si un acceso directo esta asignado.\nacceso_directo = \u0026#39;Shift+Ctrl+Alt+T\u0026#39; app.debug(acceso_directo in app.shortcuts) set Establecer un acceso directo a un comando.\nsc = app.shortcuts acceso_directo = \u0026#39;Shift+Ctrl+Alt+T\u0026#39; comando = \u0026#39;MacroDialog\u0026#39; sc.set(acceso_directo, comando) Establecer un acceso directo a una macro.\nsc = app.shortcuts acceso_directo = \u0026#39;Shift+Ctrl+Alt+M\u0026#39; macro = {\u0026#39;library\u0026#39;: \u0026#39;test\u0026#39;, \u0026#39;name\u0026#39;: \u0026#39;pruebas\u0026#39;} sc.set(acceso_directo, macro) get_by_shortcut Devolver el comando asociado a un acceso directo.\nsc = app.shortcuts acceso_directo = \u0026#39;Shift+Ctrl+Alt+M\u0026#39; comando = sc.get_by_shortcut(acceso_directo) app.debug(comando) get_by_command Devolver el acceso directo asociado a un comando. Puede haber más de uno.\nsc = app.shortcuts comando = \u0026#39;MacroDialog\u0026#39; acceso_directo = sc.get_by_command(comando) app.debug(acceso_directo) remove_by_shortcut Eliminar por acceso directo.\nsc = app.shortcuts acceso_directo = \u0026#39;Shift+Ctrl+Alt+T\u0026#39; sc.remove_by_shortcut(acceso_directo) remove_by_command Eliminar por comando.\nsc = app.shortcuts macro = {\u0026#39;library\u0026#39;: \u0026#39;test\u0026#39;, \u0026#39;name\u0026#39;: \u0026#39;pruebas\u0026#39;} sc.remove_by_command(macro) reset Reiniciar todas las modificaciones.\napp.shortcuts.reset() Modificar accesos directos, solo en una aplicación. Por ejemplo Calc.\nsc = app.shortcuts[\u0026#39;calc\u0026#39;] Los métodos son los mismos que los globales.\nPara las demas aplicaciones: writer, draw, impress, math.\n"
},
{
	"uri": "https://doc.cuates.net/easymacro/es/calc/sheets/",
	"title": "Hojas",
	"tags": [],
	"description": "",
	"content": "Trabajar con hojas Referencia por índice doc = app.active hoja = doc[0] app.debug(hoja.name) Referencia por nombre doc = app.active hoja = doc[\u0026#39;datos\u0026#39;] app.debug(hoja.name) in Verificar por nombre si una hoja existe.\ndoc = app.active existe = \u0026#39;Hoja2\u0026#39; in doc app.debug(existe) len Contar la cantidad de hojas en el documento.\ndoc = app.active contar = len(doc) app.debug(contar) iter Recorrer todas las hojas.\ndoc = app.active for hoja in doc: app.debug(hoja) "
},
{
	"uri": "https://doc.cuates.net/easymacro/es/installation/",
	"title": "Instalación",
	"tags": [],
	"description": "",
	"content": "Clonar repositorio Clone el repositorio en su directorio de proyectos favorito.\ngit clone https://git.cuates.net/elmau/easymacro Muévase al directorio\ncd 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.\n/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.\nln -s `RUTA_ABSOLUTA`/easymacro/source/easymacro /home/`USUARIO`/.config/libreoffice/4/user/Scripts/python/pythonpath/ Probar En su archivo de macros favorito, por ejemplo mismacros.py. Use su editor de texto plano o IDE favorito.\nvim /home/`USUARIO`/.config/libreoffice/4/user/Scripts/python/mismacros.py Copie el siguiente código:\nimport 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¡\nEsta todo listo para empezar a desarrollar macros con easymacro.\n!Feliz programación!\n"
},
{
	"uri": "https://doc.cuates.net/easymacro/es/tools/messages/",
	"title": "Mensajes",
	"tags": [],
	"description": "",
	"content": "Cuadros de mensaje msgbox Mostrar mensaje estandar.\nmensaje = \u0026#39;Maldito Mundo\u0026#39; titulo = \u0026#39;Mi Macro\u0026#39; app.msgbox(mensaje, titulo) warning Mostrar mensaje con icono de advertencia.\nmensaje = \u0026#39;Cuidado, esta acción es peligrosa\u0026#39; titulo = \u0026#39;Mi Macro\u0026#39; app.warning(mensaje, titulo) errorbox Mostrar mensaje con icono de error.\nmensaje = \u0026#39;ERROR: contacte a soporte\u0026#39; titulo = \u0026#39;Mi Macro\u0026#39; app.errorbox(mensaje, titulo) question 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.\nmensaje = \u0026#39;¿Es fácil Python?\u0026#39; titulo = \u0026#39;Mi Macro\u0026#39; resultado = app.question(mensaje, titulo) app.msgbox(resultado) inputbox Muestra un mensaje al usuario, permitiendo capturar una respuesta.\nmensaje = \u0026#39;Escribe tu nombre\u0026#39; nombre = app.inputbox(mensaje) app.msgbox(nombre) Para ocultar solo en pantalla lo que captura el usuario, como contraseñas.\nmensaje = \u0026#39;Captura la contraseña\u0026#39; echochar = \u0026#39;*\u0026#39; contraseña = app.inputbox(mensaje, echochar=echochar) app.msgbox(contraseña) "
},
{
	"uri": "https://doc.cuates.net/easymacro/es/calc/cells/properties/",
	"title": "Propiedades",
	"tags": [],
	"description": "",
	"content": "is_cell Verdadero (True) si el rango es de una sola celda.\nhoja = app.active_sheet celda = hoja[\u0026#39;A1\u0026#39;] app.debug(celda.is_cell) rango = hoja[\u0026#39;A1:C5\u0026#39;] app.debug(rango.is_cell) name Devuelve la dirección de la celda o rango como texto.\nhoja = app.active_sheet celda = hoja[\u0026#39;A1\u0026#39;] app.debug(celda.name) rango = hoja[\u0026#39;A1:C5\u0026#39;] app.debug(rango.name) address Devuelve la dirección de la celda como una estructura: com.sun.star.table.CellAddress\nhoja = app.active_sheet celda = hoja[\u0026#39;A1\u0026#39;] if celda.is_cell: app.debug(celda.address) range_address Devuelve la dirección del rango como una estructura: com.sun.star.table.CellRangeAddress\nhoja = app.active_sheet rango = hoja[\u0026#39;A1:C5\u0026#39;] if not rango.is_cell: app.debug(rango.range_address) filas y columnas Devolver el tamaño del rango en filas y columnas.\nhoja = app.active_sheet rango = hoja[\u0026#39;A1:E100\u0026#39;] filas = len(rango) columnas = rango.len_columns app.debug(filas, columnas) sheet Devuelve la hoja padre.\nrango = hoja[\u0026#39;A1:C5\u0026#39;] hoja = rango.sheet app.debug(hoja) doc Devuelve el documento padre.\nrango = hoja[\u0026#39;A1:C5\u0026#39;] doc = rango.doc app.debug(doc) style Devuelve o aplica el estilo de celda.\nrango = hoja[\u0026#39;A1:C5\u0026#39;] rango.style = \u0026#39;Good\u0026#39; current_region Devuelve la región actual.\ncelda = hoja[\u0026#39;A1\u0026#39;] rango = celda.current_region app.debug(rango) range_data Devuelve la región actual del rango excepto la primer fila.\ncelda = hoja[\u0026#39;A1\u0026#39;] rango = celda.range_data app.debug(rango) back_color Devuelve o aplica el color de fondo del rango.\nrango = hoja[\u0026#39;A1:E10\u0026#39;] rango.back_color = \u0026#39;red\u0026#39; type Devuelve el tipo de contenido de la celda: texto, número o formula.\ncelda = hoja[\u0026#39;A1\u0026#39;] app.debug(celda.type) error Si la celda tiene una formula con error, devuelve el número de error.\ncelda = hoja[\u0026#39;A1\u0026#39;] app.debug(celda.error) string Devuelve o establece el contenido de la celda como texto.\ncelda = hoja[\u0026#39;A1\u0026#39;] celda.string = \u0026#39;Maldito Mundo\u0026#39; app.debug(celda.type, celda.string) celda = hoja[\u0026#39;A2\u0026#39;] celda.string = 12345 app.debug(celda.type, celda.string) float Devuelve o establece el contenido de la celda como valor.\ncelda = hoja[\u0026#39;A1\u0026#39;] celda.float = 12345 app.debug(celda.type, celda.float) formula Devuelve o establece la formula de la celda.\ncelda = hoja[\u0026#39;A1\u0026#39;] celda.formula = \u0026#39;=RAND()\u0026#39; app.debug(celda.type, celda.formula) date Devuelve o establece el contenido de la celda como fecha.\ncelda = hoja[\u0026#39;A1\u0026#39;] celda.date = app.dates.date(1974, 1, 15) app.debug(type(celda.date), celda.date) 20/08/2022 18:38:53 - DEBUG - \u0026lt;class \u0026#39;datetime.date\u0026#39;\u0026gt; 1974-01-15 time Devuelve o establece el contenido de la celda como tiempo.\ncelda = hoja[\u0026#39;A1\u0026#39;] celda.time = app.dates.time(10, 11, 12) app.debug(type(celda.time), celda.time) datetime Devuelve o establece el contenido de la celda como fecha y tiempo.\ncelda = hoja[\u0026#39;A1\u0026#39;] celda.datetime = app.dates.datetime(1974, 1, 15, 10, 11, 12) app.debug(type(celda.datetime), celda.datetime) value Devuelve o establece el valor de la celda, estableciendo el tipo de dato automáticamente.\nhoja = app.active_sheet celda = hoja[\u0026#39;A1\u0026#39;] celda.value = \u0026#39;Soy Texto\u0026#39; app.debug(celda.type, celda.value) celda = hoja[\u0026#39;A2\u0026#39;] celda.value = 12345 app.debug(celda.type, celda.value) celda = hoja[\u0026#39;A3\u0026#39;] celda.value = \u0026#39;=RAND()\u0026#39; app.debug(celda.type, celda.value) celda = hoja[\u0026#39;A4\u0026#39;] celda.value = app.dates.date(1974, 1, 15) app.debug(celda.type, celda.value) data_array Devuelve o establece los datos de un rango. Es un alias de DataArray.\nrango = 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.\nformula_array Devuelve o establece los datos de un rango. Es un alias de FormulaArray.\nrango = 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.\ndata 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.\nhoja = app.active_sheet celda = hoja[\u0026#39;A1\u0026#39;] datos = ( (1, \u0026#39;Uno\u0026#39;), (2, \u0026#39;Dos\u0026#39;), (3, \u0026#39;Tres\u0026#39;), ) celda.data = datos app.debug(celda.current_region.data) Siempre valide que haya suficientes celdas libres para los datos para evitar sobreescribirlos.\ndict Devuelve o establece los datos como diccionarios.\nhoja = app.active_sheet celda = hoja[\u0026#39;A1\u0026#39;] datos = ( {\u0026#39;No\u0026#39;: 1, \u0026#39;Nombre\u0026#39;: \u0026#39;Ingrid\u0026#39;}, {\u0026#39;No\u0026#39;: 2, \u0026#39;Nombre\u0026#39;: \u0026#39;Sophia\u0026#39;}, {\u0026#39;No\u0026#39;: 3, \u0026#39;Nombre\u0026#39;: \u0026#39;Scarlette\u0026#39;}, ) celda.dict = datos app.debug(celda.current_region.dict) next_free Devuelve la siguiente celda libre después de la región actual.\nhoja = app.active_sheet celda = hoja[\u0026#39;A1\u0026#39;] celda_libre = celda.next_free app.debug(celda_libre) "
},
{
	"uri": "https://doc.cuates.net/easymacro/es/calc/ranges/properties/",
	"title": "Propiedades",
	"tags": [],
	"description": "",
	"content": "names Devolver las direcciones de los rangos.\ndoc = app.active rangos = doc.selection nombres = rangos.names app.debug(nombres) data Devolver y establecer datos.\ndoc = app.active rangos = doc.selection datos = rangos.data app.debug(datos) rangos.data = datos Cada rango debe tener exactamente el mismo tamaño.\nstyle Establecer el estilo de todos los rangos.\ndoc = app.active rangos = doc.selection rangos.style = \u0026#39;Good\u0026#39; "
},
{
	"uri": "https://doc.cuates.net/easymacro/es/calc/sheets/properties/",
	"title": "Propiedades",
	"tags": [],
	"description": "",
	"content": "doc Devuelve al documento Calc donde esta la hoja.\ndoc = app.active hoja = doc.active doc = hoja.doc app.debug(doc.title) name Nombre visible y editable por el usuario.\ndoc = app.active hoja = doc.active app.msgbox(hoja.name) hoja.name = \u0026#39;Nuevo Nombre\u0026#39; app.msgbox(hoja.name) code_name Nombre editable y accesible solo por código.\ndoc = app.active hoja = doc.active app.msgbox(hoja.code_name) hoja.code_name = \u0026#39;datos\u0026#39; app.msgbox(hoja.code_name) visible Muestra u oculta la hoja\nhoja = 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.\ncolor Color de la pestaña.\nhoja = app.active.active app.msgbox(hoja.color) hoja.color = \u0026#39;red\u0026#39; app.msgbox(hoja.color) # RGB hoja.color = (125, 200, 10) app.msgbox(hoja.color) used_area Referencia al área de usuario actual.\nhoja = app.active.active rango = hoja.used_area app.debug(rango) is_protected Devuelve verdadero (True) si la hoja esta protegida\nhoja = app.active.active esta_protegida = hoja.is_protected app.debug(esta_protegida) password Establecer una contraseña.\nhoja = app.active.active hoja.password = \u0026#39;siscaloburropanzon\u0026#39; app.debug(hoja.is_protected) "
},
{
	"uri": "https://doc.cuates.net/easymacro/es/documents/properties/",
	"title": "Propiedades",
	"tags": [],
	"description": "",
	"content": "Propiedades comúnes a todos los documentos. obj Solo lectura. Devolver el objeto original pyUNO.\ndoc = app.active app.debug(type(doc)) app.debug(type(doc.obj)) 18/08/2022 21:59:05 - DEBUG - \u0026lt;class \u0026#39;easymacro.easycalc.LOCalc\u0026#39;\u0026gt; 18/08/2022 21:59:05 - DEBUG - \u0026lt;class \u0026#39;pyuno\u0026#39;\u0026gt; title Título del documento.\ndoc = app.active app.debug(doc.title) doc.title = \u0026#39;Nuevo Titulo\u0026#39; app.debug(doc.title) type Solo lectura. Devolver el tipo de documento: calc, writer, etc.\ndoc = app.active app.debug(doc.type) uid Solo lectura. Devolver el valor interno RuntimeUID del documento.\ndoc = app.active app.debug(doc.uid) is_saved Solo lectura. Si el documento ya ha sido guardado en disco.\ndoc = app.active app.debug(doc.is_saved) is_modified Solo lectura. Si el documento ha sido modificado.\ndoc = app.active app.debug(doc.is_modified) is_read_only Solo lectura. Si el documento es de solo lectura.\ndoc = app.active app.debug(doc.is_read_only) path Solo lectura. Devolver la ruta en disco del documento.\ndoc = app.active app.debug(doc.path) dir Solo lectura. Devolver solo el directorio de la ruta en disco del documento.\ndoc = app.active app.debug(doc.dir) file_name Solo lectura. Devolver el nombre con extensión de la ruta del documento.\ndoc = app.active app.debug(doc.file_name) name Solo lectura. Devolver el nombre sin extensión de la ruta del documento.\ndoc = app.active app.debug(doc.name) visible Ocultar o mostrar un documento.\ndoc = app.active doc.visible = False app.msgbox(doc.visible) doc.visible = True No es necesario que el documento este visible para manipularse.\nzoom Devolver o establecer el porcentaje de zoom del documento.\ndoc = app.active zoom = doc.zoom app.msgbox(zoom) doc.zoom = zoom * 2 app.msgbox(doc.zoom) doc.zoom = zoom status_bar Controlar la barra de estado, es importante siempre actualizar en otro hilo.\n@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, \u0026#39;Línea: \u0026#39;, 10) return Es importante siempre devolver el control de la barra de estado a la aplicación con el método end.\nselection Devolver la selección actual.\ndoc = app.active selection = doc.selection app.debug(selection) Cuidado, la selección actual pueden ser muchas cosas diferentes.\n"
},
{
	"uri": "https://doc.cuates.net/easymacro/es/calc/ranges/",
	"title": "Conjuntos de Rangos",
	"tags": [],
	"description": "",
	"content": "Trabajar con conjuntos de rangos Selección Obtener una referencia desde la selección actual. Deben de estar seleccionados más de un rango de celdas.\ndoc = app.active seleccion = doc.selection app.debug(seleccion) 20/08/2022 13:21:17 - DEBUG - Ranges: (\u0026#39;Sheet1.A5:C8\u0026#39;, \u0026#39;Sheet1.E11:F14\u0026#39;) len Contar los rangos.\ndoc = app.active contar = len(doc.selection) app.debug(contar) iter Iterar entre los rangos.\ndoc = 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 index Referencia a un rango por índice.\ndoc = app.active rangos = doc.selection rango = rangos[1] app.debug(rango) address Referencia a un rango por su dirección.\nrango = rangos[\u0026#39;Hoja1.A1:B5\u0026#39;] app.debug(rango) contain Verificar si un rango esta en la colección.\ndoc = app.active hoja = doc.active rangos = doc.selection resultado = hoja[\u0026#39;D5:F10\u0026#39;] in rangos app.debug(resultado) "
},
{
	"uri": "https://doc.cuates.net/easymacro/es/tools/dates_and_time/",
	"title": "Fechas y tiempo",
	"tags": [],
	"description": "",
	"content": " La fecha inicial en Calc y en Python es diferente.\ntoday Obtener la fecha de hoy.\nd = app.dates app.msgbox(d.today) now Obtener la fecha y hora actuales.\nd = app.dates app.msgbox(d.now) time Obtener la hora actual.\nd = app.dates app.msgbox(d.now.time()) epoch Obtener el tiempo Unix\nd = app.dates app.msgbox(d.epoch) date Devolver una fecha\nd = app.dates date = d.date(1974, 1, 15) app.msgbox(date) time Devolver un tiempo\nd = app.dates time = d.time(10, 20, 15) app.msgbox(time) datetime Devolver fecha y hora\nd = app.dates dt = d.datetime(1974, 1, 15, 10, 11, 12) app.msgbox(dt) str_to_date Convertir una cadena en fecha. Mira este excelente recurso\nd = app.dates cadena = \u0026#39;1974-01-15\u0026#39; plantilla = \u0026#39;%Y-%m-%d\u0026#39; 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.\nd = app.dates cadena = \u0026#39;1974-01-15\u0026#39; plantilla = \u0026#39;%Y-%m-%d\u0026#39; fecha = d.str_to_date(cadena, plantilla, True) app.msgbox(fecha) app.msgbox(type(fecha)) calc_to_date Convierte el valor de una celda en una fecha Python, por ejemplo, la fecha inicial configurada en Calc.\nd = app.dates value_from_cell = 1 fecha = d.calc_to_date(value_from_cell) app.msgbox(fecha) app.msgbox(type(fecha)) start y end Medir tiempo en segundos.\nd = app.dates d.start() app.sleep(5) seconds = d.end() app.msgbox(seconds) Regresar timedelta en vez de segundos.\nd = app.dates d.start() app.sleep(5) td = d.end(False) app.msgbox(td) "
},
{
	"uri": "https://doc.cuates.net/easymacro/es/tools_debug/",
	"title": "Herramientas para depurar",
	"tags": [],
	"description": "",
	"content": "INFO_DEBUG Mostrar información de depuración en un cuadro de mensaje.\nSi 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.\nimport easymacro as app def info(): app.msgbox(app.INFO_DEBUG) return debug Mostrar información en la terminal.\nimport easymacro as app def test_debug(): msg = \u0026#39;Verificar esta información...\u0026#39; app.debug(msg) return 11/08/2022 18:15:45 - DEBUG - Verificar esta información... info Mostrar mensajes informativos en la terminal.\nimport easymacro as app def test_info(): msg = \u0026#39;Iniciando proceso...\u0026#39; app.info(msg) return 11/08/2022 18:23:53 - INFO - Iniciando proceso... error Mostrar mensajes de error en la terminal.\nimport easymacro as app def test_error(): msg = \u0026#39;Error 505\u0026#39; app.error(msg) return 11/08/2022 18:27:34 - ERROR - Error 505 save_log Guardar registro en un archivo, automáticamente se agrega la fecha y hora.\nimport easymacro as app def test_save_log(): app.save_log(\u0026#39;/home/mau/log.txt\u0026#39;, \u0026#39;PyUNO\u0026#39;) app.save_log(\u0026#39;/home/mau/log.txt\u0026#39;, \u0026#39;Maldito Mundo\u0026#39;) return cat ~/log.txt 2022-08-11 18:30:11 - \u0026#39;PyUNO\u0026#39; 2022-08-11 18:30:11 - \u0026#39;Maldito Mundo\u0026#39; msgbox Mostrar cualquier información en un cuadro de mensaje.\ndef message(): msg = \u0026#39;Por favor, consume menos.\u0026#39; app.msgbox(msg) msg = (\u0026#39;uno\u0026#39;, 2, \u0026#39;tres\u0026#39;) app.msgbox(msg) msg = {\u0026#39;nombre\u0026#39;: \u0026#39;Teresa\u0026#39;} app.msgbox(msg) app.msgbox(app) return catch_exception Capturar cualquier error que se produzca al ejecutar una macro.\n@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 \u0026#34;/home/mau/.config/libreoffice/4/user/Scripts/python/pythonpath/easymacro/easytools.py\u0026#34;, line 115, in func return f(*args, **kwargs) File \u0026#34;/home/mau/.config/libreoffice/4/user/Scripts/python/test.py\u0026#34;, 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.\nmri MRI es la mejor extensión para inspeccionar cualquier objeto UNO de LibreOffice. Necesita instalarla primero para poder llamarla.\ndef inspeccionar_objeto(): obj = app.active app.mri(obj) return inspect Inspeccionar un objeto.\ndef 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.\ndef inspeccionar_objeto(): doc = app.active app.inspect(doc, True) return "
},
{
	"uri": "https://doc.cuates.net/easymacro/es/application/menus/",
	"title": "Menús",
	"tags": [],
	"description": "",
	"content": "insert Insertar nuevo menú en Calc.\nEn la propiedad CommandURL es posible establecer tanto un comando UNO de LibreOffice, como un diccionario con los datos de una macro.\nEl nombre del menú es importante para cuando se quiera eliminar.\nnombre_menu = \u0026#39;zaz.my.menu\u0026#39; menu = { \u0026#39;Label\u0026#39;: \u0026#39;My menu\u0026#39;, \u0026#39;CommandURL\u0026#39;: nombre_menu, \u0026#39;Submenu\u0026#39;: [ { \u0026#39;Label\u0026#39;: \u0026#39;Open Macros Dialog...\u0026#39;, \u0026#39;CommandURL\u0026#39;: \u0026#39;MacroDialog\u0026#39;, }, { \u0026#39;Label\u0026#39;: \u0026#39;-\u0026#39;, }, { \u0026#39;Label\u0026#39;: \u0026#39;My macro\u0026#39;, \u0026#39;CommandURL\u0026#39;: {\u0026#39;library\u0026#39;: \u0026#39;test\u0026#39;, \u0026#39;name\u0026#39;: \u0026#39;hola\u0026#39;}, }, { \u0026#39;Label\u0026#39;: \u0026#39;Execute macro...\u0026#39;, \u0026#39;CommandURL\u0026#39;: \u0026#39;RunMacro\u0026#39;, \u0026#39;ShortCut\u0026#39;: \u0026#39;Shift+Ctrl+Alt+E\u0026#39;, }, ] } menus_calc = app.menus[\u0026#39;calc\u0026#39;] menus_calc.insert(menu) remove Eliminar un menú existente.\nnombre_menu = \u0026#39;zaz.my.menu\u0026#39; menus_calc = app.menus[\u0026#39;calc\u0026#39;] menus_calc.remove(nombre_menu) Insertar nuevo menú en uno existente. Dentro del menú Herramientas (tools), después de la opción Macros...\nmenu = app.menus[\u0026#39;calc\u0026#39;][\u0026#39;tools\u0026#39;] menu_nombre = \u0026#39;zaz.my.menu\u0026#39; menu_nuevo = { \u0026#39;Label\u0026#39;: \u0026#39;My menu\u0026#39;, \u0026#39;CommandURL\u0026#39;: menu_nombre, \u0026#39;Submenu\u0026#39;: [ { \u0026#39;Label\u0026#39;: \u0026#39;Open Macros Dialog...\u0026#39;, \u0026#39;CommandURL\u0026#39;: \u0026#39;MacroDialog\u0026#39;, }, { \u0026#39;Label\u0026#39;: \u0026#39;-\u0026#39;, }, { \u0026#39;Label\u0026#39;: \u0026#39;My macro\u0026#39;, \u0026#39;CommandURL\u0026#39;: {\u0026#39;library\u0026#39;: \u0026#39;test\u0026#39;, \u0026#39;name\u0026#39;: \u0026#39;hello\u0026#39;}, }, { \u0026#39;Label\u0026#39;: \u0026#39;Execute macro...\u0026#39;, \u0026#39;CommandURL\u0026#39;: \u0026#39;RunMacro\u0026#39;, \u0026#39;ShortCut\u0026#39;: \u0026#39;Shift+Ctrl+Alt+E\u0026#39;, }, ] } if menu_nombre in menu: menu.remove(menu_nombre) else: menu.insert(menu_nuevo, \u0026#39;.uno:MacrosMenu\u0026#39;) debug Para saber los nombres de cualquier menú.\nmenu = app.menus[\u0026#39;calc\u0026#39;][\u0026#39;tools\u0026#39;] 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 "
},
{
	"uri": "https://doc.cuates.net/easymacro/es/calc/cells/methods/",
	"title": "Métodos",
	"tags": [],
	"description": "",
	"content": "clear Limpia el rango. Por default solo borra datos. Mire API CellFlags para más información.\nrango.clear() Para borrar todo.\nrango.clear(app.ALL) "
},
{
	"uri": "https://doc.cuates.net/easymacro/es/calc/ranges/methods/",
	"title": "Métodos",
	"tags": [],
	"description": "",
	"content": "ranges Crear un nuevo contender de rangos vacío.\ndoc = app.active rangos = doc.ranges() app.debug(rangos) add doc = app.active hoja = doc.active rangos = doc.ranges() rangos.add(hoja[\u0026#39;A1:B2\u0026#39;]) rangos.add(hoja[\u0026#39;D5:F10\u0026#39;]) app.debug(rangos) remove rangos.remove(hoja[\u0026#39;A1:B2\u0026#39;]) get_ranges "
},
{
	"uri": "https://doc.cuates.net/easymacro/es/calc/sheets/methods/",
	"title": "Métodos",
	"tags": [],
	"description": "",
	"content": "unprotect Quitar contraseña.\nhoja = app.active.active hoja.password = \u0026#39;siscaloburropanzon\u0026#39; app.msgbox(hoja.is_protected) hoja.unprotect(\u0026#39;siscaloburropanzon\u0026#39;) app.msgbox(hoja.is_protected) activate Pasar el foco a la hoja.\ndoc = app.active hoja = doc[-1] hoja.activate() move Mover a la última posición.\ndoc = app.active hoja = doc[0] hoja.move() Mover a una posición especifica.\ndoc = app.active hoja = doc[0] hoja.move(3) remove Remover hoja.\nsheet = app.active.active sheet.remove() Siempre debe existir al menos una hoja.\ncopy Siempre valida que no exista el nuevo nombre.\ndoc = app.active hoja = doc[0] nuevo_nombre = f\u0026#39;{hoja.name}_2\u0026#39; 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.\nhoja.copy() copy_to Copiar la hoja a otro documento. Se usa el mismo nombre.\ndoc = app.active hoja = doc.active documento_nuevo = app.docs.new() hoja.copy_to(documento_nuevo) Usar un nuevo nombre.\nhoja.copy_to(documento_nuevo, \u0026#39;Nuevo nombre\u0026#39;) "
},
{
	"uri": "https://doc.cuates.net/easymacro/es/documents/methods/",
	"title": "Métodos",
	"tags": [],
	"description": "",
	"content": "new Crear nuevo documento, la aplicación predeterminada es Calc.\ndoc = app.docs.new() app.debug(doc.type) Para un nuevo documento writer.\ndoc = app.docs.new(\u0026#39;writer\u0026#39;) app.debug(doc.type) Otros documentos.\ndoc = app.docs.new(\u0026#39;draw\u0026#39;) app.debug(doc.type) doc = app.docs.new(\u0026#39;impress\u0026#39;) app.debug(doc.type) doc = app.docs.new(\u0026#39;math\u0026#39;) app.debug(doc.type) Crear con argumentos.\npropiedades = {\u0026#39;Hidden\u0026#39;: True} doc = app.docs.new(\u0026#39;writer\u0026#39;, propiedades) mensaje = f\u0026#39;{doc.type} - {doc.title}\u0026#39; app.msgbox(mensaje) doc.visible = True No es necesario que el documento este visible para manipularse.\nopen Abrir archivos.\nruta = \u0026#39;/home/mau/Mi_archivo.ods\u0026#39; doc = app.docs.open(ruta) No es necesario pasar las rutas en formato URL.\nPuede abrir cualquier archivo que sea soportado por LibreOffice.\nruta = \u0026#39;/home/mau/ejemplo.xlsx\u0026#39; doc = app.docs.open(ruta) Abrir con argumentos.\nruta = \u0026#39;/home/mau/ejemplo.ods\u0026#39; argumentos = {\u0026#39;Password\u0026#39;: \u0026#39;siscaloburropanzon\u0026#39;} doc = app.docs.open(ruta, argumentos) save Guardar un nuevo documento.\npath = \u0026#39;/home/mau/nuevo_documento.ods\u0026#39; doc = app.docs.new() doc.save(path) Cualquier archivo, previamente guardado, que sea modificado puede ser guardado con:\ndoc.save() Abrir un archivo existente y guardarlo con otro nombre.\nruta = \u0026#39;/home/mau/ejemplo.ods\u0026#39; doc = app.docs.open(ruta) nueva_ruta = \u0026#39;/home/mau/otro_nombre.ods\u0026#39; doc.save(nueva_ruta) close Cerrar un archivo.\ndoc = app.docs.new() app.msgbox(doc.title) doc.close() to_pdf Exportar a PDF.\ndoc = app.active ruta = \u0026#39;/home/mau/ejemplo.pdf\u0026#39; doc.to_pdf(ruta) Si no se establece una ruta, se devuelve el PDF en memoria.\ndoc = 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.\nexport Exportar a otros formatos.\ndoc = app.docs.new() ruta = \u0026#39;/home/mau/miarchivo.xlsx\u0026#39; filtro = \u0026#39;xlsx\u0026#39; doc.export(ruta, filtro) ruta = \u0026#39;/home/mau/miarchivo.xls\u0026#39; filtro = \u0026#39;xls\u0026#39; doc.export(ruta, filtro) doc = app.docs.new(\u0026#39;writer\u0026#39;) ruta = \u0026#39;/home/mau/miarchivo.docx\u0026#39; filtro = \u0026#39;docx\u0026#39; doc.export(ruta, filtro) ruta = \u0026#39;/home/mau/miarchivo.doc\u0026#39; filtro = \u0026#39;doc\u0026#39; doc.export(ruta, filtro) ruta = \u0026#39;/home/mau/miarchivo.rtf\u0026#39; filtro = \u0026#39;rtf\u0026#39; doc.export(ruta, filtro) Exportar en memoria.\ndoc = app.docs.new() filtro = \u0026#39;xlsx\u0026#39; excel_doc = doc.export(filter_name=filtro) set_focus Enviar el foco al documento.\nfor doc in app.docs: app.debug(doc.title) doc.set_focus() app.sleep(1) copy Copiar la selección activa al portapapeles.\ndoc = app.active doc.copy() paste Copiar el contenido del portapapeles, en la selección actual.\ndoc = app.active doc.paste() paste_special Mostrar el cuadro de diálogo Pegado Especial.\nSolo se mostrará si existe contenido en el portapapeles.\ndoc = app.active doc.paste_special() paste_values Pegar solo los valores.\ndoc = app.active doc.paste_values() Si el destino no esta vacío, el usuario verá el cuadro de mensaje de confirmación.\nclear_undo 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.\ndoc = app.active doc.clear_undo() "
},
{
	"uri": "https://doc.cuates.net/easymacro/es/tools/paths/",
	"title": "Rutas y archivos",
	"tags": [],
	"description": "",
	"content": "Trabajar con rutas y archivos. path Obtener información de una ruta.\nruta_archivo = \u0026#39;/home/mau/mi_archivo.ods\u0026#39; 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.\nruta_archivo = \u0026#39;/home/mau/mi_archivo.ods\u0026#39; p = app.paths(ruta_archivo) app.debug(p.info) 15/08/2022 14:43:01 - DEBUG - (\u0026#39;/home/mau\u0026#39;, \u0026#39;mi_archivo.ods\u0026#39;, \u0026#39;mi_archivo\u0026#39;, \u0026#39;ods\u0026#39;, 7011, \u0026#39;file:///home/mau/mi_archivo.ods\u0026#39;) O como diccionario.\nruta_archivo = \u0026#39;/home/mau/mi_archivo.ods\u0026#39; p = app.paths(ruta_archivo) app.debug(p.dict) 15/08/2022 14:43:01 - DEBUG - {\u0026#39;path\u0026#39;: \u0026#39;/home/mau\u0026#39;, \u0026#39;file_name\u0026#39;: \u0026#39;mi_archivo.ods\u0026#39;, \u0026#39;name\u0026#39;: \u0026#39;mi_archivo\u0026#39;, \u0026#39;ext\u0026#39;: \u0026#39;ods\u0026#39;, \u0026#39;size\u0026#39;: 7011, \u0026#39;url\u0026#39;: \u0026#39;file:///home/mau/mi_archivo.ods\u0026#39;} home Obtener la carpeta de inicio del usuario.\np = app.paths app.debug(p.home) documents Obtener la carpeta Documentos del usuario.\np = app.paths app.debug(p.documents) user_profile Obtener la ruta del perfil de usuario.\np = app.paths app.debug(p.user_profile) user_config Obtener la ruta de la carpeta config en el perfil de usuario.\np = app.paths app.debug(p.user_config) python Obtener la ruta del ejecutable python\np = app.paths app.debug(p.python) to_system Pasar una ruta en formato URL al formato del sistema de archivos del SO.\np = app.paths ruta_url = \u0026#39;file:///home/mau/mi_archivo.ods\u0026#39; ruta = p.to_system(ruta_url) app.debug(ruta) to_url Pasar una ruta del sistema de archivos del SO al formato URL.\np = app.paths ruta = \u0026#39;/home/mau/mi_archivo.ods\u0026#39; ruta_url = p.to_url(ruta) app.debug(ruta_url) config Obtener rutas de la configuración de LibreOffice. Por default obtiene la ruta de Documentos, para otras ruta mire Api XPathSettings\np = app.paths ruta = p.config() app.debug(ruta) ruta = p.config(\u0026#39;UserConfig\u0026#39;) app.debug(ruta) Algunas rutas pueden ser más de una, separados por ;, en este caso, el resultado es una lista con las rutas.\njoin Concatenar rutas.\np = app.paths ruta = p.join(\u0026#39;/home/mau\u0026#39;, \u0026#39;pruebas\u0026#39;, \u0026#39;archivo.ods\u0026#39;) app.debug(ruta) exists Verificar si una ruta existe.\np = app.paths resultado = p.exists(\u0026#39;/home/mau/test/archivo.ods\u0026#39;) app.debug(resultado) exists_app Verificar si una aplicación existe.\np = app.paths resultado = p.exists_app(\u0026#39;noexiste\u0026#39;) app.debug(resultado) resultado = p.exists_app(\u0026#39;soffice\u0026#39;) app.debug(resultado) is_dir Verificar si la ruta es un directorio.\np = app.paths resultado = p.is_dir(\u0026#39;/home/mau\u0026#39;) app.debug(resultado) is_file Verificar si la ruta es un archivo.\np = app.paths resultado = p.is_file(\u0026#39;/home/mau/mi_archivo.ods\u0026#39;) app.debug(resultado) temp_file Crear un archivo temporal, es borrado automáticamente al cerrarse.\np = app.paths f = p.temp_file() f.write(app.INFO_DEBUG) f.close() Usado en contexto, se cierra automáticamente.\nwith p.temp_file() as f: app.debug(f.name) f.write(\u0026#39;test\u0026#39;) temp_dir Crear un directorio temporal, al salir del contexto, es eliminado junto con todo su contenido del sistema de archivos.\np = app.paths with p.temp_dir() as d: app.debug(p.exists(d)) app.debug(d) app.debug(p.exists(d)) get Permitir al usuario seleccionar archivos, devuelve solo la ruta. De forma predeterminada abre en la carpeta Documentos.\np = app.paths ruta = p.get() app.debug(ruta) Establecer que abra en otro directorio.\nruta = p.get(\u0026#39;/tmp\u0026#39;) app.debug(ruta) Agregar un filtro.\nruta = p.get(filters=\u0026#39;ods\u0026#39;) app.debug(ruta) Agregar multiples filtros.\nruta = p.get(filters=\u0026#39;xml,txt\u0026#39;) app.debug(ruta) Permitir selecciones multiples.\nruta = p.get(filters=\u0026#39;xml,txt\u0026#39;, multiple=True) app.debug(ruta) get_dir Permitir al usuario seleccionar un directorio, devuelve solo la ruta. De forma predeterminada abre en la carpeta Documentos.\np = app.paths ruta = p.get_dir() app.debug(ruta) Establecer que abra en otro directorio.\nruta = p.get_dir(\u0026#39;/tmp\u0026#39;) app.debug(ruta) get_for_save Permitir seleccionar un directorio y capturar el nombre del archivo, devuelve la ruta completa.\np = app.paths ruta = p.get_for_save() app.debug(ruta) Establecer que inicie en otro directorio.\nruta = p.get_for_save(\u0026#39;/tmp\u0026#39;) app.debug(ruta) Si se establece un filtro, automáticamente se agrega la extensión.\nruta = p.get_for_save(filters=\u0026#39;txt\u0026#39;) app.debug(ruta) files Obtener archivos de una ruta, no recursivamente. De forma predeterminada regresa todos, incluyendo archivos ocultos.\nruta = \u0026#39;/home/mau\u0026#39; p = app.paths archivos = p.files(ruta) for a in archivos: app.debug(a) Filtrar por tipo de archivo.\np = app.paths archivos = p.files(ruta, \u0026#39;*.pdf\u0026#39;) Obtener archivos de forma recursiva.\np = app.paths archivos = p.files(ruta, \u0026#39;**/*.xml\u0026#39;) walk Obtener archivos de forma recursiva.\np = app.paths ruta = \u0026#39;/home/mau/Documents\u0026#39; archivos = p.walk(ruta) for a in archivos: app.debug(a) Con filtro.\narchivos = p.walk(ruta, \u0026#39;ods\u0026#39;) Con filtros.\narchivos = p.walk(ruta, \u0026#39;ods|odt\u0026#39;) dirs Obtener los directorios de una ruta, no recursivamente.\np = app.paths ruta = \u0026#39;/home/mau/Documents\u0026#39; folders = p.dirs(ruta) for f in folders: app.debug(f) walk_dirs Obtener los directorios de una ruta, no recursivamente.\np = app.paths ruta = \u0026#39;/home/mau/Documents\u0026#39; 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)\nfolders = p.walk_dirs(ruta, True) extension Obtener la ruta de instalación de una extensión a partir de su ID.\np = app.paths id_ext = \u0026#39;net.elmau.zaz.talk\u0026#39; ruta = p.extension(id_ext) app.debug(ruta) replace_ext Reemplazar extensión de un archivo.\np = app.paths ruta = \u0026#39;/home/mau/mi_archivo.ods\u0026#39; ruta_nueva = p.replace_ext(ruta, \u0026#39;pdf\u0026#39;) app.debug(ruta_nueva) open Abrir cualquier archivo con el programas predeterminado del SO.\np = app.paths ruta = \u0026#39;/home/mau/archivo.pdf\u0026#39; p.open(ruta) ruta = \u0026#39;/home/mau/index.html\u0026#39; p.open(ruta) save y read Guardar y leer datos, el encoding predeterminado es UTF8.\np = app.paths datos = \u0026#34;\u0026#34;\u0026#34;¿Quieres saber quién eres? No preguntes. Actúa. La acción te delineará y definirá. Thomas Jefferson \u0026#34;\u0026#34;\u0026#34; ruta = \u0026#39;/home/mau/temp.txt\u0026#39; p.save(ruta, datos) datos = p.read(ruta) app.msgbox(datos) Cambiar el encoding.\napp.paths.save(ruta, datos, \u0026#39;iso-8859-1\u0026#39;) save_bin y read_bin Guardar y leer datos binarios.\np = app.paths datos = b\u0026#39;Datos binarios\u0026#39; ruta = \u0026#39;/home/mau/temp.bin\u0026#39; p.save_bin(ruta, datos) datos = p.read_bin(ruta) app.msgbox(datos) save_json y read_json Guardar y leer en formato json.\np = app.paths ruta = \u0026#39;/home/mau/datos.json\u0026#39; datos = { \u0026#39;tipo\u0026#39;: \u0026#39;calc\u0026#39;, \u0026#39;nombre\u0026#39;: \u0026#39;miarchivo.ods\u0026#39;, } p.save_json(ruta, datos) datos = p.read_json(ruta) app.msgbox(datos) save_csv y read_csv Exportar e importar datos en formato CSV. Vea la documentación CSV para los argumentos que puede usar.\np = app.paths ruta = \u0026#39;/home/mau/datos.csv\u0026#39; ahora = app.dates.now datos = ( (1, \u0026#39;uno\u0026#39;, ahora), (2, \u0026#39;dos\u0026#39;, ahora), (3, \u0026#39;tres\u0026#39;, ahora), ) p.save_csv(ruta, datos) datos = p.read_csv(ruta) app.msgbox(datos) kill Borra archivos o directorios con todo su contenido. Devuelve verdadero (True) en caso de exito y falso (Falso) en cualquier otro caso.\nEste proceso es destructivo, es buena practica siempre solicitar confirmación al usuario.\np = app.paths ruta = \u0026#39;/home/mau/temp.bin\u0026#39; resultado = p.kill(ruta) app.msgbox(resultado) copy Copiar archivos. Devuelve la ruta completa final destino.\nDe un origen a una carpeta destino\np = app.paths ruta_origen = \u0026#39;/home/mau/temp.txt\u0026#39; ruta_destino = \u0026#39;/home/mau/Desktop\u0026#39; ruta = p.copy(ruta_origen, ruta_destino) app.debug(ruta) Cambiar el nombre destino.\nruta_origen = \u0026#39;/home/mau/temp.txt\u0026#39; ruta_destino = \u0026#39;/home/mau/Desktop\u0026#39; nuevo_nombre = \u0026#39;datos.csv\u0026#39; ruta = p.copy(ruta_origen, ruta_destino, nuevo_nombre) app.debug(ruta) "
},
{
	"uri": "https://doc.cuates.net/easymacro/es/calc/cells/",
	"title": "Celdas y rangos",
	"tags": [],
	"description": "",
	"content": "Trabajar con celdas y rangos selection Referencia por selección actual.\nseleccion = 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 address Referencia por dirección.\nhoja = app.active_sheet celda = hoja[\u0026#39;A1\u0026#39;] rango = hoja[\u0026#39;C10:D15\u0026#39;] app.debug(celda) app.debug(rango) position Referencia por posición.\nPara celdas: HOJA[fila,columna]\nPara rangos: HOJA[fila_inicial:fila_final, columna_inicial:columna_final]\nhoja = app.active_sheet # ~ Cell A10 celda = hoja[9,0] # ~ Range A1:C10 rango = hoja[0:10,0:3] iter Iterar cada celda de un rango.\nhoja = app.active_sheet rango = hoja[\u0026#39;B10:C15\u0026#39;] for celda in rango: app.debug(celda) contains Verificar si un rango esta dentro de otro.\nhoja = app.active_sheet celda = hoja[\u0026#39;C5\u0026#39;] rango = hoja[\u0026#39;A1:E10\u0026#39;] resultado = celda in rango app.debug(resultado) celda = hoja[\u0026#39;C50\u0026#39;] resultado = celda in rango app.debug(resultado) "
},
{
	"uri": "https://doc.cuates.net/easymacro/es/tools/email/",
	"title": "Correo electrónico",
	"tags": [],
	"description": "",
	"content": "Enviar correo electrónico. Siempre guarda las contraseñas de la forma más segura posible.\nsend Enviar un correo electrónico.\nfrom conf import PASSWORD SERVER = dict( server = \u0026#39;mail.correo.net\u0026#39; , port = 405, ssl = True, user = \u0026#39;no-responder@pruebas.mx\u0026#39;, password = PASSWORD, ) body = \u0026#34;Hola Ingrid\\n\\n¿Como estas?\\n\\nSaludos cordiales\u0026#34; message = dict( to = \u0026#39;ingrid@bergman.mx\u0026#39;, subject = \u0026#39;Te amo...\u0026#39;, 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.\nto = \u0026#39;mail1@correo.com,mail2@correo.com,mail3@correo.com\u0026#39; cc = \u0026#39;otro@correo.com\u0026#39; bcc = \u0026#39;oculto@correo.com\u0026#39; Podemos enviar más de un mensaje.\nmensaje1 = dict( to = \u0026#39;ingrid@correo.net\u0026#39;, subject = \u0026#39;Te amo...\u0026#39;, body = \u0026#34;Hola Ingrid\\n\\n¿Como estas?\\n\\nSaludos cordiales\u0026#34;, ) mensaje2 = dict( to = \u0026#39;sophia@correo.net\u0026#39;, subject = \u0026#39;A ti también...\u0026#39;, body = \u0026#34;Hola Sophia\\n\\n¿Como estas?\\n\\nSaludos cordiales\u0026#34;, ) 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.\narchivo = \u0026#39;/home/mau/temp.txt\u0026#39; mensaje = dict( to = \u0026#39;ingrid@bergman.mx\u0026#39;, subject = \u0026#39;Te amo...\u0026#39;, body = \u0026#34;Hola Ingrid\\n\\n¿Como estas?\\n\\nSaludos cordiales\u0026#34;, files = archivo, ) app.email.send(SERVER, mensaje) O varios.\narchivos = ( \u0026#39;/home/mau/temp.txt\u0026#39;, \u0026#39;/home/mau/datos.csv\u0026#39;, ) 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.\nruta = \u0026#39;/home/mau/.thunderbird/7iznrbyw.default/Mail/Local Folders/LibreOffice\u0026#39; mensaje = dict( to = \u0026#39;ingrid@bergman.mx\u0026#39;, subject = \u0026#39;Te amo...\u0026#39;, body = \u0026#34;Hola Ingrid\\n\\n¿Como estas?\\n\\nSaludos cordiales\u0026#34;, path = ruta, ) app.email.send(SERVER, mensaje) Todos los correos se envían siempre en otro hilo de ejecución.\n"
},
{
	"uri": "https://doc.cuates.net/easymacro/es/calc/sheets/events/",
	"title": "Eventos",
	"tags": [],
	"description": "",
	"content": "Eventos de la hoja. Obtener una tupla con los eventos soportados por la hoja.\nhoja = app.active.active nombres = hoja.events.names app.debug(nombres) Asignar una macro a un evento. def on_select(source): app.debug(source.AbsoluteName) return def main(): doc = app.active hoja = doc.active if \u0026#39;OnSelect\u0026#39; in hoja.events: macro = {\u0026#39;library\u0026#39;: \u0026#39;test\u0026#39;, \u0026#39;name\u0026#39;: \u0026#39;on_select\u0026#39;} hoja.events[\u0026#39;OnSelect\u0026#39;] = macro return Eliminar la asignación del evento. hoja.events[\u0026#39;OnSelect\u0026#39;] = {} O\nhoja.events.remove(\u0026#39;OnFocus\u0026#39;) "
},
{
	"uri": "https://doc.cuates.net/easymacro/es/tools/",
	"title": "Herramientas",
	"tags": [],
	"description": "",
	"content": "Recuerda, es necesario importar la librería.\nimport easymacro as app Información sobre la PC OS Obtener el sistema operativo.\napp.msgbox(app.OS) DESKTOP Obtener el tipo de escritorio, solo en GNU/Linux.\napp.msgbox(app.DESKTOP) PC Obtener el nombre de la computadora.\napp.msgbox(app.PC) USER Obtener el nombre de usuario.\napp.msgbox(app.USER) IS_WIN Saber si estamos en Windows.\napp.msgbox(app.IS_WIN) IS_MAC Saber si estamos en OSX.\napp.msgbox(app.IS_MAC) Información sobre LibreOffice NAME Nombre de la aplicación.\napp.msgbox(app.NAME) VERSION Versión de la aplicación.\napp.msgbox(app.VERSION) LANG Lenguaje de la aplicación.\napp.msgbox(app.LANG) LANGUAGE Lenguaje con variante.\napp.msgbox(app.LANGUAGE) "
},
{
	"uri": "https://doc.cuates.net/easymacro/es/application/",
	"title": "LibreOffice",
	"tags": [],
	"description": "",
	"content": "fonts Devolver todas las fuentes visibles en LibreOffice. Mire FontDescriptor\nfonts = app.fonts() for f in fonts: app.debug(f\u0026#39;Nombre: {f.Name} - Estilo: {f.StyleName}\u0026#39;) filters Devolver todos los filtros soportados en LibreOffice. Mire la ayuda y en API FilterFactory para más detalles.\nfiltros = app.filters() for f in filtros: info = f\u0026#34;Nombre UI: {f[\u0026#39;UIName\u0026#39;]} - Nombre: {f[\u0026#39;Name\u0026#39;]} - Tipo: {f[\u0026#39;Type\u0026#39;]}\u0026#34; app.debug(info) dispatch Ejecutar cualquier comando UNO de LibreOffice, mire la lista de comandos y API dispatch.\nEste método automáticamente agrega el prefijo necesario: .uno:\ndoc = app.active comando = \u0026#39;Gallery\u0026#39; 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.\nclipboard Envíar contenido al portapapeles.\napp.clipboard.set(\u0026#39;Los 7 samuráis\u0026#39;) Recuperar contenido del portapapeles.\ncontent = app.clipboard.get() app.debug(content) disable Deshabilitar un comando. Para una lista de comandos mire DispatchCommands.\ncomando = \u0026#39;OpenFromCalc\u0026#39; 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.\nenabled Habilitar un comando.\ncomando = \u0026#39;OpenFromCalc\u0026#39; resultado = app.cmd.enabled(comando) app.debug(resultado) get_config Obtener valores de la configuración de LibreOffice.\nnombre_node = \u0026#39;/org.openoffice.Office.Common/Help\u0026#39; clave = \u0026#39;System\u0026#39; valor = app.get_config(nombre_node, clave) app.debug(valor) nombre_node = \u0026#39;/org.openoffice.Office.Common/Misc/\u0026#39; clave = \u0026#39;FirstRun\u0026#39; valor = app.get_config(nombre_node, clave) app.debug(valor) clave = \u0026#39;UseSystemFileDialog\u0026#39; 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 set_config Establece un nuevo valor en la configuración de LibreOffice.\nnombre_nodo = \u0026#39;/org.openoffice.Office.UI/ColorScheme\u0026#39; clave = \u0026#39;CurrentColorScheme\u0026#39; nuevo_valor = \u0026#39;LibreOffice Dark\u0026#39; resultado = app.set_config(nombre_nodo, clave, nuevo_valor) app.debug(resultado) Algunos nodos y claves interesantes:\n/org.openoffice.Office.Common/Save/Document AutoSave AutoSaveTimeIntervall No todos los valores de los nodos se pueden cambiar, algunos valores son de solo lectura.\n"
},
{
	"uri": "https://doc.cuates.net/easymacro/es/documents/",
	"title": "Documentos",
	"tags": [],
	"description": "",
	"content": "Trabajar con Documentos active Documento activo.\ndoc = app.active app.msgbox(doc.title) iteration Iterar en todos los documentos abiertos.\nfor doc in app.docs: app.debug(doc.type, doc.title) count Contar los documentos abiertos.\ncuantos = len(app.docs) app.debug(cuantos) contain Verificar si un documento esta en la colección.\nresultado = \u0026#39;mi_archivo.ods\u0026#39; in app.docs app.debug(resultado) index Devolver por índice.\ndoc = app.docs[1] app.debug(doc.type, doc.title) name Devolver por nombre.\nnombre = \u0026#39;mi_archivo.ods\u0026#39; if nombre in app.docs: doc = app.docs[nombre] app.debug(doc.type, doc.title) "
},
{
	"uri": "https://doc.cuates.net/easymacro/es/tools/threads/",
	"title": "Hilos",
	"tags": [],
	"description": "",
	"content": "Ejecutar macros en otros hilos. Las macros se ejecutan en un hilo que bloquea cualquier otro proceso dentro de la aplicación.\nSi ejecutas la siguiente macro main, nota que no puedes hacer algo más dentro de LibreOffice durante los 5 segundos que dura el proceso.\nimport easymacro as app def hacer_pausa(segundos): app.sleep(segundos) app.debug(\u0026#39;He terminado\u0026#39;) return def main(): hacer_pausa(5) app.msgbox(\u0026#39;Fin...\u0026#39;) return Hasta que aparece el cuadro de mensaje con la palabra Fin y lo cierras, el usuario puede seguir usando la aplicación.\nrun_in_thread Ahora ejecutamos la macro en otro hilo, \u0026ldquo;decorando\u0026rdquo; cualquier macro con run_in_thread\n@app.run_in_thread def hacer_pausa(segundos): app.sleep(segundos) app.debug(\u0026#39;He terminado\u0026#39;) return def main(): hacer_pausa(5) app.msgbox(\u0026#39;Fin...\u0026#39;) return Nota que ahora el mensaje aparece inmediatamente y no tras los 5 segundos.\nPonga 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.\n"
},
{
	"uri": "https://doc.cuates.net/easymacro/es/calc/",
	"title": "Calc",
	"tags": [],
	"description": "",
	"content": "Trabajar con Calc active doc = app.active app.debug(doc.type) Propiedades headers Mostrar u ocultar encabezados de filas y columnas.\ndoc = app.active app.msgbox(doc.headers) doc.headers = not doc.headers app.msgbox(doc.headers) doc.headers = not doc.headers tabs Mostrar u ocultar las pestañas de las hojas.\ndoc = app.active app.msgbox(doc.tabs) doc.tabs = not doc.tabs app.msgbox(doc.tabs) doc.tabs = not doc.tabs selection Devolver la selección activa.\ndoc = app.active seleccion = doc.selection app.debug(seleccion) Cuidado, la selección actual pueden ser muchas cosas diferentes.\nnames Devolver una tupla con los nombres de todas las hojas.\ndoc = app.active nombres = doc.names app.debug(nombres) active Devuelve la hoja activa.\ndoc = app.active hoja = doc.active app.debug(hoja) Métodos activate Activar hoja, argumento como objeto.\ndoc = app.active hoja = doc[-1] doc.activate(hoja) Activar hoja por nombre.\ndoc = app.active doc.activate(\u0026#39;Hoja3\u0026#39;) select Seleccionar una celda o rango.\ndoc = app.active cell = doc[0][\u0026#39;A1\u0026#39;] doc.select(cell) NO es necesario seleccionar celdas o rangos para manipularlos.\nstart_range_selection 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:\nclass 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 insert Inserta una nueva hoja.\ndoc = app.active hoja = doc.insert(\u0026#39;OtraHoja\u0026#39;) Insertar varias hojas. Devolverá la última insertada.\nnombres = (\u0026#39;Enero\u0026#39;, \u0026#39;Febrero\u0026#39;, \u0026#39;Marzo\u0026#39;) hoja = doc.insert(nombres) app.debug(hoja) Creando una nueva instancia y asignandola.\ndoc = app.active doc[\u0026#39;NuevaHoja\u0026#39;] = doc.new_sheet() Si la hoja existe, obtendrá un error, verifique siempre que no exista primero.\nmove Mover hojas.\nPasar la hoja como objeto, de forma predetermianda se mueve a la última posición.\ndoc = app.active hoja = doc[0] doc.move(hoja) Pasar la hoja por nombre.\ndoc = app.active doc.move(\u0026#39;Hoja1\u0026#39;) Especificar la posición destino.\ndoc = app.active hoja = doc[0] doc.move(hoja, 2) remove Eliminar hoja.\ndoc = app.active sheet = doc[0] doc.remove(sheet) Eliminar por nombre.\ndoc.remove(\u0026#39;Hoja2\u0026#39;) copy Copiar hoja dentro del mismo documento.\ndoc = app.active hoja = doc[0] doc.copy_sheet(hoja, \u0026#39;Otra hoja\u0026#39;) Por nombre.\ndoc.copy_sheet(\u0026#39;Hoja1\u0026#39;, \u0026#39;Hoja2\u0026#39;) Si no se establece el nuevo nombre, se generá de forma automática: nombre + índice.\ndoc.copy_sheet(hoja) copy_from Copiar hojas de otro documento. Copiar con el mismo nombre.\ndoc = app.active documento_origen = app.docs[\u0026#39;Contactos.ods\u0026#39;] nombre_origen = \u0026#39;Nombres\u0026#39; doc.copy_from(documento_origen, nombre_origen) Copiar con un nuevo nombre.\ndoc.copy_from(documento_origen, nombre_origen, \u0026#39;NuevoNombre\u0026#39;) Si solo se establece el documento origen, se copian todas las hojas.\ndoc.copy_from(documento_origen) sort Ordenar hojas en orden alfabetico.\ndoc = app.active doc.sort() Ordenar de forma inversa.\ndoc = app.active doc.sort(True) Eventos del documento. Obtener una tupla con los eventos soportados por el documento.\ndoc = app.active nombres = doc.events.names app.debug(nombres) Asignar una macro a un evento. def doc_on_focus(event): app.debug(\u0026#39;Documento activado...\u0026#39;) return def main(): doc = app.active events = doc.events if \u0026#39;OnFocus\u0026#39; in events: macro = {\u0026#39;library\u0026#39;: \u0026#39;test\u0026#39;, \u0026#39;name\u0026#39;: \u0026#39;doc_on_focus\u0026#39;} events[\u0026#39;OnFocus\u0026#39;] = macro return Eliminar la asignación del evento. doc = app.active doc.events[\u0026#39;OnFocus\u0026#39;] = {} O\ndoc = app.active doc.events.remove(\u0026#39;OnFocus\u0026#39;) "
},
{
	"uri": "https://doc.cuates.net/easymacro/es/tools/macros/",
	"title": "Ejecutar macros",
	"tags": [],
	"description": "",
	"content": "Ejecutar cualquier macro, de forma predeterminada se llaman a las macros en Python localizadas en el perfil de usuario.\nimport easymacro as app def mostrar_info(): app.msgbox(app.INFO_DEBUG) return def main(args=None): macro = { \u0026#39;library\u0026#39;: \u0026#39;test\u0026#39;, \u0026#39;name\u0026#39;: \u0026#39;mostrar_info\u0026#39;, } app.macro.call(macro) return Ejecutar una macro compartida en LibreOffice Macros.\nmacro = { \u0026#39;library\u0026#39;: \u0026#39;HelloWorld\u0026#39;, \u0026#39;name\u0026#39;: \u0026#39;HelloWorldPython\u0026#39;, \u0026#39;location\u0026#39;: \u0026#39;share\u0026#39;, } app.macro.call(macro) Ejecutar una macro Basic.\nSub mostrar_info() MsgBox \u0026#34;Mejor usa Python :)\u0026#34; End Sub macro = { \u0026#39;language\u0026#39;: \u0026#39;Basic\u0026#39;, \u0026#39;library\u0026#39;: \u0026#39;Standard\u0026#39;, \u0026#39;module\u0026#39;: \u0026#39;Module1\u0026#39;, \u0026#39;name\u0026#39;: \u0026#39;mostrar_info\u0026#39;, } app.macro.call(macro) Cualquier macro se puede ejecutar en otro hilo.\napp.macro.call(macro, True) Más información en: Scripting Framework URI Specification\n"
},
{
	"uri": "https://doc.cuates.net/easymacro/es/tools/timer/",
	"title": "Timer",
	"tags": [],
	"description": "",
	"content": "El timer siempre se ejecuta en otro hilo.\nonce Ejecutar macro una sola vez en X segundos.\nimport easymacro as app NOMBRE = \u0026#39;reloj\u0026#39; def mostrar_hora(): app.debug(app.dates.now_time) return def iniciar_conteo(): segundos = 5 macro = { \u0026#39;library\u0026#39;: \u0026#39;test\u0026#39;, \u0026#39;name\u0026#39;: \u0026#39;mostrar_hora\u0026#39;, } app.timer.once(NOMBRE, segundos, macro) return def main(args=None): iniciar_conteo() return cancel Cancelar ejecución, antes del tiempo establecido.\ndef 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: \u0026#34;reloj\u0026#34;, started... execute in 60 seconds 16/08/2022 21:18:55 - INFO - Cancel event: \u0026#34;reloj\u0026#34;, ok... start Ejecutar macro cada X segundos.\nNOMBRE = \u0026#39;reloj\u0026#39; def mostrar_hora(): app.debug(app.dates.now_time) return def iniciar_reloj(): segundos = 1 macro = { \u0026#39;library\u0026#39;: \u0026#39;test\u0026#39;, \u0026#39;name\u0026#39;: \u0026#39;mostrar_hora\u0026#39;, } app.timer.start(NOMBRE, segundos, macro) return def main(args=None): iniciar_reloj() return stop Detener timer.\ndef detener_reloj(): app.timer.stop(NOMBRE) return 16/08/2022 21:25:37 - INFO - Timer \u0026#39;reloj\u0026#39; started, execute macro: \u0026#39;mostrar_hora\u0026#39; 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.\nAsegurese siempre de ejecutar macros que NO bloqueen la interfaz del usuario.\n"
},
{
	"uri": "https://doc.cuates.net/easymacro/es/tools/url/",
	"title": "URL",
	"tags": [],
	"description": "",
	"content": "get Método get.\ndef prueba_get(): url = \u0026#39;https://api.ipify.org\u0026#39; respuesta = app.url.get(url) if respuesta.status_code == 200: mi_ip = respuesta.body.decode() app.debug(f\u0026#39;IP: {mi_ip}\u0026#39;) else: app.debug(respuesta.status_code) return 16/08/2022 22:14:13 - DEBUG - IP: 199.203.174.159 Respuestas en formato json.\ndef prueba_get(): url = \u0026#39;https://api.ipify.org/?format=json\u0026#39; respuesta = app.url.get(url) if respuesta.status_code == 200: datos = respuesta.json() app.debug(f\u0026#39;IP: {datos[\u0026#34;ip\u0026#34;]}\u0026#39;) else: app.debug(respuesta.status_code) return "
},
{
	"uri": "https://doc.cuates.net/easymacro/es/tools/utils/",
	"title": "Utilidades",
	"tags": [],
	"description": "",
	"content": "dict_to_property Convertir diccionarios en PropertyValue\ndatos = { \u0026#39;Hidden\u0026#39;: True, \u0026#39;Password\u0026#39;: \u0026#39;letmein\u0026#39;, } propiedades = app.dict_to_property(datos) app.msgbox(propiedades) data_to_dict Convertir PropertyValue en diccionarios\ndatos = app.data_to_dict(propiedades) app.msgbox(datos) Convertir tuplas a diccionario.\ntupla_de_tuplas = ( (\u0026#39;Hidden\u0026#39;, True), (\u0026#39;Password\u0026#39;, \u0026#39;letmein\u0026#39;), ) datos = app.data_to_dict(tupla_de_tuplas) app.msgbox(datos) Convertir listas a diccionario.\nlista_de_listas = [ [\u0026#39;Hidden\u0026#39;, True], [\u0026#39;Password\u0026#39;, \u0026#39;letmein\u0026#39;], ] datos = app.data_to_dict(lista_de_listas) app.msgbox(datos) sleep Hacer una pausa de X segundos.\napp.sleep(5) render Reemplazar variables en cadenas de texto.\nplantilla = \u0026#34;\u0026#34;\u0026#34;Hola $nombre Te envío este archivo: $archivo Saludos cordiales \u0026#34;\u0026#34;\u0026#34; datos = { \u0026#39;nombre\u0026#39;: \u0026#39;Ingrid Bergman\u0026#39;, \u0026#39;archivo\u0026#39;: \u0026#39;carta_de_amor.odt\u0026#39; } resultado = app.render(plantilla, datos) app.msgbox(resultado) run Ejecutar un programa.\nnombre_aplicacion = \u0026#39;gnome-calculator\u0026#39; app.shell.run(nombre_aplicacion) Ejecutar comandos shell y capturar la salida.\ncomandos = \u0026#39;ls -lh ~\u0026#39; 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.\ncomandos = \u0026#39;ls -lh /home/mau\u0026#39; for line in app.shell.popen(comandos): app.debug(line) digest Obtener hash. Por default se regresa en hexadecimal.\ndatos = \u0026#39;LibreOffice con Python\u0026#39; digest = app.hash.digest(\u0026#39;md5\u0026#39;, datos) app.debug(\u0026#39;MD5 = \u0026#39;, digest) digest = app.hash.digest(\u0026#39;sha1\u0026#39;, datos) app.debug(\u0026#39;SHA1 = \u0026#39;, digest) digest = app.hash.digest(\u0026#39;sha256\u0026#39;, datos) app.debug(\u0026#39;SHA256 = \u0026#39;, digest) digest = app.hash.digest(\u0026#39;sha512\u0026#39;, datos) app.debug(\u0026#39;SHA512 = \u0026#39;, 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.\ndigest = app.hash.digest(\u0026#39;md5\u0026#39;, datos, False) app.debug(\u0026#39;MD5 = \u0026#39;, digest) 16/08/2022 18:48:07 - DEBUG - MD5 = b\u0026#39;8\\x01u\\x9e\\xad \\xab\\xc3\\xce\\r\\x00\\x95(\\x9b\\xdc\\xfd\u0026#39; config Puede guardar datos de configuración de su macro o extensión dentro del perfil de usuario.\nnombre = \u0026#39;mi_extension\u0026#39; datos = { \u0026#39;ruta\u0026#39;: \u0026#39;/home/mau/pruebas\u0026#39;, \u0026#39;guardar\u0026#39;: True, } if app.config.set(nombre, datos): app.debug(\u0026#39;Configuración guardada...\u0026#39;) Y recuperarlos en cualquier momento.\ndatos = app.config.get(nombre) app.debug(datos) color Puede ver los colores que puede usar en Wikipedia Colores Web\ncolor_nombre = \u0026#39;darkblue\u0026#39; color = app.color(color_nombre) app.debug(color) color_rgb = (125, 200, 10) color = app.color(color_rgb) app.debug(color) color_html = \u0026#39;#008080\u0026#39; color = app.color(color_html) app.debug(color) "
},
{
	"uri": "https://doc.cuates.net/easymacro/es/dialog/",
	"title": "Cuadros de diálogo",
	"tags": [],
	"description": "",
	"content": "Trabajar con cuadros de diálogo create Desde archivo 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.\ndef crear_cuadro_de_dialogo(): path = \u0026#39;/home/mau/Desktop/Dialog1.xdl\u0026#39; propiedades = {\u0026#39;Path\u0026#39;: path} dialog = app.dialog.create(propiedades) dialog.open() return Desde mis macros Si el cuadro de diálogo esta en la librería Standard.\ndef crear_cuadro_de_dialogo(): propiedades = { \u0026#39;Location\u0026#39;: \u0026#39;user\u0026#39;, \u0026#39;Name\u0026#39;: \u0026#39;Dialog1\u0026#39;, } dialog = app.dialog.create(propiedades) dialog.open() return Si el cuadro de diálogo esta en otra librería.\ndef crear_cuadro_de_dialogo(): propiedades = { \u0026#39;Location\u0026#39;: \u0026#39;user\u0026#39;, \u0026#39;Library\u0026#39;: \u0026#39;MiAplicacion\u0026#39;, \u0026#39;Name\u0026#39;: \u0026#39;Dialog2\u0026#39;, } dialog = app.dialog.create(propiedades) dialog.open() return Si el cuadro de diálogo esta en el documento activo en la librería Standard.\ndef crear_cuadro_de_dialogo(): propiedades = { \u0026#39;Location\u0026#39;: \u0026#39;document\u0026#39;, \u0026#39;Name\u0026#39;: \u0026#39;miApp\u0026#39;, } dialog = app.dialog.create(propiedades) dialog.open() return Crear dinámicamente Crear un cuadro de diálogo vacío.\ndef crear_cuadro_de_dialogo(): dialog = app.dialog.create() dialog.open() return "
},
{
	"uri": "https://doc.cuates.net/easymacro/es/",
	"title": "",
	"tags": [],
	"description": "",
	"content": "Documentación de easymacro! Software Libre, no software gratis. 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.\nProbablemente, será más feliz si la usa :)\nPuede utilizar easymacro con cualquier extensión o directamente en sus macros.\nAportaciones en Junas (G1)\nA5DdXxCKPw3QKWVdDVs7CzkNugNUW1sHu5zDJFWxCU2h Este proyecto esta en continuo desarrollo.\n"
},
{
	"uri": "https://doc.cuates.net/easymacro/es/categories/",
	"title": "Categories",
	"tags": [],
	"description": "",
	"content": ""
},
{
	"uri": "https://doc.cuates.net/easymacro/es/tags/",
	"title": "Tags",
	"tags": [],
	"description": "",
	"content": ""
}]