You are on page 1of 19

LibreOffice con python para clculos

numricos
Camilo Bernal
10 de abril de 2016

ndice
1. Introduccin

2. Qu es LibreOffice?

3. Qu es GNU/Linux?

4. Qu es Python?

5. Cmo usar python para escribir macros de LibreOffice?

6. Algunos ejemplos explicativos


6.1. Obtener (get) una celda para manipular su valor . . .
6.2. Aplicar una funcin . . . . . . . . . . . . . . . . . . .
6.3. Obtener el factorial de un nmero . . . . . . . . . . .
6.4. Nmeros armnicos . . . . . . . . . . . . . . . . . . .
6.5. Una funcin a trozos . . . . . . . . . . . . . . . . . .
6.6. Estadsticas bsicas . . . . . . . . . . . . . . . . . . .
6.7. Algunas funciones interesantes presentes en el mdulo
6.8. Otros mdulos de python . . . . . . . . . . . . . . . .

6
6
6
6
7
8
9
10
11

. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
math de
. . . . .

. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
python
. . . . .

.
.
.
.
.
.
.
.

7. Conclusiones

12

A. Script de clculos matemticos

14

1.

Introduccin

Aunque LibreOffice Calc brinda la posibilidad de crear algoritmos bsicos para tratar
con problemas de mtodos numricos (muy frecuentes en matemticas e ingeniera),
el lenguaje de Macros (OOoBasic) en ocasiones brinda unas estructuras de datos muy
simples, que obligan a escribir mucho cdigo para realizar tareas que en otros lenguajes
resultaran simples.
Tambin se pueden usar los componentes de UNO (Universal Network Objects, objetos
de red universales) para acceder a las funciones de Calc directamente, pero suele ser
un proceso complejo y desalentador para quienes no tienen (y no les interesa tener)
profundos conocimientos de LibreOffice.
Lo ideal sera tener un lenguaje tan simple como OOoBasic pero que a la vez brinde
mayores posibilidades de expresin sin aumentar la complejidad. Pues bien, esta opcin
existe, y consiste en usar python como lenguaje para programar las macros en LibreOffice
Calc.
Python es un lenguaje de programacin con un conjunto de estructuras de datos mucho
ms amplio y verstil que OOoBasic, pero cuya sintaxis es igual de fcil. Con python se
tiene la posibilidad de usar listas, conjuntos, diccionarios, clases,... dentro de las macros
de LibreOffice, ampliando considerablemente la potencia de estas herramientas. Adems,
se pueden usar los numerosos mdulos estndar, que ahorrarn la escritura de mucho
cdigo en algunos problemas de mtodos numricos.
Aunque su funcionalidad dentro de las macros de LibreOffice puede ser limitada (por
ahora), python puede facilitar enormemente el trabajo de clculos numricos en una hoja
de clculo. La mejor alternativa sera usar python y OOoBasic en conjunto, con lo cual
se obtiene una funcionalidad completa.

2.

Qu es LibreOffice?

LibreOffice es la mejor Suite Ofimtica que el dinero no puede comprar.


Comparada con Microsoft Office, puede realizar el 95 % de las tareas que hace esta, ms
un 100000000 % de funciones que slo se pueden realizar con LibreOffice. La razn de esto
es que LibreOffice es de cdigo abierto, de manera que puedes cambiar la herramienta
como quieras y hasta donde quieras. El nico lmite es la imaginacin. Si adems usas
LibreOffice junto con GNU/Linux, puedes convertir a LibreOffice en el Dios de todas
las herramientas de oficina.
Concretamente, LibreOffice se describe como una suite de productividad moderna, fcil
de usar y de cdigo abierto, para procesar texto, hojas de clculo, presentaciones y ms.
La utilidad de hojas de clculo usada aqu se llama LibreOffice Calc en la versin 4.1.3.2.

3.

Qu es GNU/Linux?

GNU/Linux es el mejor sistema operativo que el dinero no puede comprar.


