From 8ddab219e1df5d81ab52aa8d09828b7788eab369 Mon Sep 17 00:00:00 2001
From: Emmanuel Viennet <emmanuel.viennet@gmail.com>
Date: Thu, 20 Feb 2025 15:52:46 +0100
Subject: [PATCH] =?UTF-8?q?Fix:=20export=20excel=20avec=20caract=C3=A8res?=
 =?UTF-8?q?=20invalides?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 app/scodoc/sco_excel.py | 15 +++++++++++++--
 sco_version.py          |  2 +-
 2 files changed, 14 insertions(+), 3 deletions(-)

diff --git a/app/scodoc/sco_excel.py b/app/scodoc/sco_excel.py
index a0c25c15..0b049752 100644
--- a/app/scodoc/sco_excel.py
+++ b/app/scodoc/sco_excel.py
@@ -40,7 +40,9 @@ from openpyxl.styles.numbers import FORMAT_NUMBER_00, FORMAT_GENERAL, FORMAT_DAT
 from openpyxl.comments import Comment
 from openpyxl import Workbook, load_workbook
 from openpyxl.cell import WriteOnlyCell
+from openpyxl.cell.cell import ILLEGAL_CHARACTERS_RE
 from openpyxl.styles import Font, Border, Side, Alignment, PatternFill
+from openpyxl.utils.exceptions import IllegalCharacterError
 from openpyxl.worksheet.worksheet import Worksheet
 
 import app.scodoc.sco_utils as scu
@@ -366,8 +368,17 @@ class ScoExcelSheet:
             value = value.replace(tzinfo=None)
 
         # création de la cellule
-        cell = WriteOnlyCell(self.ws, value)
-
+        try:
+            cell = WriteOnlyCell(self.ws, value)
+        except IllegalCharacterError as exc:
+            if isinstance(value, str):
+                # chaine contenant un caractère interdit dans Excel: élimine
+                value = ILLEGAL_CHARACTERS_RE.sub("", value)
+                cell = WriteOnlyCell(self.ws, value)
+            else:
+                raise ScoValueError(
+                    f"Valeur de cellule non autorisée: {value}"
+                ) from exc
         # recopie des styles
         if style is None:
             style = self.default_style
diff --git a/sco_version.py b/sco_version.py
index 007858c8..efbf9160 100644
--- a/sco_version.py
+++ b/sco_version.py
@@ -3,7 +3,7 @@
 
 "Infos sur version ScoDoc"
 
-SCOVERSION = "9.7.63"
+SCOVERSION = "9.7.64"
 
 SCONAME = "ScoDoc"
 
-- 
GitLab