Creando un reporte XLSX con información de Odoo

Gustavo Orrillo
- 20/03/2022 - 1 min. de lectura

Una de las tareas más demandadas de un administrador de Odoo es generar reportes de Excel con la información de Odoo. Odoo brinda algunas herramientas que ayudan bastante al usuario final, pero la verdad es que muchas veces uno necesita generar reportes adhoc para los usuarios. Y dichos reportes no pueden ser generados por Odoo debido a muchas razones: falta de tiempo de los programadores, imposibilidad en Odoo de generar reportes con la estructura libre que Excel genera, etc.
Como puede uno siendo administrador generar reportes de Excel? Una opción es utilizando la librería de Python xlsxwriter. Esta librería permite con scripts de Python crear archivos de Excel. Es una librería muy poderosa en términos de procesamiento, formato. Y es muy sencilla de usar, por ejemplo para hacer un "Hola mundo" en Excel uno solo debe:

#!/usr/bin/python3
import xlsxwriter
# Creamos workbook y agregamos pagina
workbook = xlsxwriter.Workbook('/home/gustavo/hola_mundo.xlsx'
worksheet = workbook.add_worksheet(
# Agregamos el contenido de la celd
worksheet.write('A1','Hola mundo'
workbook.close()

Como pueden ver es bastante sencillo. Ahora, como unimos los mundos de Excel con Odoo? Una posibilidad es usando xmlrpc para leer información de Odoo. Veamoslo con un ejemplo, supongamos que queremos hacer un archivo Excel de los clientes, y que queremos listar el código del cliente, su nombre, telefono e e-mail. Para ello tenemos que hacer un script como el que se lista a continuación:

#!/usr/bin/python3
import sys
import xmlrpc.client as client
import ssl
import xlsxwriter
username = 'admin' #the user
pwd = 'admin' #the password
dbname = 'mydb'    #the database
gcontext = ssl._create_unverified_context()
# Get the uid
sock_common = client.ServerProxy ('http://odoo14:6069/xmlrpc/common',context=gcontext)
uid = sock_common.login(dbname, username, pwd)
#replace localhost with the address of the server
sock = client.ServerProxy('http://odoo14:6069/xmlrpc/object',context=gcontext)
# Obtenemos los ids de los partners que son clientes
partner_ids = sock.execute(dbname,uid,pwd,'res.partner','search',[('customer_rank','>',0)])
# Creamos workbook y agregamos pagina
workbook = xlsxwriter.Workbook('/home/gustavo/clientes.xlsx')
worksheet = workbook.add_worksheet()
# Agregamos cabeceras de la tabla
worksheet.write('A1','Codigo')
worksheet.write('B1','Cliente') worksheet.write('C1','Telefono')
worksheet.write('D1','e-mail')
# Procesamos los clientes y seteamos la fila original en 2
row = 2
for partner_id in partner_ids:
        # leemos el partner
        partner_data = sock.execute(dbname,uid,pwd,'res.partner','read',partner_id)
        partner_data = partner_data[0]
        # ipmrimimos la linea con las tres columnas que necesitamos: codigo, nombre, e-mail
        worksheet.write('A' + str(row), partner_data['ref'])
        worksheet.write('B' + str(row), partner_data['name'])         worksheet.write('C' + str(row), partner_data['phone'])
        worksheet.write('D' + str(row), partner_data['email'])
        # aumentamos el nro de fila
        row = row + 1
workbook.close()

Acerca de:

Gustavo Orrillo

Passionate about programming, he has implemented Odoo for different types of businesses since 2010. In Moldeo Interactive he is a founding Partner and Programmer; In addition to writing on the Blog about different topics related to the developments he makes.