Como importar archivos Excel desde Odoo y recorrerlo con código

24 de junio de 2023 por
Andres Dawidowicz
| Sin comentarios aún
 

Muchas veces las empresas necesitan poder manejar ciertos datos en un Excel, se me ocurren varios casos.

  • Ingresos de Artículos nuevos que le manda un proveedor
  • Manejo de Precios desde una planilla Excel
  • Poner en un Excel artículos que no quiero que se puedan vender 
  • Planillas de bancos
  • Etc.

Ponemos poner en el modelo que lo vamos a utilizar un campo tipo Binary, el cual nos va a permitir guardar la planilla que importamos en la base de datos y poder consultarla y descargarla y me gusta declarar, no es necesario, pero es de gran utilidad, un campo tipo texto para mostrar validaciones. Por ejemplo si estoy importando un Excel con artículos, poner en pantalla en que filas los productos de la planilla son inexistentes.

Definimos los campos de la siguiente manera :

    excel_file      = fields.Binary('Archivo Excel')
errores_archivo = fields.Text('Errores archivo')

En la vista formulario del módulo podemos mostrarlos de la siguiente manera

		​<field name="archivo_excel" widget="binary" attrs="{'readonly': [('state','!=','draft')]}"/>
<field name="errores_archivo" readonly="1" />

En el ejemplo se ven en el formulario el texto de los errores y el archivo con la posibilidad de subirlo y descargarlo desde el formulario, el texto está con el atributo, solo lectura y el archivo Excel solo se puede modificar cuando el estado está en borrador. 

Ejemplo de formulario con los campos para ingresar el archivo Excel y la muestra de errores en estado borrador

Subiendo el archivo y procesándolo podemos ver otro ejemplo a continuación


Vamos a la función que nos va a permitir leer el archivo, ya ingresado en el modelo y poder usar los datos de la planilla para múltiples acciones.

Importamos las librerías para poder manipular el archivo

import base64
import xlrd

    def process_excel_file(self):
self.ensure_one()
if not self.excel_file: ​#Nos aseguramos que el archivo esté subido
raise ValidationError('No hay archivo cargado')
self.errores_archivo = ''
wb = xlrd.open_workbook(file_contents = base64.decodebytes(self.excel_file))
sheet = wb.sheets()[0]
for s in wb.sheets(): ​ #recorre todas las páginas del Excel
for row in range(s.nrows): #recorre las filas
if row <= 2: ​ #salteo las filas de la cabecera
continue ​ #en este caso las 3 primeras porque empieza de la fila cero
for col in range(s.ncols): ​#recorre las columnas
cell_value = s.cell(row,col).value #tomo el valor de la celda y hago lo que corresponda según a que columna pertenece
if col == 0:
orders = cell_value
if col == 1:
positions = cell_value
if col == 18:
product = cell_value
if col == 19:
description = cell_value
if col == 8:
cantidad = cell_value
​ #una vez que tenemos todas las variables podemos hacer lo que necesitemos
​ #en este caso llenar las líneas de una orden de compra
​ product_id = self.env['product.product'].search([('default_code','=',product)],limit=1)
if not product_id:
self.errores_archivo = self.errores_archivo + '\nFalta producto %s'%(product)
continue
vals_line = {
'orders': orders,
'product_id': product_id.id,
'product_qty': cantidad
}
line_id = self.env['purchase.order.line'].create(vals_line)



Para otro post podemos hacer, como importar desde un archivo CSV y como hacer los mismo de Excel y CSV desde XMLRPC.

Andres Dawidowicz 24 de junio de 2023
Compartir
Archivar
Identificarse dejar un comentario