Manipulación de Excel y PDF

 Trabajaremos con dos librerías muy usadas:

  • Excel → openpyxl (para archivos .xlsx)

  • PDF → PyPDF2 (para leer, extraer texto y combinar PDFs)

1. Manipulación de Excel con openpyxl

Crear un archivo Excel

from openpyxl import Workbook

wb = Workbook()
hoja = wb.active
hoja.title = "Inventario"

hoja["A1"] = "Producto"
hoja["B1"] = "Precio"

hoja.append(["Teclado", 20])
hoja.append(["Ratón", 15])

wb.save("inventario.xlsx")

Leer un archivo Excel

from openpyxl import load_workbook

wb = load_workbook("inventario.xlsx")
hoja = wb.active

for fila in hoja.iter_rows(values_only=True):
    print(fila)

Modificar celdas

hoja["B2"] = 25
wb.save("inventario.xlsx")

Estilos básicos

from openpyxl.styles import Font

hoja["A1"].font = Font(bold=True)
hoja["B1"].font = Font(bold=True)
wb.save("inventario.xlsx")

2. Manipulación de PDF con PyPDF2

Leer texto de un PDF

import PyPDF2

with open("documento.pdf", "rb") as f:
    lector = PyPDF2.PdfReader(f)
    pagina = lector.pages[0]
    print(pagina.extract_text())

Combinar varios PDFs

import PyPDF2

fusion = PyPDF2.PdfMerger()

fusion.append("parte1.pdf")
fusion.append("parte2.pdf")
fusion.append("parte3.pdf")

fusion.write("documento_final.pdf")
fusion.close()

Extraer páginas concretas

import PyPDF2

with open("documento.pdf", "rb") as f:
    lector = PyPDF2.PdfReader(f)
    escritor = PyPDF2.PdfWriter()

    escritor.add_page(lector.pages[2])  # página 3

    with open("pagina3.pdf", "wb") as salida:
        escritor.write(salida)

ACTIVIDAD PRÁCTICA: “Generador de informe PDF desde Excel”

Objetivo: que tus alumnos combinen Excel y PDF para crear un flujo de trabajo profesional.

Enunciado

Crea un programa que:

  1. Lea un archivo Excel con una lista de productos:

    • Nombre

    • Precio

    • Stock

  2. Calcule el valor total del inventario.

  3. Genere un PDF con:

    • Fecha del informe

    • Tabla de productos

    • Valor total del inventario

Pistas

  • Usa openpyxl para leer Excel

  • Usa reportlab para generar el PDF (librería muy usada)

  • Usa datetime para la fecha

  • Crea una tabla simple en el PDF

Solución propuesta (completa)

from openpyxl import load_workbook
from reportlab.lib.pagesizes import A4
from reportlab.pdfgen import canvas
from datetime import datetime

# 1. Leer Excel
wb = load_workbook("inventario.xlsx")
hoja = wb.active

productos = []
for fila in hoja.iter_rows(min_row=2, values_only=True):
    productos.append(fila)

# 2. Calcular valor total
total = sum(precio * stock for _, precio, stock in productos)

# 3. Crear PDF
c = canvas.Canvas("informe.pdf", pagesize=A4)
c.setFont("Helvetica", 12)

# Fecha
c.drawString(50, 800, f"Informe de Inventario - {datetime.now().strftime('%d/%m/%Y')}")

# Tabla
y = 760
c.drawString(50, y, "Producto")
c.drawString(200, y, "Precio")
c.drawString(300, y, "Stock")
c.drawString(400, y, "Valor")

y -= 20

for nombre, precio, stock in productos:
    c.drawString(50, y, str(nombre))
    c.drawString(200, y, f"{precio} €")
    c.drawString(300, y, str(stock))
    c.drawString(400, y, f"{precio * stock} €")
    y -= 20

# Total
c.drawString(50, y - 20, f"Valor total del inventario: {total} €")

c.save()

Ejemplo de salida (PDF generado)

  • Fecha del informe

  • Tabla con productos

  • Valor total del inventario