🎁 Por qué generar documentos mediante programación
El cliente no abre un .md. Abre un .docx, un .pptx, una hoja de cálculo .xlsx o uno .pdf. Generar mediante código significa obtener resultados con formato, repetibles y con tu marca: eso es exactamente lo que hace que el paquete parezca una consultoría de primer nivel y no un borrador de chat.
La base es sencilla: un entorno virtual con las cuatro bibliotecas instaladas. Claude Code se encarga de esto una vez; después solo tienes que generar.
// configuración: venv + las 4 bibliotecas
python3 -m venv venv source venv/bin/activate pip install python-docx reportlab openpyxl python-pptx
✗ Markdown sin formato
- ✗El cliente ve texto de chat, no un entregable
- ✗Sin marca, sin tabla con formato, sin fórmula
- ✗No se abre directamente en Word/PowerPoint/Excel
✓ Documento generado
- ✓Formateado, con tu identidad visual
- ✓Repetible: mismo código, nuevo cliente
- ✓Se abre directamente: parece una consultoría de primer nivel
💡 Consejo práctico
No escribes este código a mano. Pídele a Claude Code «crea el venv e instala las 4 libs de documentos»; lo ejecuta, resuelve los conflictos con el Python del sistema y te deja todo listo para generar. Tu función es dirigir el formato de salida, no memorizar la API.
marca + estilo
1 código, N clientes
docx/pptx/xlsx/pdf
lo que abre el cliente
📘 python-docx — informes de Word
Esta es la biblioteca de informes. Creas un Document(), apila headings (nivel 0 = título, 1-9 = secciones), párrafos, tablas y runs con formato (negrita, color). Al final, doc.save(). Es lo que genera el Informe final y el SOW de la Fábrica.
// python-docx: título, sección, tabla y run con formato
from docx import Document
from docx.shared import Pt, RGBColor
doc = Document()
doc.add_heading('Relatório de Estratégia de IA', level=0)
doc.add_heading('Sumário Executivo', level=1)
doc.add_paragraph('Texto do relatório aqui.')
table = doc.add_table(rows=4, cols=3)
table.style = 'Table Grid'
p = doc.add_paragraph()
run = p.add_run('Destaque')
run.bold = True
run.font.color.rgb = RGBColor(0x00, 0x00, 0xFF)
doc.save('relatorio.docx')
Fíjate en tres cosas: el level controla la jerarquía, table.style = 'Table Grid' define los límites, y el run es la unidad mínima donde aplicas negrita y color. Esa misma estructura se convierte en el Informe final y el documento de propuesta (SOW).
💡 Nota
Los estilos prediseñados ahorran trabajo: 'List Bullet' e 'List Number' para listas, 'Heading 1' / 'Heading 2' para secciones. Describes la estructura del informe; Claude Code elige los estilos.
crea el documento
nivel 0–9
Table Grid
Informe + SOW
📙 python-pptx — presentaciones (RGBColor, diseños)
La biblioteca de presentaciones. Creas una Presentation(), agrega diapositivas eligiendo un diseño (1 = más alta) y una bandera cuadros de texto con bullets y colores mediante RGBColor. Es lo que genera el deck ejecutivo, el material que cierra la venta en la Ruta 5.
// python-pptx: diapositiva en blanco con título centrado
from pptx import Presentation
from pptx.util import Inches, Pt
from pptx.dml.color import RGBColor # NÃO RgbColor
from pptx.enum.text import PP_ALIGN
prs = Presentation()
slide = prs.slides.add_slide(prs.slide_layouts[6]) # branco
box = slide.shapes.add_textbox(Inches(0.5), Inches(2), Inches(9), Inches(1.5))
p = box.text_frame.paragraphs[0]
p.text = "Estratégia de IA"
p.font.size = Pt(44)
p.font.bold = True
p.font.color.rgb = RGBColor(31, 78, 121) # azul escuro
p.alignment = PP_ALIGN.CENTER
prs.save('deck.pptx')
El diseño 6 (Blank) es el más usado porque te da control total: posicionas cada caja en pulgadas. El primer párrafo ya existe en paragraphs[0]; para los siguientes bullets usa add_paragraph().
💡 La trampa que bloquea a todos
É RGBColor (RGB en mayúsculas), no RgbColor. Si escribes mal las mayúsculas y minúsculas, se genera un ImportError que parece misterioso. El color se expresa con números enteros RGB: RGBColor(31, 78, 121) = azul oscuro profesional.
crea el deck
blanco, flexible
no RgbColor
deck ejecutivo
📊 openpyxl — Excel con convención de colores
La biblioteca de hojas de cálculo, donde está la calculadora de ROI. Tres reglas de oro: indexación 1-based (A1 = fila 1, columna 1), fórmulas en vez de valores fijos, y la convención de colores financiera. Quien entrega Excel sin fórmulas entrega una captura, no un modelo.
// openpyxl: fórmula + colores de entrada/fórmula
from openpyxl import Workbook
from openpyxl.styles import Font, PatternFill
wb = Workbook(); ws = wb.active
ws.title = "ROI"
ws['A1'] = 'Premissa' # 1-based: A1
ws['B5'] = '=SUM(B1:B4)' # fórmula, nunca valor fixo
input_font = Font(color='0000FF') # azul = input do usuário
formula_font = Font(color='000000') # preto = fórmula
ws['B1'].font = input_font
ws['B5'].font = formula_font
wb.save('roi.xlsx')
La convención de colores que aparece abajo es el estándar de modelado financiero: cualquier analista que abra la hoja de cálculo entiende enseguida qué es un dato de entrada, qué es un cálculo y qué viene de afuera. Aplícala siempre en la calculadora de ROI:
🎨 Convención de colores (obligatoria)
- Azul
0000FF— entradas del usuario (supuestos ajustables) - Negro
000000— fórmulas y cálculos - Verde
008000— enlaces entre pestañas (otras worksheets) - Rojo
FF0000— referencias a archivos externos - Amarillo (fondo)
FFFF00— premisas clave destacadas
💡 Consejo práctico
Nunca calcules en Python y pegues el número. Coloca las premisas en celdas propias (azul) y haz referencia a ellas con fórmulas (negro). Así, el cliente cambia una premisa y toda la hoja de cálculo se recalcula: eso es lo que distingue un modelo de un informe muerto.
crea la hoja de cálculo
A1 = (1,1)
nunca un valor fijo
calculadora de ROI
📕 reportlab — PDF (Platypus)
La biblioteca de archivos PDF. El método recomendado es Platypus: tú montas una story (lista de elementos — párrafos, espaciadores, tablas) y llama doc.build(story) al final. El PDF solo existe después del build.
// reportlab: arma la story y la construye al final
from reportlab.lib.pagesizes import letter
from reportlab.lib.styles import getSampleStyleSheet
from reportlab.platypus import SimpleDocTemplate, Paragraph, Spacer
from reportlab.lib.units import inch
doc = SimpleDocTemplate('saida.pdf', pagesize=letter)
styles = getSampleStyleSheet()
story = []
story.append(Paragraph('Estratégia de IA', styles['Heading1']))
story.append(Spacer(1, 0.5 * inch))
story.append(Paragraph('Corpo do documento.', styles['Normal']))
doc.build(story) # constrói no fim
💡 Consejo práctico
O build viene en el FIN. Todo lo que quieras incluir en el PDF debe estar en la story antes de llamar doc.build(). ¿Olvidaste agregar algo con append? No aparece en el archivo.
Fíjate en que el patrón es siempre el mismo en las cuatro libs — y se puede dibujar el flujo de la skill gerar-entregavel como cuatro pasos lineales:
Markdown de entrada
La skill recibe el entregable en Markdown y el formato de destino deseado.
Elegir el formato
docx / pptx / xlsx / pdf → selecciona la biblioteca adecuada.
Preparar los elementos
Encabezados, tablas, fórmulas, colores: según la convención de cada formato.
Guardar el archivo
.save() en las tres; .build(story) en el PDF. Va a la carpeta del cliente.
historia de elementos
apílalo en la story
al final, siempre
PDF del cliente
📦 Empaquetar como skill gerar-entregavel
No quieres recordar cuatro APIs cada vez. Envuelve las cuatro bibliotecas en una sola skill: "dado un Markdown, genera el .docx/.pptx/.xlsx/.pdf". La skill aporta el conocimiento; tú solo indicas el formato. Es el motor de salida de la Fábrica.
// SKILL.md — gerar-entregavel
--- name: gerar-entregavel description: Use para transformar um entregável em Markdown num arquivo final — .docx, .pptx, .xlsx ou .pdf — usando python-docx, python-pptx, openpyxl ou reportlab. --- # Gerar Entregável ## Passos 1. Ler o Markdown e o formato-alvo. 2. Escolher a biblioteca (docx / pptx / xlsx / pdf). 3. Montar o documento (headings, tabelas, cores). 4. Salvar na pasta de saída do cliente.
A description bien escrita es lo que hace que Claude Code activar la skill en el momento adecuado. Los pasos son el guion que sigue. De aquí en adelante, "convierte este diagnóstico en PowerPoint" es un comando — no un proyecto.
✓ Buena skill de docs
- ✓Elige el formato adecuado para el entregable
- ✓Usa fórmulas en Excel, con convención de colores
- ✓Importa
RGBColorcorrecto en el pptx
✗ Errores comunes
- ✗Entrega Markdown sin procesar, sin generar archivos
- ✗Valores fijos en Excel en lugar de fórmulas
- ✗Escribe
RgbColory rompe la importación
4 bibliotecas
se activa al instante
guion fijo
motor de salida
✅ Resumen del módulo
🎯 Misión 3.3 — Markdown se convierte en paquete
Transforma un único Markdown en dos archivos para el cliente:
- Obtener 1 entregable en Markdown (p. ej., un minidiagnóstico de la 3.2).
- Generar 1
.docxcon python-docx. - Generar 1
.pptxcon python-pptx (cuidado: RGBColor). - Envolver en la skill gerar-entregavel.
Éxito: 1 .docx + 1 .pptx generados a partir del mismo Markdown. Lo que obtuviste: el motor de salida de la Fábrica: cualquier prompt se convierte en un archivo para el cliente.
Siguiente módulo:
3.4 — Construye tu subagente (investigador y redactor)