Comparado con Microsoft Windows, es ms rpido, no tiene virus, es multitarea y multiusuario, no cobra por la licencia, no cobra por actualizaciones, no roba tu informacin
personal para enviarla a servidores remotos,... y ms.
Comparado con Mac OS, es multitarea y multiusuario, no te deja en la ruina econmica,
no te dice qu tipo de persona eres por usarlo (t decides quin eres, por ejemplo una
persona autntica),... y ms, aunque se reconoce la superioridad de Mac OS sobre Microsoft Windows, ambos sistemas te cobran cifras astronmicas por darte mucho menos
de lo que GNU/Linux te dara a precios ridculamente bajos (Ojo: no confundir valor
con precio).
Concretamente, Linux es un sistema operativo: un conjunto de programas que le permiten interactuar con su ordenador y ejecutar otros programas.
Un sistema operativo consiste en varios programas fundamentales que necesita el ordenador para poder comunicar y recibir instrucciones de los usuarios; tales como leer y
escribir datos en el disco duro, cintas, e impresoras; controlar el uso de la memoria; y
ejecutar otros programas. La parte ms importante de un sistema operativo es el ncleo.
En un sistema GNU/Linux, Linux es el ncleo. El resto del sistema consiste en otros
programas, muchos de los cuales fueron escritos por o para el proyecto GNU.

4.

Qu es Python?

Python es un lenguaje de programacin multiparadigma (soporta programacin orientada a objetos, programacin imperativa y programacin funcional). Es un lenguaje
interpretado multiplataforma (se puede usar en Microsoft Windows, GNU/Linux, Unix
y MacOS) y de tipado dinmico.
El intrprete de Python viene pre-instalado en los sistemas tipo Unix (GNU/Linux y
MacOS). Para los que usan Microsoft Windows deben buscarlo en google.

5.

Cmo usar python para escribir macros de


LibreOffice?

Una completa explicacin de los principios conceptuales y tcnicos del uso de python en
LibreOffice puede encontrarse en internet. Sin embargo, el propsito del presente documento es mantener las cosas lo ms simple posible, y por tanto se har una explicacin
del cmo (superficialmente) y se deja al lector la tarea de averiguar el qu y el por qu.
La explicacin que se da aqu funciona para la plataforma GNU/Linux, de modo que es
preciso hacer algunas pequeas modificaciones para que funcione para los usuarios de
Windows y MacOS.
Lo que se necesita esencialmente son cuatro elementos: 1) Una versin de LibreOffice
4.1 o Superior, 2) Una versin del intrprete de python 2.7 o Superior, 3) El paquete
python-uno y 4) El paquete libreoffice-script-provider-python. Estos paquetes se pueden
instalar fcilmente desde el gestor de software o el emulador de terminal.
Una vez instalados, los scripts de python se almacenarn en el directorio /usr/lib/libreoffice/share/Scripts/python (en caso de que no sea as, es preciso revisar la configuracin
particular de libreoffice en su sistema). En este directorio se crearn los subdirectorios de
trabajo que sean necesarios (hay que tener privilegios de administrador para realizar este
tipo de tareas). En nuestro caso se crear el subdirectorio Matematicas, para escribir
los scripts de ejemplo, para empezar se puede crear un fichero llamado Ejemplos.py.
Se recomienda hacer una lectura rpida a la documentacin de python y LibreOffice
para no quedar perdidos en los ejemplos, aunque si estas leyendo esto, seguramente ya
sabes de qu va el asunto.

6.
6.1.

Algunos ejemplos explicativos


Obtener (get) una celda para manipular su valor

La funcin que captura una celda para obtener su valor u otorgarle otro es una de las ms
bsicas y esenciales, pues permitir interactuar con la primera hoja del documento Calc
sobre el que estemos trabajando. En el fichero Ejemplos.py escribiremos esta funcin
de la siguiente manera:
Listing 1: Funcin CP
def CP( columna =0, f i l a =0):
e s c r i t o r i o = XSCRIPTCONTEXT. getDesktop ( )
Objeto = e s c r i t o r i o . getCurrentComponent ( )
Hoja = Objeto . C u r r e n t C o n t r o l l e r . A c t i v e S h e e t
Celda = Hoja . g e t C e l l B y P o s i t i o n ( columna , f i l a )
return Celda

