Ne ré-enregistrez pas directement l'Excel fourni par le client : vérifiez d'abord les liens externes

keep_vba=True est une politique de rétention, pas une preuve de « macro détectée ». Ce qui suit vérifie uniquement si le package ZIP existe vbaProject.bin et des composants de lien externe ; la présence de composants ne signifie pas que le contenu est sûr, que les macros sont valides ou que les cibles externes sont accessibles. Les macros ne seront pas exécutées ni les liens visités.

L'Excel envoyé par le client s'ouvre normalement localement, mais après avoir été traité par un script Python ou téléchargé dans le système, la formule peut devenir #REF!, le menu déroulant disparaît, voire ne peut pas être ouvert. Il ne s'agit généralement pas d'une corruption du fichier, mais plutôt d'un outil automatisé qui n'a pas conservé intact le cache de liens externes ou les macros VBA lors de la réenregistrement.

Cet article est écrit pour les développeurs et le personnel des opérations qui doivent traiter Excel en lots avec des scripts. Ci-dessous, nous expliquerons quelles informations openpyxl omet par défaut, proposerons une approche de revue pour les échantillons synthétiques, et listerons les limites nécessitant une vérification manuelle lors de l’acceptation. Après avoir lu, vous devriez pouvoir déterminer ce qui doit être vérifié avant de restaurer un document.

Conclusion en une phrase : faites l'inventaire des liens externes et des composants VBA avant de réenregistrer Excel

Confirmez d'abord s'il y a des projets VBA et des composants de liens externes dans le package de fichiers, puis décidez des paramètres de chargement et conservez le processus de révision manuelle lors de l'acceptation.

votre situationPratiques recommandéesraison
Le paquet de fichiers contient vbaProject.binPrompt : Certains contenus nécessitent une revue séparée ; les macros ne sont pas exécutéesLa présence de composants ne signifie pas que les macros sont valides ou sûres pour le contenu
Le package de fichiers contient des composants de lien externeEnregistrez sa position à l’intérieur du paquet sans accéder à la cibleLe script ne fait qu’un inventaire et ne vérifie pas si la cible est accessible
Chargement avec keep_vba=VraiConsidérez-y comme une stratégie de chargementkeep_vba=Vrai est une politique de rétention, et non une preuve de macros détectées

Pourquoi le chargement par défaut provoque la perte d’informations clés

La documentation officielle d'openpyxl indique que load_workbook a des limites claires pour le traitement des données non cellulaires. keep_links est par défaut True, qui conserve la définition du lien en XML, mais ne garantit pas que le cache de données externes (valeurs mises en cache) sera toujours valide après le rechargement. Une fois que vous quittez l'environnement réseau d'origine ou le chemin du fichier source, Excel peut toujours signaler une erreur lors de l'actualisation.

keep_vba est par défaut False. Si le fichier original contient des macros, par défaut le chargement puis l’enregistrement suppriment le projet VBA. Des objets comme les graphiques et les formes peuvent également être ignorés lors de la lecture.

Ce ne sont pas des bugs, mais plutôt les limites fonctionnelles de la bibliothèque elle-même. Lors de la gestion de fichiers de qualité production, vous devez explicitement déclarer des politiques de rétention plutôt que de supposer que l’outil conserve automatiquement toutes les fonctionnalités.

Exemple de synthèse et préparation de fichier de test

Pour démontrer ce mécanisme en toute sécurité, il est recommandé de construire un scénario synthétique qui ne s'appuie pas sur des données clients réelles.

Préparez les documents de test

  1. Créez un nouveau classeur Excel.
  2. Insérez un module vierge dans l'éditeur VBA (Alt+F11).
  3. Entrez la formule ='[ExternalBook.xlsx]Sheet1'!$A$1 dans la cellule A1. Il n’est pas nécessaire de créer un véritable fichier externe, il suffit de conserver cette structure de référence.
  4. Enregistrez au format input_check.xlsm prenant en charge les macros.

Erreurs courantes et saisie de frontières

  • Pour les fichiers avec macros activées, chargez-les en utilisant le load_workbook('input_check.xlsm') par défaut, puis enregistrez-les en .xlsx ; le code VBA sera discrètement défaussé.
  • Lors du chargement, keep_vba=True n’est pas spécifié, mais le fichier est sauvegardé de force sous forme de .xlsm. Excel peut refuser d’ouvrir le fichier car l’en-tête du fichier ne correspond pas au contenu réel.
  • En mode lecture seule (read_only=True), les paramètres keep_links et keep_vba sont invalides, et toute tentative de conservation de la fonctionnalité échouera.

Liens externes et code de validation de la rétention de macros

L’exemple suivant construit la logique de vérification en mémoire pour démontrer la fonction des paramètres.

from io import BytesIO
from zipfile import ZipFile
from openpyxl import Workbook
def inventory(raw):
    with ZipFile(BytesIO(raw)) as z:
        names = set(z.namelist())
    return {"has_vba_part": "xl/vbaProject.bin" in names,
            "external_link_parts": sorted(n for n in names if n.startswith("xl/externalLinks/externalLink") and n.endswith(".xml"))}
out = BytesIO()
Workbook().save(out)
assert inventory(out.getvalue()) == {"has_vba_part": False, "external_link_parts": []}
synthetic = BytesIO()
with ZipFile(synthetic, "w") as z:
    z.writestr("xl/vbaProject.bin", b"not executable VBA; fixture only")
    z.writestr("xl/externalLinks/externalLink1.xml", b"<fixture/>")
result = inventory(synthetic.getvalue())
assert result["has_vba_part"]
assert result["external_link_parts"] == ["xl/externalLinks/externalLink1.xml"]

