Lo que medimos: tres imágenes, cuatro modelos

Creamos una factura ficticia (Taller Norte S.L., número F-2026-0187, base 1.240,50 €, IVA del 21 % 260,51 €, total 1.501,01 €, tres líneas de 540,00 €, 420,50 € y 280,00 €) en tres versiones: limpia, escaneada (girada 2,2°, con ruido y JPEG de baja calidad) y una foto mala de 428 × 578 píxeles, desenfocada, girada y con sombra. Cuatro modelos tenían que devolver 9 campos en JSON, y un script los comparaba con la factura real.

Con la imagen limpia, los cuatro leyeron los 9 campos. Con la escaneada, Claude Sonnet 5.5, gemma4:12b y qwen3.5:9b sacaron 9/9; Claude Haiku 5.5, 8/9, porque marcó el NIF como ILEGIBLE (correcto: es lo que se le pidió si dudaba). Con la foto mala llegó el problema: Sonnet 8/9 (puso el número como ILEGIBLE), Haiku 7/9, qwen3.5:9b 8/9 y gemma4:12b 1/9.

Por qué comprobar las sumas no basta

Haiku y qwen3.5:9b devolvieron un número de factura plausible y equivocado: 0167 en lugar de 0187. Todo lo demás cuadraba, así que ninguna suma lo habría detectado. Solo lo caza cruzar el número con algo externo: tu registro de proveedores, el pedido o el apunte del banco.

gemma4:12b fue más lejos: con la foto mala se inventó otra factura (número «P-2020001», otro cliente, otro concepto), con base 1.000,00 €, IVA 210,00 € y total 1.210,00 €. Base + IVA = total: cuadra. No marcó ningún campo como ILEGIBLE; añadió fuera del JSON una nota sobre «inconsistencias visuales» que un proceso automático que solo lea el JSON no verá. Lo que sí la delata: sus líneas sumaban 1.000 + 1.200 + 600 = 2.800 €, no la base de 1.000 €.

Moraleja: las comprobaciones aritméticas cazan los descuadres, pero las lecturas inventadas que cuadran solo caen con comprobaciones cruzadas entre partes de la misma factura (líneas frente a base) y contra datos que la IA no ha generado.

Paso 1: un encargo que deje sitio a la duda

Pide un JSON por factura con los campos que vas a validar, las líneas por separado y el valor ILEGIBLE cuando no esté seguro. Pide los importes como número sin separador de miles (1240.50), no como texto: al pegarlos en Excel, comprueba que salen alineados a la derecha, que es como Excel muestra los números; si salen a la izquierda son texto y las fórmulas fallarán.

Pedir «ILEGIBLE si no estás seguro» funcionó a medias en nuestra prueba: Haiku lo usó con el NIF y con la fecha, pero no con el número que leyó mal. Es una red, no una garantía.

Campos que pedimos (uno por factura)
  1. numero, fecha, nif_emisor, cliente, base, iva_pct, iva, total
  2. lineas: [{concepto, unidades, precio, importe}]
  3. Si un campo no se lee con seguridad, su valor es "ILEGIBLE". No completes nada por deducción.

Campos del script ocr_lab.py del laboratorio (04/11/2026); la redacción de la regla es una propuesta.

Paso 2: la hoja, en tres pestañas

Monta un libro con tres hojas. Las fórmulas del paso siguiente usan exactamente estas columnas; si cambias el orden, cambia las letras.

  • Facturas (una fila por factura, desde la fila 2): A archivo, B número, C fecha, D NIF del emisor, E proveedor, F base, G % de IVA (21, no 0,21), H IVA, I total.
  • Lineas (una fila por línea): A número de factura, B concepto, C unidades, D precio, E importe.
  • Proveedores (tu registro, no lo que lea la IA): A NIF, B nombre, C último número de factura recibido.

Paso 3: seis comprobaciones con fórmulas de Excel

Escríbelas en la fila 2 de la hoja Facturas, de la columna J a la P, y arrástralas hacia abajo. Están en Excel en español, con punto y coma como separador y coma decimal. La tolerancia de 0,01 absorbe redondeos de céntimo; IVA se compara con REDONDEAR a 2 decimales porque 1.240,50 × 21 % da 260,505 y la factura pone 260,51.

Hoja Facturas, fila 2
  1. J · Total = base + IVA: =SI(ABS(F2+H2-I2)<=0,01;"OK";"REVISAR")
  2. K · IVA = base × %: =SI(ABS(REDONDEAR(F2*G2/100;2)-H2)<=0,01;"OK";"REVISAR")
  3. L · Líneas suman la base: =SI(ABS(SUMAR.SI(Lineas!A:A;B2;Lineas!E:E)-F2)<=0,01;"OK";"REVISAR")
  4. M · Ningún campo ILEGIBLE: =SI(CONTAR.SI(B2:I2;"ILEGIBLE")=0;"OK";"REVISAR")
  5. N · Sin duplicados: =SI(CONTAR.SI.CONJUNTO(D:D;D2;B:B;B2)=1;"OK";"DUPLICADA")
  6. O · Proveedor conocido: =SI(CONTAR.SI(Proveedores!A:A;D2)>0;"OK";"NIF DESCONOCIDO")
  7. P · Veredicto: =SI(CONTAR.SI(J2:O2;"OK")=6;"APROBABLE";"REVISAR A MANO")
  8. En la hoja Lineas, columna F · unidades × precio: =SI(ABS(C2*D2-E2)<=0,01;"OK";"REVISAR")

