001_02 — Génération du modèle Excel

Cahier des charges

1
# CDC 001_02

Code Python

1
# TD_EDC_01_001_02.py
2
# Résumé : chemins dynamiques (dossier parent -> *_do, *_md), suppression du fichier
3
# Excel existant, régénération avec en-têtes/formules, ouverture dans Excel.
4
# Points clés : pathlib pour les chemins, suppression prudente, xlsxwriter pour l'export,
5
# subprocess pour lancer Excel.
6
# Génère un classeur Excel basé sur le nom du script et l'ouvre dans Excel.
7
from pathlib import Path
8
import subprocess
9
import xlsxwriter
10
11
12
def build_paths() -> tuple[Path, Path]:
13
    """Calcule les chemins (xlsx, md) à partir du nom du script.
14
15
    Les dossiers de sortie sont dérivés du nom du dossier parent (ex: 001 -> 001_do, 001_md).
16
    """
17
    script = Path(__file__).resolve()
18
    root = script.parent.parent  # folder containing 001 and its siblings
19
    stem = script.stem
20
    base_dir_name = script.parent.name  # e.g., "001"
21
    xlsx_dir = root / f"{base_dir_name}_do"
22
    md_dir = root / f"{base_dir_name}_md"
23
    xlsx_path = (xlsx_dir / f"{stem}.xlsx").resolve()
24
    md_path = (md_dir / f"{stem}.md").resolve()
25
    xlsx_path.parent.mkdir(parents=True, exist_ok=True)
26
    md_path.parent.mkdir(parents=True, exist_ok=True)
27
    return xlsx_path, md_path
28
29
30
def delete_if_exists(path: Path) -> None:
31
    """Supprime le fichier s'il existe (silencieux s'il est absent)."""
32
    if path.exists():
33
        path.unlink()
34
35
36
def create_workbook(xlsx_path: Path, n: int = 9) -> None:
37
    """Crée le classeur du modèle de survie avec en-têtes et formules."""
38
    workbook = xlsxwriter.Workbook(str(xlsx_path))
39
    sheet = workbook.add_worksheet("modele_N_nRep")
40
41
    sheet.write_row(0, 0, ["Rang i", "ttf i", "dN(i)", "N(i)"])
42
43
    for i in range(n + 1):
44
        row = i + 1  # start writing on Excel line 2
45
        sheet.write(row, 0, i)
46
        sheet.write(row, 2, 1)  # placeholder dN(i) value
47
48
        if i == 0:
49
            sheet.write(row, 3, n)
50
        else:
51
            prev_excel_row = row  # Excel rows are 1-based
52
            curr_excel_row = row + 1
53
            sheet.write_formula(row, 3, f"=D{prev_excel_row}-C{curr_excel_row}")
54
55
    workbook.close()
56
57
58
def open_in_excel(xlsx_path: Path) -> None:
59
    """Ouvre le classeur généré dans Excel (Windows)."""
60
    subprocess.Popen(["start", "excel", str(xlsx_path)], shell=True)
61
62
63
def main() -> None:
64
    """Pipeline : calcul des chemins, suppression éventuelle, création et ouverture."""
65
    xlsx_path, _ = build_paths()
66
    delete_if_exists(xlsx_path)
67
    create_workbook(xlsx_path, n=9)
68
    open_in_excel(xlsx_path)
69
70
71
if __name__ == "__main__":
72
    main()

Documentation

1
# 001_01 — Génération du modèle Excel
2
3
## Objectifs
4
- Générer un classeur `modele_N_nRep` à partir du script Python.
5
- Supprimer automatiquement l'ancien fichier Excel avant régénération.
6
- Placer le classeur dans `001_do` avec le même nom que le script (`001_01.xlsx`).
7
- Ouvrir le fichier dans Excel après création (Windows).
8
9
## Fonctionnement
10
1. Calcule les chemins de sortie à partir du nom du script.
11
2. Supprime le fichier Excel s'il existe déjà.
12
3. Crée un classeur avec les en-têtes `Rang i`, `ttf i`, `dN(i)`, `N(i)`.
13
4. Renseigne les lignes 0..N et insère une formule de décrément sur la colonne `N(i)`.
14
5. Lance Excel sur le fichier généré.
15
16
## Points techniques
17
- **Bibliothèque** : `xlsxwriter` pour écrire le fichier `.xlsx`.
18
- **Chemins** : construits via `pathlib` (dossiers `001_do` et `001_md` créés au besoin).
19
- **Sécurité** : suppression préalable via `Path.unlink()` si le fichier existe.
20
- **Formules** : `D(row) = D(row-1) - C(row)` pour suivre le nombre de survivants.
21
22
## Utilisation
23
```bash
24
python 001/001_01.py
25
```
26
Le fichier généré : `001_do/001_01.xlsx`.
27