office_translator/create_complex_samples.py

888 lines
32 KiB
Python

"""
Script pour créer des fichiers exemples avec structure TRÈS COMPLEXE
Génère des fichiers Excel, Word et PowerPoint avec formatage avancé
"""
from pathlib import Path
from openpyxl import Workbook
from openpyxl.styles import Font, PatternFill, Alignment, Border, Side, Protection
from openpyxl.styles.numbers import FORMAT_CURRENCY_USD, FORMAT_PERCENTAGE
from openpyxl.chart import BarChart, PieChart, LineChart, Reference
from openpyxl.drawing.image import Image as XLImage
from openpyxl.utils import get_column_letter
from openpyxl.worksheet.datavalidation import DataValidation
from docx import Document
from docx.shared import Inches, Pt, RGBColor, Cm
from docx.enum.text import WD_ALIGN_PARAGRAPH, WD_LINE_SPACING
from docx.enum.style import WD_STYLE_TYPE
from docx.oxml.ns import qn
from docx.oxml import OxmlElement
from pptx import Presentation
from pptx.util import Inches as PptxInches, Pt as PptxPt
from pptx.enum.text import PP_ALIGN, MSO_ANCHOR
from pptx.dml.color import RGBColor as PptxRGBColor
from pptx.enum.shapes import MSO_SHAPE
from PIL import Image, ImageDraw, ImageFont
import matplotlib.pyplot as plt
import numpy as np
print("🚀 Création de fichiers exemples avec structure COMPLEXE...\n")
# Créer le dossier
SAMPLE_DIR = Path("sample_files")
SAMPLE_DIR.mkdir(exist_ok=True)
# ============================================================================
# 1. EXCEL TRÈS COMPLEXE
# ============================================================================
print("📊 Création d'Excel super complexe...")
wb = Workbook()
# === SHEET 1: RAPPORT FINANCIER COMPLEXE ===
ws1 = wb.active
ws1.title = "Rapport Financier 2024"
# Titre principal avec fusion massive
ws1.merge_cells('A1:H2')
title = ws1['A1']
title.value = "RAPPORT FINANCIER ANNUEL 2024\nAnalyse Complète et Prévisions"
title.font = Font(name='Calibri', size=20, bold=True, color='FFFFFF')
title.fill = PatternFill(start_color='0066CC', end_color='0066CC', fill_type='solid')
title.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True)
title.border = Border(
left=Side(style='thick', color='000000'),
right=Side(style='thick', color='000000'),
top=Side(style='thick', color='000000'),
bottom=Side(style='thick', color='000000')
)
# Sous-titre avec fusion
ws1.merge_cells('A3:H3')
subtitle = ws1['A3']
subtitle.value = "Département des Ventes - Trimestre Q1-Q4"
subtitle.font = Font(size=14, italic=True, color='0066CC')
subtitle.alignment = Alignment(horizontal='center')
# En-têtes de colonnes avec style élaboré
headers = ['Région', 'Produit', 'Unités Vendues', 'Prix Unitaire', 'Chiffre d\'Affaires', 'Coût', 'Marge Brute', 'Marge %']
for col, header in enumerate(headers, 1):
cell = ws1.cell(row=4, column=col)
cell.value = header
cell.font = Font(bold=True, color='FFFFFF', size=12)
cell.fill = PatternFill(start_color='0066CC', end_color='0066CC', fill_type='solid')
cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True)
cell.border = Border(
left=Side(style='thin'),
right=Side(style='thin'),
top=Side(style='thin'),
bottom=Side(style='thin')
)
# Données complexes avec formules avancées
regions = ['Europe du Nord', 'Europe du Sud', 'Amérique du Nord', 'Amérique du Sud', 'Asie Pacifique', 'Moyen-Orient', 'Afrique']
products = ['Ordinateur Portable Premium', 'Tablette Professionnelle', 'Smartphone 5G', 'Écran 4K', 'Casque Sans Fil']
row = 5
for region in regions:
for i, product in enumerate(products):
units = 100 + (row * 13) % 500
price = 299 + (row * 37) % 1200
cost = price * 0.6
ws1.cell(row=row, column=1, value=region)
ws1.cell(row=row, column=2, value=product)
ws1.cell(row=row, column=3, value=units)
ws1.cell(row=row, column=4, value=price).number_format = FORMAT_CURRENCY_USD
# Formule: Chiffre d'affaires
ws1.cell(row=row, column=5, value=f"=C{row}*D{row}").number_format = FORMAT_CURRENCY_USD
# Coût
ws1.cell(row=row, column=6, value=cost).number_format = FORMAT_CURRENCY_USD
# Formule: Marge brute
ws1.cell(row=row, column=7, value=f"=E{row}-F{row}").number_format = FORMAT_CURRENCY_USD
# Formule: Marge %
ws1.cell(row=row, column=8, value=f"=IF(E{row}>0,G{row}/E{row},0)").number_format = FORMAT_PERCENTAGE
# Formatage conditionnel par région
for col in range(1, 9):
cell = ws1.cell(row=row, column=col)
if row % 2 == 0:
cell.fill = PatternFill(start_color='F2F2F2', end_color='F2F2F2', fill_type='solid')
cell.border = Border(
left=Side(style='thin', color='CCCCCC'),
right=Side(style='thin', color='CCCCCC'),
top=Side(style='thin', color='CCCCCC'),
bottom=Side(style='thin', color='CCCCCC')
)
row += 1
# Ligne de total avec formules complexes
total_row = row + 1
ws1.merge_cells(f'A{total_row}:B{total_row}')
total_cell = ws1[f'A{total_row}']
total_cell.value = "TOTAL GÉNÉRAL"
total_cell.font = Font(bold=True, size=14, color='FFFFFF')
total_cell.fill = PatternFill(start_color='FF6600', end_color='FF6600', fill_type='solid')
total_cell.alignment = Alignment(horizontal='right', vertical='center')
for col in [3, 5, 7]:
cell = ws1.cell(row=total_row, column=col)
cell.value = f"=SUM({get_column_letter(col)}5:{get_column_letter(col)}{row-1})"
cell.font = Font(bold=True, size=12)
cell.fill = PatternFill(start_color='FF6600', end_color='FF6600', fill_type='solid')
if col in [5, 7]:
cell.number_format = FORMAT_CURRENCY_USD
# Marge % moyenne
avg_cell = ws1.cell(row=total_row, column=8)
avg_cell.value = f"=AVERAGE(H5:H{row-1})"
avg_cell.number_format = FORMAT_PERCENTAGE
avg_cell.font = Font(bold=True, size=12)
avg_cell.fill = PatternFill(start_color='FF6600', end_color='FF6600', fill_type='solid')
# Ajuster les largeurs
ws1.column_dimensions['A'].width = 20
ws1.column_dimensions['B'].width = 30
ws1.column_dimensions['C'].width = 15
ws1.column_dimensions['D'].width = 15
ws1.column_dimensions['E'].width = 18
ws1.column_dimensions['F'].width = 15
ws1.column_dimensions['G'].width = 15
ws1.column_dimensions['H'].width = 12
# === SHEET 2: GRAPHIQUES ET ANALYSES ===
ws2 = wb.create_sheet("Analyses Graphiques")
ws2['A1'] = "Analyse des Performances par Région"
ws2['A1'].font = Font(size=16, bold=True, color='0066CC')
ws2.merge_cells('A1:D1')
# Données pour graphiques
ws2['A3'] = "Région"
ws2['B3'] = "Total Ventes"
ws2['C3'] = "Objectif"
ws2['D3'] = "Écart %"
region_data = [
("Europe", 2500000, 2200000),
("Amérique", 3200000, 3000000),
("Asie", 2800000, 2900000),
("Autres", 1200000, 1100000)
]
for i, (region, sales, target) in enumerate(region_data, 4):
ws2.cell(row=i, column=1, value=region)
ws2.cell(row=i, column=2, value=sales).number_format = FORMAT_CURRENCY_USD
ws2.cell(row=i, column=3, value=target).number_format = FORMAT_CURRENCY_USD
ws2.cell(row=i, column=4, value=f"=(B{i}-C{i})/C{i}").number_format = FORMAT_PERCENTAGE
# Graphique en barres
chart1 = BarChart()
chart1.title = "Ventes par Région vs Objectifs"
chart1.y_axis.title = "Montant (USD)"
chart1.x_axis.title = "Régions"
chart1.height = 10
chart1.width = 20
data = Reference(ws2, min_col=2, min_row=3, max_row=7, max_col=3)
cats = Reference(ws2, min_col=1, min_row=4, max_row=7)
chart1.add_data(data, titles_from_data=True)
chart1.set_categories(cats)
ws2.add_chart(chart1, "F3")
# Graphique circulaire
chart2 = PieChart()
chart2.title = "Répartition des Ventes par Région"
chart2.height = 10
chart2.width = 15
data2 = Reference(ws2, min_col=2, min_row=4, max_row=7)
cats2 = Reference(ws2, min_col=1, min_row=4, max_row=7)
chart2.add_data(data2)
chart2.set_categories(cats2)
ws2.add_chart(chart2, "F20")
# === SHEET 3: DONNÉES MENSUELLES AVEC TENDANCES ===
ws3 = wb.create_sheet("Tendances Mensuelles")
ws3['A1'] = "Évolution Mensuelle des Ventes 2024"
ws3['A1'].font = Font(size=16, bold=True, color='FF6600')
ws3.merge_cells('A1:M1')
months = ['Janvier', 'Février', 'Mars', 'Avril', 'Mai', 'Juin', 'Juillet', 'Août', 'Septembre', 'Octobre', 'Novembre', 'Décembre']
ws3['A3'] = "Mois"
for i, month in enumerate(months, 2):
ws3.cell(row=3, column=i, value=month)
ws3.cell(row=3, column=i).font = Font(bold=True)
# Produits avec ventes mensuelles
products_monthly = ['Laptops', 'Tablettes', 'Smartphones', 'Accessoires']
for i, product in enumerate(products_monthly, 4):
ws3.cell(row=i, column=1, value=product)
ws3.cell(row=i, column=1).font = Font(bold=True)
for month_col in range(2, 14):
value = 50000 + (i * month_col * 1234) % 30000
ws3.cell(row=i, column=month_col, value=value).number_format = FORMAT_CURRENCY_USD
# Ligne de total avec formule
ws3.cell(row=8, column=1, value="TOTAL")
ws3.cell(row=8, column=1).font = Font(bold=True, size=12)
for col in range(2, 14):
ws3.cell(row=8, column=col, value=f"=SUM({get_column_letter(col)}4:{get_column_letter(col)}7)")
ws3.cell(row=8, column=col).number_format = FORMAT_CURRENCY_USD
ws3.cell(row=8, column=col).font = Font(bold=True)
ws3.cell(row=8, column=col).fill = PatternFill(start_color='FFD700', end_color='FFD700', fill_type='solid')
# Graphique linéaire
chart3 = LineChart()
chart3.title = "Tendance des Ventes sur 12 Mois"
chart3.y_axis.title = "Montant (USD)"
chart3.x_axis.title = "Mois"
chart3.height = 12
chart3.width = 24
data3 = Reference(ws3, min_col=2, min_row=3, max_row=8, max_col=13)
cats3 = Reference(ws3, min_col=2, min_row=3, max_col=13)
chart3.add_data(data3, titles_from_data=True)
chart3.set_categories(cats3)
ws3.add_chart(chart3, "A10")
# Sauvegarder Excel
excel_file = SAMPLE_DIR / "super_complex.xlsx"
wb.save(excel_file)
print(f"✅ Excel créé: {excel_file}")
print(f" - 3 feuilles avec données complexes")
print(f" - Cellules fusionnées multiples")
print(f" - Formules avancées (SUM, AVERAGE, IF, pourcentages)")
print(f" - 3 graphiques (barres, camembert, lignes)")
print(f" - Formatage conditionnel élaboré")
print(f" - {len(regions) * len(products)} lignes de données\n")
# ============================================================================
# 2. WORD TRÈS COMPLEXE
# ============================================================================
print("📝 Création de Word super complexe...")
doc = Document()
# Configurer les marges
sections = doc.sections
for section in sections:
section.top_margin = Cm(2)
section.bottom_margin = Cm(2)
section.left_margin = Cm(2.5)
section.right_margin = Cm(2.5)
# PAGE DE COUVERTURE
title = doc.add_heading('RAPPORT STRATÉGIQUE ANNUEL', 0)
title.alignment = WD_ALIGN_PARAGRAPH.CENTER
for run in title.runs:
run.font.size = Pt(28)
run.font.color.rgb = RGBColor(0, 102, 204)
run.font.bold = True
subtitle = doc.add_paragraph('Analyse Complète des Performances et Perspectives 2024-2025')
subtitle.alignment = WD_ALIGN_PARAGRAPH.CENTER
subtitle.runs[0].font.size = Pt(16)
subtitle.runs[0].font.italic = True
subtitle.runs[0].font.color.rgb = RGBColor(102, 102, 102)
doc.add_paragraph('\n' * 3)
company_info = doc.add_paragraph()
company_info.alignment = WD_ALIGN_PARAGRAPH.CENTER
company_info.add_run('Société: TechnoVision International\n').font.size = Pt(14)
company_info.add_run('Département: Analyse Stratégique\n').font.size = Pt(12)
company_info.add_run('Date: 31 Décembre 2024').font.size = Pt(12)
doc.add_page_break()
# TABLE DES MATIÈRES
doc.add_heading('Table des Matières', 1)
toc_items = [
'1. Résumé Exécutif',
'2. Analyse des Performances Financières',
'3. Objectifs Stratégiques',
'4. Analyse de Marché',
'5. Recommandations',
'6. Conclusion'
]
for item in toc_items:
p = doc.add_paragraph(item, style='List Number')
p.runs[0].font.size = Pt(12)
doc.add_page_break()
# SECTION 1: RÉSUMÉ EXÉCUTIF
doc.add_heading('1. Résumé Exécutif', 1)
para1 = doc.add_paragraph()
para1.add_run('Ce rapport présente une analyse détaillée ').font.size = Pt(11)
para1.add_run('des performances exceptionnelles').bold = True
para1.add_run(' de notre entreprise au cours de l\'année 2024. ').font.size = Pt(11)
para1.add_run('Nous avons atteint et dépassé').italic = True
para1.add_run(' nos objectifs dans tous les domaines clés.').font.size = Pt(11)
para1.alignment = WD_ALIGN_PARAGRAPH.JUSTIFY
doc.add_heading('Points Clés', 2)
key_points = [
'Croissance du chiffre d\'affaires de 28% par rapport à 2023',
'Expansion réussie dans 5 nouveaux marchés internationaux',
'Lancement de 8 produits innovants avec taux d\'adoption de 87%',
'Amélioration de la satisfaction client: score de 4.8/5',
'Réduction de l\'empreinte carbone de 22%',
'Augmentation de la part de marché de 3.5 points'
]
for point in key_points:
p = doc.add_paragraph(point, style='List Bullet')
p.runs[0].font.size = Pt(11)
# Créer graphique pour Word
img_path = SAMPLE_DIR / "word_performance_chart.png"
fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(12, 5))
# Graphique 1: Croissance trimestrielle
quarters = ['Q1', 'Q2', 'Q3', 'Q4']
revenue = [45.2, 52.8, 61.5, 68.3]
ax1.plot(quarters, revenue, marker='o', linewidth=2, markersize=8, color='#0066CC')
ax1.fill_between(range(len(quarters)), revenue, alpha=0.3, color='#0066CC')
ax1.set_title('Croissance Trimestrielle du CA (M€)', fontsize=14, fontweight='bold')
ax1.set_ylabel('Chiffre d\'Affaires (M€)', fontsize=11)
ax1.grid(True, alpha=0.3)
# Graphique 2: Répartition des revenus
categories = ['Produits', 'Services', 'Licences', 'Consulting']
values = [45, 25, 20, 10]
colors = ['#0066CC', '#FF6600', '#00CC66', '#CC00CC']
ax2.pie(values, labels=categories, autopct='%1.1f%%', colors=colors, startangle=90)
ax2.set_title('Répartition des Revenus 2024', fontsize=14, fontweight='bold')
plt.tight_layout()
plt.savefig(img_path, dpi=150, bbox_inches='tight')
plt.close()
doc.add_paragraph()
doc.add_picture(str(img_path), width=Inches(6))
last_paragraph = doc.paragraphs[-1]
last_paragraph.alignment = WD_ALIGN_PARAGRAPH.CENTER
# SECTION 2: ANALYSE FINANCIÈRE
doc.add_page_break()
doc.add_heading('2. Analyse des Performances Financières', 1)
doc.add_heading('2.1 Résultats par Trimestre', 2)
# Tableau complexe des résultats
table = doc.add_table(rows=6, cols=6)
table.style = 'Medium Grid 3 Accent 1'
# En-têtes
headers = ['Trimestre', 'Revenus (M€)', 'Coûts (M€)', 'Marge Brute', 'Marge %', 'Croissance']
for i, header in enumerate(headers):
cell = table.rows[0].cells[i]
cell.text = header
cell.paragraphs[0].runs[0].font.bold = True
cell.paragraphs[0].runs[0].font.size = Pt(10)
# Données trimestrielles
quarterly_data = [
('Q1 2024', 45.2, 28.5, 16.7, '36.9%', '+8.5%'),
('Q2 2024', 52.8, 32.1, 20.7, '39.2%', '+16.8%'),
('Q3 2024', 61.5, 36.8, 24.7, '40.2%', '+16.5%'),
('Q4 2024', 68.3, 40.2, 28.1, '41.1%', '+11.1%'),
('TOTAL', 227.8, 137.6, 90.2, '39.6%', '28.0%')
]
for row_idx, row_data in enumerate(quarterly_data, 1):
for col_idx, value in enumerate(row_data):
cell = table.rows[row_idx].cells[col_idx]
cell.text = str(value)
if row_idx == 5: # Ligne total
cell.paragraphs[0].runs[0].font.bold = True
# Colorer le fond (workaround via XML)
shading_elm = OxmlElement('w:shd')
shading_elm.set(qn('w:fill'), 'FFD700')
cell._element.get_or_add_tcPr().append(shading_elm)
doc.add_paragraph()
doc.add_heading('2.2 Analyse Comparative', 2)
comparison_text = doc.add_paragraph()
comparison_text.add_run('Comparaison avec les objectifs annuels: ').bold = True
comparison_text.add_run('Notre performance a dépassé les objectifs fixés de ')
comparison_text.add_run('13.5%').bold = True
comparison_text.add_run(', démontrant une excellente exécution stratégique et une adaptation réussie aux conditions du marché.')
comparison_text.alignment = WD_ALIGN_PARAGRAPH.JUSTIFY
# SECTION 3: OBJECTIFS STRATÉGIQUES
doc.add_page_break()
doc.add_heading('3. Objectifs Stratégiques 2025', 1)
doc.add_heading('3.1 Vision et Mission', 2)
vision = doc.add_paragraph()
vision.add_run('Vision: ').bold = True
vision.add_run('Devenir le leader mondial dans notre secteur d\'ici 2027.')
vision.alignment = WD_ALIGN_PARAGRAPH.JUSTIFY
mission = doc.add_paragraph()
mission.add_run('Mission: ').bold = True
mission.add_run('Fournir des solutions innovantes qui transforment les entreprises et améliorent la vie de millions de personnes.')
mission.alignment = WD_ALIGN_PARAGRAPH.JUSTIFY
doc.add_heading('3.2 Objectifs Prioritaires', 2)
objectives = [
('Expansion Géographique', 'Pénétrer 10 nouveaux marchés en Asie et Europe de l\'Est'),
('Innovation Produit', 'Lancer 12 nouveaux produits avec IA intégrée'),
('Excellence Opérationnelle', 'Réduire les coûts de 15% via automatisation'),
('Satisfaction Client', 'Atteindre un NPS de 75+'),
('Développement Durable', 'Neutralité carbone d\'ici fin 2025')
]
for i, (title, desc) in enumerate(objectives, 1):
p = doc.add_paragraph(style='List Number')
p.add_run(f'{title}: ').bold = True
p.add_run(desc)
# Ajouter une image conceptuelle
concept_img = SAMPLE_DIR / "word_strategy_image.png"
img = Image.new('RGB', (800, 400), color=(240, 248, 255))
draw = ImageDraw.Draw(img)
try:
font_large = ImageFont.truetype("arial.ttf", 60)
font_small = ImageFont.truetype("arial.ttf", 30)
except:
font_large = ImageFont.load_default()
font_small = ImageFont.load_default()
draw.rectangle([50, 50, 750, 350], outline=(0, 102, 204), width=5, fill=(230, 240, 255))
draw.text((400, 150), "STRATÉGIE 2025", fill=(0, 102, 204), font=font_large, anchor="mm")
draw.text((400, 250), "Innovation • Excellence • Croissance", fill=(102, 102, 102), font=font_small, anchor="mm")
img.save(concept_img)
doc.add_paragraph()
doc.add_picture(str(concept_img), width=Inches(5.5))
doc.paragraphs[-1].alignment = WD_ALIGN_PARAGRAPH.CENTER
# CONCLUSION
doc.add_page_break()
doc.add_heading('6. Conclusion', 1)
conclusion = doc.add_paragraph()
conclusion.add_run('L\'année 2024 a été exceptionnelle ').font.size = Pt(12)
conclusion.add_run('pour notre organisation. ').bold = True
conclusion.add_run('Nous avons non seulement atteint nos objectifs ambitieux, mais nous avons également posé les bases solides pour une croissance continue et durable. ')
conclusion.add_run('L\'engagement de nos équipes, la confiance de nos clients et l\'innovation de nos produits ').italic = True
conclusion.add_run('sont les piliers de notre succès.')
conclusion.alignment = WD_ALIGN_PARAGRAPH.JUSTIFY
conclusion.paragraph_format.line_spacing_rule = WD_LINE_SPACING.MULTIPLE
conclusion.paragraph_format.line_spacing = 1.5
# Footer
section = doc.sections[0]
footer = section.footer
footer_para = footer.paragraphs[0]
footer_para.text = "Document Confidentiel - TechnoVision International 2024 | "
footer_para.alignment = WD_ALIGN_PARAGRAPH.CENTER
footer_para.runs[0].font.size = Pt(9)
footer_para.runs[0].font.italic = True
# Sauvegarder Word
word_file = SAMPLE_DIR / "super_complex.docx"
doc.save(word_file)
print(f"✅ Word créé: {word_file}")
print(f" - 6 sections structurées")
print(f" - Page de couverture professionnelle")
print(f" - Table des matières")
print(f" - Tableaux complexes avec formatage")
print(f" - 3 images intégrées (graphiques et concepts)")
print(f" - Formatage avancé (styles, couleurs, alignements)")
print(f" - Pieds de page\n")
# ============================================================================
# 3. POWERPOINT TRÈS COMPLEXE
# ============================================================================
print("🎨 Création de PowerPoint super complexe...")
prs = Presentation()
prs.slide_width = PptxInches(10)
prs.slide_height = PptxInches(7.5)
# SLIDE 1: TITRE PRINCIPAL
slide1 = prs.slides.add_slide(prs.slide_layouts[6]) # Blank
# Fond coloré
background = slide1.shapes.add_shape(
MSO_SHAPE.RECTANGLE,
0, 0, prs.slide_width, prs.slide_height
)
background.fill.solid()
background.fill.fore_color.rgb = PptxRGBColor(0, 102, 204)
background.line.fill.background()
# Titre principal
title_box = slide1.shapes.add_textbox(
PptxInches(1), PptxInches(2.5),
PptxInches(8), PptxInches(2)
)
title_frame = title_box.text_frame
title_frame.text = "TRANSFORMATION DIGITALE 2025"
title_para = title_frame.paragraphs[0]
title_para.font.size = PptxPt(54)
title_para.font.bold = True
title_para.font.color.rgb = PptxRGBColor(255, 255, 255)
title_para.alignment = PP_ALIGN.CENTER
# Sous-titre
subtitle_box = slide1.shapes.add_textbox(
PptxInches(1), PptxInches(4.8),
PptxInches(8), PptxInches(1)
)
subtitle_frame = subtitle_box.text_frame
subtitle_frame.text = "Stratégie, Innovation et Excellence Opérationnelle"
subtitle_para = subtitle_frame.paragraphs[0]
subtitle_para.font.size = PptxPt(24)
subtitle_para.font.italic = True
subtitle_para.font.color.rgb = PptxRGBColor(255, 255, 255)
subtitle_para.alignment = PP_ALIGN.CENTER
# SLIDE 2: AGENDA
slide2 = prs.slides.add_slide(prs.slide_layouts[1])
title2 = slide2.shapes.title
title2.text = "Agenda de la Présentation"
title2.text_frame.paragraphs[0].font.size = PptxPt(40)
title2.text_frame.paragraphs[0].font.color.rgb = PptxRGBColor(0, 102, 204)
body2 = slide2.placeholders[1]
tf2 = body2.text_frame
tf2.clear()
agenda_items = [
"Contexte et Enjeux Stratégiques",
"Analyse des Performances 2024",
"Objectifs de Transformation Digitale",
"Initiatives Clés et Roadmap",
"Budget et Ressources",
"Indicateurs de Succès et KPIs",
"Plan d'Action et Prochaines Étapes"
]
for i, item in enumerate(agenda_items):
p = tf2.add_paragraph()
p.text = item
p.level = 0
p.font.size = PptxPt(20)
p.space_before = PptxPt(8)
# Numérotation colorée
run = p.runs[0]
run.text = f"{i+1}. {item}"
if i % 2 == 0:
run.font.color.rgb = PptxRGBColor(0, 102, 204)
else:
run.font.color.rgb = PptxRGBColor(255, 102, 0)
# SLIDE 3: DONNÉES AVEC GRAPHIQUE
slide3 = prs.slides.add_slide(prs.slide_layouts[5])
title3 = slide3.shapes.title
title3.text = "Croissance et Performance Financière"
# Créer graphique pour PPT
chart_img = SAMPLE_DIR / "ppt_financial_chart.png"
fig, ax = plt.subplots(figsize=(10, 6))
years = ['2020', '2021', '2022', '2023', '2024']
revenue = [125, 145, 168, 195, 228]
profit = [15, 22, 28, 35, 48]
x = np.arange(len(years))
width = 0.35
bars1 = ax.bar(x - width/2, revenue, width, label='Revenus (M€)', color='#0066CC')
bars2 = ax.bar(x + width/2, profit, width, label='Bénéfices (M€)', color='#FF6600')
ax.set_xlabel('Années', fontsize=12, fontweight='bold')
ax.set_ylabel('Montants (M€)', fontsize=12, fontweight='bold')
ax.set_title('Évolution Financière 2020-2024', fontsize=16, fontweight='bold')
ax.set_xticks(x)
ax.set_xticklabels(years)
ax.legend(fontsize=11)
ax.grid(True, alpha=0.3)
# Ajouter valeurs sur les barres
for bars in [bars1, bars2]:
for bar in bars:
height = bar.get_height()
ax.text(bar.get_x() + bar.get_width()/2., height,
f'{int(height)}',
ha='center', va='bottom', fontsize=10, fontweight='bold')
plt.tight_layout()
plt.savefig(chart_img, dpi=150, bbox_inches='tight', facecolor='white')
plt.close()
slide3.shapes.add_picture(
str(chart_img),
PptxInches(1.5), PptxInches(2),
width=PptxInches(7)
)
# SLIDE 4: TABLEAU COMPLEXE
slide4 = prs.slides.add_slide(prs.slide_layouts[5])
title4 = slide4.shapes.title
title4.text = "Répartition Budgétaire par Département"
# Tableau
rows, cols = 8, 5
table = slide4.shapes.add_table(
rows, cols,
PptxInches(0.8), PptxInches(2),
PptxInches(8.4), PptxInches(4)
).table
# En-têtes
headers = ['Département', 'Budget 2024 (M€)', 'Budget 2025 (M€)', 'Variation', 'Priorité']
for col, header in enumerate(headers):
cell = table.cell(0, col)
cell.text = header
cell.fill.solid()
cell.fill.fore_color.rgb = PptxRGBColor(0, 102, 204)
for paragraph in cell.text_frame.paragraphs:
for run in paragraph.runs:
run.font.size = PptxPt(14)
run.font.bold = True
run.font.color.rgb = PptxRGBColor(255, 255, 255)
cell.text_frame.paragraphs[0].alignment = PP_ALIGN.CENTER
# Données
dept_data = [
('Recherche & Développement', '45.2', '58.5', '+29.4%', 'Élevée'),
('Ventes & Marketing', '38.7', '42.3', '+9.3%', 'Élevée'),
('Opérations', '52.3', '55.1', '+5.4%', 'Moyenne'),
('IT & Infrastructure', '28.5', '35.2', '+23.5%', 'Élevée'),
('Ressources Humaines', '15.8', '17.2', '+8.9%', 'Moyenne'),
('Administration', '12.3', '13.1', '+6.5%', 'Faible'),
('TOTAL', '192.8', '221.4', '+14.8%', '-')
]
for row_idx, row_data in enumerate(dept_data, 1):
for col_idx, value in enumerate(row_data):
cell = table.cell(row_idx, col_idx)
cell.text = value
# Formatage spécial pour la ligne total
if row_idx == 7:
cell.fill.solid()
cell.fill.fore_color.rgb = PptxRGBColor(255, 215, 0)
for paragraph in cell.text_frame.paragraphs:
for run in paragraph.runs:
run.font.bold = True
run.font.size = PptxPt(13)
else:
# Alternance de couleurs
if row_idx % 2 == 0:
cell.fill.solid()
cell.fill.fore_color.rgb = PptxRGBColor(240, 248, 255)
for paragraph in cell.text_frame.paragraphs:
for run in paragraph.runs:
run.font.size = PptxPt(12)
# Alignement
cell.text_frame.paragraphs[0].alignment = PP_ALIGN.CENTER if col_idx > 0 else PP_ALIGN.LEFT
# SLIDE 5: INITIATIVES CLÉS AVEC FORMES
slide5 = prs.slides.add_slide(prs.slide_layouts[5])
title5 = slide5.shapes.title
title5.text = "Initiatives Stratégiques 2025"
initiatives = [
("Innovation IA", "Intégration IA dans tous les produits", PptxRGBColor(46, 125, 50)),
("Cloud First", "Migration complète vers le cloud", PptxRGBColor(33, 150, 243)),
("Customer 360", "Vue unifiée du parcours client", PptxRGBColor(255, 152, 0)),
("Green IT", "Neutralité carbone datacenter", PptxRGBColor(76, 175, 80))
]
y_position = 2.2
for i, (title_text, desc, color) in enumerate(initiatives):
# Rectangle coloré
shape = slide5.shapes.add_shape(
MSO_SHAPE.ROUNDED_RECTANGLE,
PptxInches(1), PptxInches(y_position),
PptxInches(8), PptxInches(1)
)
shape.fill.solid()
shape.fill.fore_color.rgb = color
shape.line.color.rgb = color
shape.shadow.inherit = False
# Texte dans la forme
text_frame = shape.text_frame
text_frame.clear()
p1 = text_frame.paragraphs[0]
p1.text = title_text
p1.font.size = PptxPt(22)
p1.font.bold = True
p1.font.color.rgb = PptxRGBColor(255, 255, 255)
p1.alignment = PP_ALIGN.LEFT
p2 = text_frame.add_paragraph()
p2.text = desc
p2.font.size = PptxPt(16)
p2.font.color.rgb = PptxRGBColor(255, 255, 255)
p2.alignment = PP_ALIGN.LEFT
p2.space_before = PptxPt(5)
text_frame.vertical_anchor = MSO_ANCHOR.MIDDLE
text_frame.margin_left = PptxInches(0.3)
y_position += 1.2
# SLIDE 6: TIMELINE
slide6 = prs.slides.add_slide(prs.slide_layouts[5])
title6 = slide6.shapes.title
title6.text = "Roadmap de Déploiement"
# Timeline horizontale
timeline_data = [
("Q1", "Planification", PptxRGBColor(76, 175, 80)),
("Q2", "Développement", PptxRGBColor(33, 150, 243)),
("Q3", "Tests & Pilotes", PptxRGBColor(255, 152, 0)),
("Q4", "Déploiement", PptxRGBColor(156, 39, 176))
]
x_start = 1
y_pos = 3
width = 1.8
for quarter, phase, color in timeline_data:
# Cercle pour le trimestre
circle = slide6.shapes.add_shape(
MSO_SHAPE.OVAL,
PptxInches(x_start), PptxInches(y_pos),
PptxInches(0.8), PptxInches(0.8)
)
circle.fill.solid()
circle.fill.fore_color.rgb = color
circle.line.color.rgb = color
# Texte du trimestre
tf = circle.text_frame
tf.text = quarter
tf.paragraphs[0].font.size = PptxPt(18)
tf.paragraphs[0].font.bold = True
tf.paragraphs[0].font.color.rgb = PptxRGBColor(255, 255, 255)
tf.paragraphs[0].alignment = PP_ALIGN.CENTER
tf.vertical_anchor = MSO_ANCHOR.MIDDLE
# Description de la phase
text_box = slide6.shapes.add_textbox(
PptxInches(x_start - 0.3), PptxInches(y_pos + 1.2),
PptxInches(1.4), PptxInches(0.6)
)
tf2 = text_box.text_frame
tf2.text = phase
tf2.paragraphs[0].font.size = PptxPt(14)
tf2.paragraphs[0].font.bold = True
tf2.paragraphs[0].font.color.rgb = color
tf2.paragraphs[0].alignment = PP_ALIGN.CENTER
# Ligne de connexion (sauf pour le dernier)
if x_start < 7:
line = slide6.shapes.add_connector(
1, # Straight connector
PptxInches(x_start + 0.8), PptxInches(y_pos + 0.4),
PptxInches(x_start + width), PptxInches(y_pos + 0.4)
)
line.line.color.rgb = PptxRGBColor(100, 100, 100)
line.line.width = PptxPt(3)
x_start += width
# SLIDE 7: CONCLUSION
slide7 = prs.slides.add_slide(prs.slide_layouts[1])
title7 = slide7.shapes.title
title7.text = "Prochaines Étapes et Engagement"
body7 = slide7.placeholders[1]
tf7 = body7.text_frame
tf7.clear()
next_steps = [
"Validation du comité exécutif - Janvier 2025",
"Kick-off des programmes prioritaires - Février 2025",
"Revues mensuelles de progression avec les sponsors",
"Communication régulière à toutes les parties prenantes",
"Ajustements agiles basés sur les retours du terrain"
]
for step in next_steps:
p = tf7.add_paragraph()
p.text = step
p.level = 0
p.font.size = PptxPt(20)
p.space_before = PptxPt(10)
p.font.color.rgb = PptxRGBColor(0, 102, 204)
# Ajouter une image de conclusion
conclusion_img = SAMPLE_DIR / "ppt_conclusion_image.png"
img = Image.new('RGB', (800, 300), color=(255, 255, 255))
draw = ImageDraw.Draw(img)
# Dessiner un graphique de succès stylisé
draw.rectangle([50, 50, 750, 250], outline=(0, 102, 204), width=3)
try:
font = ImageFont.truetype("arial.ttf", 50)
except:
font = ImageFont.load_default()
draw.text((400, 150), "SUCCÈS 2025", fill=(0, 102, 204), font=font, anchor="mm")
img.save(conclusion_img)
slide7.shapes.add_picture(
str(conclusion_img),
PptxInches(2.5), PptxInches(5),
width=PptxInches(5)
)
# Ajouter notes de présentation
notes_slide = slide1.notes_slide
notes_slide.notes_text_frame.text = "Bienvenue à tous. Cette présentation couvre notre stratégie de transformation digitale pour 2025. Nous allons explorer nos objectifs ambitieux et le plan d'action pour les atteindre."
# Sauvegarder PowerPoint
ppt_file = SAMPLE_DIR / "super_complex.pptx"
prs.save(ppt_file)
print(f"✅ PowerPoint créé: {ppt_file}")
print(f" - 7 diapositives professionnelles")
print(f" - Slide de titre avec design custom")
print(f" - Agenda structuré avec numérotation")
print(f" - Tableau complexe 8x5 avec formatage")
print(f" - Graphiques intégrés (barres avec valeurs)")
print(f" - Timeline visuelle avec formes connectées")
print(f" - 4 initiatives avec rectangles colorés")
print(f" - Images et formes multiples")
print(f" - Notes de présentation\n")
print("=" * 70)
print("🎉 TOUS LES FICHIERS COMPLEXES ONT ÉTÉ CRÉÉS AVEC SUCCÈS!")
print("=" * 70)
print(f"\n📁 Fichiers disponibles dans: {SAMPLE_DIR.absolute()}")
print("\nVous pouvez maintenant:")
print("1. Ouvrir les fichiers pour vérifier la complexité")
print("2. Les traduire via l'API")
print("3. Vérifier que le formatage est préservé")
print("\n✨ Formatage inclus:")
print(" Excel: Formules, cellules fusionnées, graphiques, formatage conditionnel")
print(" Word: Images, tableaux, styles, couleurs, pieds de page")
print(" PowerPoint: Formes, graphiques, timeline, tableaux, animations visuelles")