6.2.

Aplicar una funcin

La siguiente funcin se encarga de leer un nmero entero de una celda, asignarlo a la


variable x y retornar el resultado de aplicar f(x) = x^3+x+1
Listing 2: Funcin f
def f ( columna =0, f i l a =0):
x = int (CP( columna , f i l a ) . Value )
F = x^3+x+1
return F

6.3.

Obtener el factorial de un nmero

La funcin lee el nmero entero de una celda y retorna su factorial.

Listing 3: Funcion factorial


def f a c t o r i a l ( columna =0, f i l a =0):
x = int (CP( columna , f i l a ) . Value )
fact = 1
if x > 0:
for i in range ( 1 , x +1):
f a c t = i
return f a c t

6.4.

Nmeros armnicos

1
La funcin escribe unos nmeros, calcula los nmeros armnicos HN = N
n=1 n , y comprueba la veracidad de los anlisis matemticos que establecen que HN ln (N ) +
0,57721 para N grande.

Listing 4: Funcion armonico


def armonico ( ) :
import math
#O b t i e n e l o s d a t o s i n i c i a l e s
d a t o s = [ 1 , 1 0 0 , 1 0 0 0 , 10 00 0 , 1 0 0 0 0 0 0 ]
#O b t i e n e l o s numeros armonicos
armonicos = [ ]
for dato in d a t o s :
nh = 0
for i in range ( 1 , dato +1):
nh += 1/ i
armonicos . append ( nh )
#O b t i e n e l o s d a t o s de comparacion
d_comparacion = [ ]
for dato in d a t o s :
d_comparacion . append ( math . l o g ( dato ) + 0 . 5 7 7 2 1 )
#E s c r i b e l a i n f o r m a c i o n en l a h o j a de c a l c u l o
#E s c r i b i r d a t o s i n i c i a l e s
fila = 0

columna = 0
CP( columna , f i l a ) . S t r i n g = "N"
f i l a += 1
for dato in d a t o s :
CP( columna , f i l a ) . Value = dato
f i l a += 1
#E s c r i b i r numeros armonicos
fila = 0
columna = 1
CP( columna , f i l a ) . S t r i n g = "H_N"
f i l a += 1
for nh in armonicos :
CP( columna , f i l a ) . Value = nh
f i l a += 1
#E s c r i b i r v a l o r de comparacion
fila = 0
columna = 2
CP( columna , f i l a ) . S t r i n g = " Ln (N)+0 ,57721 "
f i l a += 1
for d_c in d_comparacion :
CP( columna , f i l a ) . Value = d_c
f i l a += 1

6.5.

Una funcin a trozos

La funcin recibe unos valores procedentes de dos celdas y calcula la siguiente expresin:

T (a, x) =

a ln (x)

 
a

cos x

si x > 0
+ sin

 
a
x

+ ex

si x < 0
si x = 0

Listing 5: Funcion T
def T( col_a =0, f i l _ a =0, col_x =0, f i l _ x =1):
import math

a = CP( col_a , f i l _ a ) . Value


x = CP( col_x , f i l _ x ) . Value
R e s u l t a d o = None
if x > 0:
R e s u l t a d o = a math . l o g ( x )
elif x < 0:
R e s u l t a d o = math . c o s ( a/x)+math . s i n ( a/x)+math . exp ( x )
else :
Resultado = 0
return R e s u l t a d o

6.6.

Estadsticas bsicas

La funcin genera unos valores de prueba, calcula algunos datos estadsticos bsicos y
luego escribe la informacin en la hoja de clculo.
Listing 6: Funcion estadistica
def e s t a d i s t i c a ( ) :
import random
import math
#Generar 20 v a l o r e s de prueba
valores = [ ]
for i in range ( 2 0 ) :
v a l o r e s . append ( random . uniform ( 0 , 1 0 0 ) )
#E s t a d i s t i c a s b a s i c a s
#Maximo
maximo = max( v a l o r e s )
#Minimo
minimo = min( v a l o r e s )
#Promedio
promedio = sum( v a l o r e s ) / len ( v a l o r e s )
#Varianza
vlr_v = 0
for v a l o r in v a l o r e s :
vlr_v += math .pow( ( v a l o r promedio ) , 2 )