Fórmulas propuestas a partir de las validaciones del experimento E-03; sintaxis según la documentación de Microsoft. No las ejecutamos sobre un Excel real en el laboratorio: pruébalas con la factura trampa del paso 4.

El número de factura: la comprobación que habría cazado el 0167

Ninguna de las seis fórmulas detecta un 0167 que debería ser 0187 si el resto cuadra. Para eso necesitas una referencia externa. La más directa es el último número que recibiste de ese proveedor: el reglamento de facturación obliga a que la numeración sea correlativa dentro de cada serie, así que una factura nueva no debería llevar un número inferior al anterior. No exijas «anterior + 1»: tu proveedor también factura a otros clientes.

Si la IA lee un número más bajo que el último registrado, o con otro formato, la fila va a revisión. Mejor todavía es cruzarlo con el pedido o el albarán, si los tienes: ahí el número no lo ha leído ningún modelo.

Columna Q de la hoja Facturas
  1. Q · Número posterior al último registrado: =SI(VALOR(DERECHA(B2;4))>VALOR(DERECHA(BUSCARX(D2;Proveedores!A:A;Proveedores!C:C;"0");4));"OK";"REVISAR")
  2. Supone números con los 4 últimos caracteres numéricos, como F-2026-0187; adapta DERECHA al formato de cada proveedor.

Propuesta, no ejecutada en el laboratorio. BUSCARX no existe en Excel 2016 ni 2019: ahí usa BUSCARV.

Qué habría cazado cada comprobación en nuestra prueba

  • Factura inventada por gemma4:12b: total e IVA dicen OK (cuadra), pero «Líneas suman la base» dice REVISAR (2.800 frente a 1.000), y el número P-2020001 no encaja con el registro.
  • Número 0167 de Haiku y qwen3.5:9b: solo la columna Q o el cruce con el pedido.
  • Número ILEGIBLE de Sonnet: la columna M lo manda a revisión, que es lo que debe pasar.
  • Descuadres reales: en otra parte del laboratorio, los tres modelos locales dejaron pasar una factura de 50 + 10 que decía 61. La columna J la marca sin pensar.

Paso 4: prueba la hoja con una factura trampa

Antes de usarla con facturas reales, mete a mano tres filas falsas: una que no cuadre (100 + 21 con total 120), una repetida y una con un NIF que no esté en Proveedores. Si alguna sale APROBABLE, la fórmula está mal escrita. El corrector también es software: el nuestro dio por fallidas respuestas correctas hasta que lo revisamos tres veces leyendo a mano lo que marcaba.

Casos raros

  • Varios tipos de IVA en la misma factura: la columna K solo vale con un tipo. Pide el IVA por línea y comprueba cada una.
  • Retención de IRPF: el total es base + IVA − retención. Añade la columna y cambia la fórmula J.
  • Redondeo por línea: algunos programas redondean cada línea y otros el total; si ves diferencias de 1 o 2 céntimos repetidas, sube la tolerancia a 0,02 en vez de aprobar a ojo.
  • Foto mala: repetirla sale más barato que revisarla. En nuestra prueba, la versión escaneada se leyó bien con los modelos locales (9/9 con gemma4:12b y con qwen3.5:9b).

Preguntas frecuentes

¿Hay OCR de facturas a Excel gratis? Sí: un modelo local con visión en Ollama, como gemma4:12b o qwen3.5:9b, lee facturas sin pagar por página y sin enviarlas fuera. Con imágenes decentes acertaron 9 de 9 campos; con la foto mala, uno se inventó la factura. Gratis no te ahorra la validación.

¿Qué IA es mejor para leer facturas? En nuestra foto mala, la que mejor se portó fue la que dijo ILEGIBLE en lugar de adivinar (Claude Sonnet 5.5). Elige por cómo falla, no por cuántos campos acierta con imágenes limpias.

¿Puedo extraer datos de facturas en PDF con Python? Sí; nuestro script del laboratorio lo hace con imágenes y compara campo a campo. Las comprobaciones de este artículo se traducen a Python en pocas líneas, pero en Excel las ve cualquiera que revise la hoja.

¿Puede la IA contabilizar las facturas? Puede preparar la fila. Quién aprueba y contabiliza debe ser una persona, con las filas en REVISAR resueltas antes.