LibreOffice BASIC frente a PYTHON para LibreOffice
¿Qué lenguaje es mejor para programar las macros de LibreOffice, BASIC o PYTHON?
La respuesta, de acuerdo con mi experiencia personal y laboral, es … Depende.
Por un lado BASIC dispone de un IDE (Integrated Development Environment), entorno de desarrollo integrado en LibreOffice mientras que PYTHON no, por lo que tenemos que ayudarnos de un editor externo (personalmente utilizo Notepad++, para gustos colores como decimos en España). Además, si queremos que nuestra macro en Python vaya con el archivo Calc correspondiente debemos usar la extensión APSO - Alternative Script Organizer for Python si no queremos complicarnos la vida en exceso. En la Ayuda con las macros en Python en LibreOffice encontraremos mucha información sobre cómo usar Python en LibreOffice.
He trabajado con archivos de texto de más de 100.000 líneas con 500 caracteres por línea. Y Basic no es rival para Python. Mientras que el primero tardaba desesperantes minutos, Python lo resolvía en muy pocos segundos.
Pero, por otro lado, programar en Basic es menos “complicado”. Por eso la respuesta de “depende”.
He programado una misma macro en Basic y en Python para poder mostrar los resultados. He utilizado la biblioteca ScriptForge tanto en uno como en otro. La macro lee un archivo de texto plano (TXT - UTF-8) de 20.000 líneas y si los primeros 15 caracteres de cada línea coinciden con el patrón “expr_regular” entonces suma dos cantidades en las columnas 32 y 108 previamente convertidas a números (recordad que en Python se comienza por 0, 33 y 109 en Basic).
En la Imagen 1 vemos el resultado de Basic.
![]() |
| Imagen 1: Tiempo empleado (BASIC) |
Basic ha ido a una velocidad de 383 líneas por segundo.
En la Imagen 2 vemos el resultado de Python.
![]() |
| Imagen 2: Tiempo empleado (PYTHON) |
Por el contrario, la velocidad de Python ha sido de 303.030 líneas por segundo. 792 veces más rápido Python que Basic en el tratamiento de archivos TXT.
Macro en Basic:
' Esta macro lee un archivo TXT de 20.000 líneas y si los primeros
' 15 caracteres de cada línea coinciden con el patrón expr_regular
' entonces suma dos cantidades en las columnas 33 y 109 (recordad que
' se comienza por 1) previamente convertidas a números.
' Constantes para MsgBox
Const ICONO_STOP As Integer = 16
Const ICONO_INTERROGACION As Integer = 32
Const ICONO_EXCLAMACION As Integer = 48
Const ICONO_INFORMACION As Integer = 64
Const BOTON_ACEPTAR As Integer = 0
Dim sv_fso As Object
Dim archivo As Object
Dim sv_time As Object
Dim linea As String
Dim contador As Long
Dim linea_encontrada As Long
Dim suma(1) As Double
Dim expr_regular As String
Dim mensaje As String
Dim pos_ini As Integer
Dim largo_expr_regular As Integer
Dim resultado As String
GlobalScope.BasicLibraries.loadLibrary("ScriptForge")
End If
' Automáticamente se crea el objeto SF_String mediante el cual
' se puede llamar a todos los métodos del servicio String.
' Se cargan los servicios necesarios de la biblioteca ScriptForge.
sv_fso = CreateScriptService("FileSystem")
sv_time = CreateScriptService("Timer", True)
pos_ini = 1
largo_expr_regular = 15
contador = 0
linea_encontrada = 0
suma(0) = 0.00
suma(1) = 0.00
sv_time.Start()
Set archivo = sv_fso.OpenTextFile("D:\ARCHIVO_DE_PRUEBAS.TXT", sv_fso.ForReading, False, "UTF-8")
Do While Not archivo.AtEndOfStream
contador = contador + 1
linea = archivo.ReadLine()
resultado = SF_String.FindRegex(Mid(linea, pos_ini, largo_expr_regular), expr_regular)
If resultado <> "" Then
linea_encontrada = linea_encontrada + 1
suma(0) = suma(0) + Val(Replace(Replace(Trim(Mid(linea, 33, 18)), ".", ""), ",", "."))
suma(1) = suma(1) + Val(Replace(Replace(Trim(Mid(linea, 109, 18)), ".", ""), ",", "."))
End If
Loop
archivo.CloseFile()
sv_time.Terminate()
' Se para el tiempo.
SF_String.sfNEWLINE & SF_String.sfNEWLINE & "suma(0) = " & Format(suma(0), "#,##0.00") & _
SF_String.sfNEWLINE & "suma(1) = " & Format(suma(1), "#,##0.00") & _
SF_String.sfNEWLINE & SF_String.sfNEWLINE & _
"Tiempo: " & Format(sv_time.Duration, "0.000") & " segundos" & _
SF_String.sfNEWLINE & SF_String.sfNEWLINE & _
"Líneas leídas (según el contador del bucle): " & Format(contador, "#,##0") & " "
MsgBox mensaje, ICONO_INFORMACION + BOTON_ACEPTAR, "¡ATENCIÓN! ** LibreOffice BASIC **"
Set sv_time = sv_time.Dispose()
Set archivo = archivo.Dispose()
Set sv_fso = sv_fso.Dispose()
End Sub
' Fin Main
Macro en Python:
Así que, dependiendo de la necesidad, obviamente, emplead BASIC o PYTHON según vuestro criterio.
Como siempre, muchas gracias por vuestra atención y saludos cordiales.
LibreOffice Community versión 25.8.4 (X86_64 es-ES) Windows 11.


Comentarios
Publicar un comentario