v a r i a n z a = vlr_v / ( len ( v a l o r e s ) 1 )
#D e s v i a c i o n e s t a n d a r
desv_est = math . s q r t ( v a r i a n z a )
#
#ESCRIBIR LA INFORMACION
#
#E s c r i b i r v a l o r e s de prueba
fila = 0
columna = 0
CP( columna , f i l a ) . S t r i n g = " X_i "
f i l a += 1
for dato in v a l o r e s :
CP( columna , f i l a ) . Value = dato
f i l a += 1
#E s c r i b i r e s t a d i s t i c a s b a s i c a s
CP( 2 , 2 ) . S t r i n g = " Maximo : "
CP( 3 , 2 ) . Value = maximo
CP( 2 , 3 ) . S t r i n g = " Minimo : "
CP( 3 , 3 ) . Value = minimo
CP( 2 , 4 ) . S t r i n g = " Promedio : "
CP( 3 , 4 ) . Value = promedio
CP( 2 , 5 ) . S t r i n g = " Varianza : "
CP( 3 , 5 ) . Value = v a r i a n z a
CP( 2 , 6 ) . S t r i n g = " Des . Estandar : "
CP( 3 , 6 ) . Value = desv_est

6.7.

Algunas funciones interesantes presentes en el mdulo math


de python

factorial(x): Devuelve el factorial de x


gamma(x): Devuelve la funcin gamma de x

hypot(x,y): Devuelve la distancia euclidiana ( x2 + y 2 )

10

e: Nmero e (2.718281828459045)
pi: Nmero ( 3.141592653589793)

6.8.

Otros mdulos de python

Algunos mdulos adicionales de python son:


python-simpy: Lenguaje de simulacin de eventos discretos basados en procesos
pytho-glpk: Interfaz para resolver problemas de programacin lineal a gran escala
python-numpy: Herramienta para operar con vectores n-dimensionales
python-sympy: CAS(Computer Algebra System) para python
python-patsy: Libreria para describir modelos estadsticos
Con estos y otros mdulos, puedes convertir a tus macros de LibreOffice en unas herramientas muy potentes y prcticamente ilimitadas.

11

7.

Conclusiones
Es posible escribir macros en LibreOffice con el lenguaje python, de una manera
igual de sencilla y agradable que OOoBasic, pero con toda la potencia y versatilidad
de un lenguaje de programacin profesional.
Las macros escritas en python pueden extender enormemente la capacidad de las
hojas de clculo de LibreOffice.

12

Referencias
[1] Wikipedia: La enciclopedia libre. GNU/Linux.
http://es.wikipedia.org/wiki/GNU/Linux?oldid=78087514. Fecha de acceso: 11 nov
2014.
[2] Wikipedia:
La
enciclopedia
libre.
Software
libre.
http://es.wikipedia.org/wiki/Software_libre?oldid=78063707. Fecha de acceso:
mi 12 nov 2014.
[3] Wikipedia: La enciclopedia libre. Python. http://es.wikipedia.org/w/index.php?oldid=75999492.
Fecha de acceso: vie 15 ago 2014.

13

A.

Script de clculos matemticos

Aqu se anexa el script completo con todos los ejemplos.


Listing 7: Ejemplo - Calculos matematicos
import uno
def CP( columna =0, f i l a =0):
e s c r i t o r i o = XSCRIPTCONTEXT. getDesktop ( )
Objeto = e s c r i t o r i o . getCurrentComponent ( )
Hoja = Objeto . C u r r e n t C o n t r o l l e r . A c t i v e S h e e t
Celda = Hoja . g e t C e l l B y P o s i t i o n ( columna , f i l a )
return Celda
def f ( columna =0, f i l a =0):
x = int (CP( columna , f i l a ) . Value )
F = x^3+x+1
return F
def f a c t o r i a l ( columna =0, f i l a =0):
x = int (CP( columna , f i l a ) . Value )
fact = 1
if x > 0:
for i in range ( 1 , x +1):
f a c t = i
return f a c t
def armonico ( ) :
import math
#O b t i e n e l o s d a t o s i n i c i a l e s
d a t o s = [ 1 , 1 0 0 , 1 0 0 0 , 10 00 0 , 1 0 0 0 0 0 0 ]
#O b t i e n e l o s numeros armonicos
armonicos = [ ]
for dato in d a t o s :
nh = 0
for i in range ( 1 , dato +1):