Ce code n’est qu’un exemple pédagogique, pas un outil complet de réparation de fichiers, et n’a jamais été exécuté dans des environnements de production réels. Avant de courir, veuillez vous assurer d’avoir préparé input_check.xlsm comme décrit ci-dessus.

📊 Comparaison de base : paramètres par défaut et paramètres réservés

paramètrevaleur par défautFonctionFrontière
keep_linksTrueConserver la définition du lien dans XMLIl n’y a aucune garantie que les caches de données externes resteront valides après le restockage
keep_vbaFalsePar défaut, les projets VBA ne sont pas conservésLe mettre en vrai ne signifie pas que le contenu de la macro est sûr ou valide
read_onlyFalseChargement en mode lecture seuleDans ce mode, keep_links et keep_vba sont inefficaces

Critères d’acceptation et limites d’examen manuel

L’automatisation ne peut pas couvrir tous les cas particuliers dans Excel. Le tableau ci-dessous sert à distinguer quelles situations doivent être examinées par des scripts et lesquelles nécessitent une interception ou une manipulation manuelle.

ObservationCe qu’il faut faireet ne doit pas être jugé
Il y a une composante VBANote : Contient du contenu nécessitant une revue séparéePas d’exécution de macro
Composants du lien externeNotez l’emplacement à l’intérieur du colisAucun accès à la cible
Gardez les paramètres activésConsidérez cela comme une stratégie de chargementCela ne doit pas être considéré comme une preuve de détection de macros

Les scripts peuvent vérifier si les paramètres sont efficaces, mais ne peuvent garantir que les fichiers de sortie sont disponibles au niveau métier. Par exemple, keep_links=True a réussi à préserver la définition du lien. Si le serveur cible est hors ligne, les utilisateurs auront toujours des erreurs lors des rafrafrahits dans Excel. Ces questions dépassent les responsabilités de la bibliothèque de traitement documentaire et nécessitent une étape de révision manuelle dans le processus d’acceptation.

Références

Utilisez cette liste de contrôle pour la traduction de documents

Lors du traitement des tables contenant des formules et des codes métier, distinguez d’abord quel contenu est du texte et lesquels sont des formules, identifiants et codes métier, puis traduisez. L’inspection post-traduction vérifie non seulement si le chinois a été converti en langue cible, mais confirme également que les formules, identifiants et relations de citation n’ont pas été modifiés.

OmniDoc (entrée produit) propose des portails de traduction de documents multi-formats, et le site officiel introduit des OCR, des glossaires et des fonctionnalités de référence bilingues. Pour les équipes qui souhaitent partir directement du fichier, ce chemin peut être évalué à l’aide d’échantillons réels. Veuillez utiliser le fichier anonymisé que vous avez autorisé pour télécharger et vérifier les résultats avec la liste de contrôle de cet article. Cela ne prétend pas qu’OmniDoc utilise les bibliothèques open source ou les algorithmes internes mentionnés dans cet article, ni ne remplace les tests de performance produit par des exemples.

🎯 Quelle méthode te convient ?

Si vous devez traiter en lots des fichiers contenant des macros

D’abord, utilisez keep_vba=True pour clarifier la stratégie de rétention, puis comparez les résultats de sortie dans l’environnement de test. Ne supposez pas que les macros seront automatiquement conservées.

Si votre Excel contient des liens externes

D’abord, enregistrez la position du composant de lien à l’intérieur du package ; n’accédez pas à la cible de lien dans le script. Après avoir sauvegardé à nouveau, vérifiez manuellement si le rafraîchissement est normal.

Si tu n’as besoin que de lire des données

Vous pouvez envisager le mode lecture seule, mais notez que dans ce mode, les paramètres keep_links et keep_vba sont invalides.

Si le fichier provient du client et contient du contenu sensible

D’abord, conservez l’original, utilisez l’échantillon désensibilisé pour les tests, puis relisez les résultats selon les éléments d’acceptation.

❓ Foire aux questions (FAQ)

1. Est-ce que keep_links=Vrai signifie que des liens externes sont toujours disponibles ?

Non. keep_links conserve les définitions de liens du XML, mais ne garantit pas que les caches de données externes restent valides après le restockage. Rafraîchir la cible peut toujours entraîner des erreurs lorsqu’elle est inaccessible.

2. Que se passe-t-il avec les macros lors du chargement et de l’enregistrement par défaut ?

keep_vba est par défaut False, et le projet VBA dans le fichier original sera supprimé lors de la sauvegarde. Si vous devez le garder, vous devez explicitement définir keep_vba=True.

3. Si un composant VBA est détecté, le script peut-il déterminer si la macro est sûre ?

Non. La présence de composants ne signifie pas que le contenu est sûr ou que les macros sont valides ; les scripts ne doivent pas exécuter de macros et doivent inciter à une revue ultérieure.

4. Les liens et macros peuvent-ils être conservés en mode lecture seule ?

Non. En mode read_only=True, les paramètres keep_links et keep_vba sont invalides.

📝 Résumé

Avant de restaurer Excel, inventez d’abord VBA et les composants liés à l’externe, chargez clairement les paramètres et conservez les étapes de révision manuelle. Ensuite, vous pouvez préparer trois fichiers exemples dans l’environnement de test (.xlsx de données pures, macro .xlsm et .xlsx avec liens externes), les charger et les sauvegarder en utilisant respectivement les paramètres par défaut et réservés, et enregistrer les résultats réels dans le tableau ci-dessus. Ce n’est que lorsque vous comprenez les conséquences de chaque paramètre de votre jeu de fichiers qu’il est approprié de déployer des scripts dans le processus de production.

Faites l’expérience dès maintenant : téléchargez votre document pour commencer à traduire, tout en conservant la mise en forme originale

Mis à jour le 2026-11-13