14

nh += 1/ i
armonicos . append ( nh )
#O b t i e n e l o s d a t o s de comparacion
d_comparacion = [ ]
for dato in d a t o s :
d_comparacion . append ( math . l o g ( dato ) + 0 . 5 7 7 2 1 )
#E s c r i b e l a i n f o r m a c i o n en l a h o j a de c a l c u l o
#E s c r i b i r d a t o s i n i c i a l e s
fila = 0
columna = 0
CP( columna , f i l a ) . S t r i n g = "N"
f i l a += 1
for dato in d a t o s :
CP( columna , f i l a ) . Value = dato
f i l a += 1
#E s c r i b i r numeros armonicos
fila = 0
columna = 1
CP( columna , f i l a ) . S t r i n g = "H_N"
f i l a += 1
for nh in armonicos :
CP( columna , f i l a ) . Value = nh
f i l a += 1
#E s c r i b i r v a l o r de comparacion
fila = 0
columna = 2
CP( columna , f i l a ) . S t r i n g = " Ln (N)+0 ,57721 "
f i l a += 1
for d_c in d_comparacion :
CP( columna , f i l a ) . Value = d_c
f i l a += 1

def T( col_a =0, f i l _ a =0, col_x =0, f i l _ x =1):


import math

15

a = CP( col_a , f i l _ a ) . Value


x = CP( col_x , f i l _ x ) . Value
R e s u l t a d o = None
if x > 0:
R e s u l t a d o = a math . l o g ( x )
elif x < 0:
R e s u l t a d o = math . c o s ( a/x)+math . s i n ( a/x)+math . exp ( x )
else :
Resultado = 0
return R e s u l t a d o
def e s t a d i s t i c a ( ) :
import random
import math
#Generar 20 v a l o r e s de prueba
valores = [ ]
for i in range ( 2 0 ) :
v a l o r e s . append ( random . uniform ( 0 , 1 0 0 ) )
#E s t a d i s t i c a s b a s i c a s
#Maximo
maximo = max( v a l o r e s )
#Minimo
minimo = min( v a l o r e s )
#Promedio
promedio = sum( v a l o r e s ) / len ( v a l o r e s )
#Varianza
vlr_v = 0
for v a l o r in v a l o r e s :
vlr_v += math .pow( ( v a l o r promedio ) , 2 )
v a r i a n z a = vlr_v / ( len ( v a l o r e s ) 1 )
#D e s v i a c i o n e s t a n d a r
desv_est = math . s q r t ( v a r i a n z a )
#
#ESCRIBIR LA INFORMACION
#

16

#E s c r i b i r v a l o r e s de prueba
fila = 0
columna = 0
CP( columna , f i l a ) . S t r i n g = " X_i "
f i l a += 1
for dato in v a l o r e s :
CP( columna , f i l a ) . Value = dato
f i l a += 1
#E s c r i b i r e s t a d i s t i c a s b a s i c a s
CP( 2 , 2 ) . S t r i n g = " Maximo : "
CP( 3 , 2 ) . Value = maximo
CP( 2 , 3 ) . S t r i n g = " Minimo : "
CP( 3 , 3 ) . Value = minimo
CP( 2 , 4 ) . S t r i n g = " Promedio : "
CP( 3 , 4 ) . Value = promedio
CP( 2 , 5 ) . S t r i n g = " Varianza : "
CP( 3 , 5 ) . Value = v a r i a n z a
CP( 2 , 6 ) . S t r i n g = " Des . Estandar : "
CP( 3 , 6 ) . Value = desv_est

g _ e x p o r t e d S c r i p t s = f , f a c t o r i a l , armonico , T, e s t a d i s t i c a ,

17

You might also like