La formule lue par Excel devient Aucune. Ne soupçonnez pas que le fichier est endommagé.

Lorsque vous utilisez data_only=True d'openpyxl pour lire Excel, la formule devient None ? Le fichier n'est pas corrompu, c'est le résultat du calcul qui n'est pas mis en cache. Cet article utilise un exemple de synthèse de mémoire pour vérifier les limites comportementales de la bibliothèque et joint une liste de contrôle d'acceptation pour vous aider à faire la distinction entre ce qui est techniquement correct et ce qui est utilisable en entreprise.

Lorsque vous utilisez openpyxl pour lire Excel, si vous définissez data_only=True mais obtenez None, il ne s'agit généralement pas d'une corruption de fichier ou d'un bogue dans la bibliothèque, mais du fait qu'il n'y a aucun résultat de calcul mis en cache lisible dans le fichier.

Cet article est destiné aux développeurs et aux spécialistes des données qui utilisent du code pour générer ou traiter des rapports Excel. Vous avez peut-être rencontré un tableau généré par un script automatisé et les colonnes de formule lisent toutes les valeurs vides, vous soupçonnez donc qu'il y a un problème avec le fichier. Après avoir lu cet article, vous serez en mesure de faire la distinction entre « manque de cache » et « corruption de fichier », de savoir quelle méthode de lecture utiliser et d'utiliser une liste de contrôle d'acceptation pour déterminer si les données sont réellement disponibles.

Les exemples de cet article utilisent des échantillons synthétiques et servent uniquement à vérifier les limites comportementales de la bibliothèque. Ils ne représentent pas une garantie de tous les fichiers réels ou effets du produit. Avant de traiter des documents importants, veuillez conserver les originaux, puis les examiner en fonction des limites et des éléments d'acceptation du texte.

Que dois-je faire si la formule indique Aucun ? Conclusion en une phrase

Si vous avez besoin de la valeur calculée par la formule, mais que data_only=True renvoie None, vérifiez d'abord s'il existe une valeur en cache dans le fichier, puis décidez s'il faut recalculer et enregistrer ou utiliser d'autres méthodes de lecture.

votre situationPratiques recommandéesraison
data_only=True renvoie None, le fichier est généré par le codeConfirmez d'abord s'il existe une valeur en cache, puis décidez s'il faut recalculerLes fichiers générés par le code n'ont généralement que des formules et aucun cache <v>
Besoin d'afficher ou de réanalyser le texte de la formuleLire en utilisant data_only=FalseCe qui est renvoyé est la chaîne de formule, telle que '=1+2'
Une valeur numérique est requise pour participer à l'opération, mais le cache est manquant.Utilisez Excel ou LibreOffice pour recalculer et enregistrer, ou connectez-vous à un service de calcul externe pour rempliropenpyxl lui-même n'a pas de moteur de calcul
Certaines cellules sont NoneMarquez les positions manquantes, recalculez par lots ou invitez les utilisateurs à terminerIl peut s'agir d'un état mixte causé par une épargne progressive
La formule croisée ou matricielle renvoie NoneVérifiez les chemins de référence et les modes de calcul et vérifiez manuellementLe contexte est manquant ou le tableau dynamique n'est pas développé

La vraie signification des paramètres data_only

La clé pour comprendre ce problème est de faire la distinction entre « formule » et « résultats de formules mis en cache ». Dans le standard OOXML, une cellule contenant une formule se compose de deux parties :

  • La balise <f> contient le texte de formule, tel que SUM(A1:A10).
  • La balise <v> stocke la valeur après le dernier calcul.

Le paramètre data_only de load_workbook contrôle la stratégie de lecture, pas le comportement de calcul.

  • Lorsque data_only=False (valeur par défaut), cell.value renvoie la chaîne de formule.
  • Lorsque data_only=True, cell.value renvoie le contenu de la balise <v>.

Si le fichier est généré par du code pur, ou si un recalcul complet n'est pas déclenché avant l'enregistrement, il n'y aura pas de nœud <v> dans le XML et la valeur de retour sera naturellement None. Il ne s’agit pas d’une perte de données, c’est simplement qu’il n’y a jamais eu d’instantané des résultats calculés à cet endroit. De nombreux rapports générés par des pipelines automatisés rencontreront ce problème, car le script de génération n'écrit généralement que des formules et n'est pas responsable de l'exécution des calculs.

Exemple synthétique : échec de cache et lecture normale

Pour reproduire avec précision ce comportement, nous avons construit deux échantillons synthétiques contrôlés. Il ne s'agit pas d'un test des fichiers existants, mais d'une vérification logique du comportement de la bibliothèque.

Scénario normal : le fichier a été ouvert et enregistré dans Excel, contenait la formule =1+2 et la valeur mise en cache était 3. Définissez data_only=True sur read, en espérant afficher l'entier 3.

Scénario manquant : Le fichier est uniquement écrit avec la formule =1+2 via le code, et n'est jamais calculé et enregistré par Excel. En définissant data_only=True sur lecture, la sortie attendue est None ; si data_only=False est utilisé à la place, la chaîne '=1+2' est renvoyée.

Le code suivant construit les deux états ci-dessus en mémoire et vérifie le comportement de lecture de openpyxl. Il est recommandé d'exécuter dans un environnement avec des dépendances verrouillées, et openpyxl>=3.1.0 est recommandé. Le code ne s'appuie pas sur des fichiers externes et toutes les assertions sont conçues sur la base du comportement déterministe de la bibliothèque.

from openpyxl import Workbook, load_workbook
from io import BytesIO

def create_formula_xlsx(has_cache: bool) -> bytes:
    """合成含公式的xlsx字节流。has_cache仅为逻辑标记,openpyxl无法生成真实缓存值。"""
    wb = Workbook()
    ws = wb.active
    ws['A1'] = '=1+2'
    # 注意:无论has_cache为何值,openpyxl保存的文件均不含<v>缓存节点。
    # 真实有缓存的文件需手动用Excel/LibreOffice打开保存后替换此函数输入。
    buffer = BytesIO()
    wb.save(buffer)
    return buffer.getvalue()

# 场景1:模拟无缓存文件(代码生成常态)
xlsx_bytes = create_formula_xlsx(has_cache=False)
wb_data = load_workbook(BytesIO(xlsx_bytes), data_only=True)
assert wb_data.active['A1'].value is None, "无缓存时data_only应返回None"

# 场景2:回退读取公式文本
wb_formula = load_workbook(BytesIO(xlsx_bytes), data_only=False)
assert wb_formula.active['A1'].value == '=1+2', "data_only=False应返回公式"

print("行为验证完成:缓存缺失时返回None符合预期")

Ce code illustre que openpyxl lui-même ne peut pas créer de valeurs mises en cache. Si vous avez besoin de tester la branche "mis en cache", vous devez préparer un vrai fichier calculé et enregistré par Excel ou LibreOffice en entrée. create_formula_xlsx ne peut générer que des échantillons non mis en cache. Ceci est déterminé par les limites des capacités de la bibliothèque et ne constitue pas un défaut de l'exemple.

Pour faire face à cette situation, la bonne manière n'est pas de « réparer » de force None au niveau de la couche de lecture, mais d'établir une stratégie de rétrogradation au niveau de la couche métier : lorsqu'un manque de cache est détecté, soit vous revenez à la lecture du texte de la formule et le marquez, soit vous appelez un service de calcul externe pour recalculer puis remplir. Supposer directement que data_only=True peut toujours obtenir la valeur est une source courante d'erreurs dans le traitement ultérieur des données.

📊 Comparaison de base

Article comparatifdata_only=False (par défaut)data_only=True
cell.value renvoie le contenuChaîne de formule, telle que '=1+2'Valeur du cache enregistrée dans <v>, telle que 3
Quand le cache manquerenvoie toujours le texte de la formuleRetour à None
Adapté à la scèneAffichage, formule analytique quadratiqueLire une valeur calculée
Remarque sur l'utilisationNe peut pas participer directement aux opérations numériquesOn ne peut pas supposer qu'il doit y avoir une valeur numérique

Critères d'acceptation et limites de révision manuelle

Lors du traitement de documents contenant beaucoup de formules, vous ne pouvez pas juger que la lecture est réussie simplement parce qu'« aucune erreur n'est signalée ». Le tableau ci-dessous fait la distinction entre l'exactitude au niveau du code et la convivialité au niveau métier.

Observer les phénomènesJugement techniquedécisions de traitement des affairesSi une révision manuelle est requise
data_only=True renvoie Noneéchec du cache, erreur de non-analyseVérifiez le processus de génération du fichier source ; si des valeurs numériques sont requises, utilisez un moteur de calcul externe pour recalculerOui, confirmez si la logique de la formule est correcte
data_only=False renvoie la chaîne de formuleLire le texte de la formule normalementPeut être utilisé pour l'affichage ou l'analyse secondaire et ne peut pas être directement impliqué dans des opérations numériques.Non, sauf si la syntaxe de la formule est anormale
Certaines cellules ont des valeurs, d'autres sont des NoneStatut mixte, peut être dû à une économie incrémentielleMarquez les positions manquantes, recalculez par lots ou invitez les utilisateurs à terminerOui, résoudre les raisons de l'échec des calculs dans des domaines spécifiques
Toutes les cellules de formule sont NoneIl y a une forte probabilité que le fichier n'ait été ouvert par aucun logiciel bureautiqueRejeter en tant que source de données et exiger en amont la réexportationOui, confirmez la configuration de la chaîne d'outils en amont
La formule croisée ou matricielle renvoie None, mais avec cacheLe contexte est manquant ou le tableau dynamique n'est pas développéVérifiez le chemin de référence et le mode de calcul pour éviter les échecs après la migrationOui, vérifier l'exhaustivité des dépendances de la formule

Cette liste s'applique uniquement au scénario « lecture de la valeur mise en cache existante ». Si votre exigence est « logique de formule d'analyse » ou « formule de calcul dynamique », le mode data_only ne convient pas. De plus, les cellules impliquant des références entre classeurs, des formules matricielles ou des fonctions personnalisées, même si elles ont des valeurs mises en cache, peuvent devenir non valides en raison d'un contexte manquant après la migration. De telles situations doivent être incluses dans le champ d’application de l’examen manuel.

🎯 Quelle méthode vous convient ?

Si vous avez besoin de la valeur calculée par la formule

Utilisez d'abord Excel ou LibreOffice pour ouvrir et enregistrer le fichier, générer un cache, puis utilisez data_only=True pour le lire.

Si vous avez uniquement besoin d'afficher ou d'analyser le texte de la formule

Utilisez le data_only=False par défaut pour lire directement la chaîne de formule.

Si vos fichiers sont générés par lots par un programme

Ajoutez une étape de recalcul au processus de génération ou connectez-vous à un service informatique externe pour remplir le cache afin d'éviter de lire None en aval.

Si vous constatez qu'un grand nombre de cellules sont vides

Vérifiez d'abord si l'amont a été traité par un logiciel bureautique, puis décidez s'il faut ou non exiger une réexportation.

❓ Questions fréquemment posées (FAQ)

1. Si la cellule de formule renvoie None, cela signifie-t-il que le fichier est endommagé ?

incertain. Cela indique généralement qu'il n'y a aucun calcul en cache pour la cellule et que le fichier lui-même est peut-être complet.

2. Quelle est la différence entre data_only=True et data_only=False ?

data_only=False renvoie la chaîne de formule et data_only=True renvoie la valeur mise en cache écrite lors de la dernière sauvegarde.

3. openpyxl peut-il calculer la formule par lui-même et remplir la valeur mise en cache ?

ne peut pas. openpyxl ne dispose pas de moteur de calcul et les fichiers générés par create_formula_xlsx n'ont que des formules et aucun cache.

4. Certaines cellules sont None, que dois-je faire ?

Marquez les positions manquantes, recalculez par lots ou invitez l'utilisateur à terminer et vérifiez si le calcul a échoué dans une zone spécifique.

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

Lors de la traduction de tableaux contenant des formules, distinguez d'abord ceux qui sont du texte, ceux qui sont des formules et des codes métier, puis traduisez-les. Le contrôle post-traduction vérifie non seulement si le chinois a été converti dans la langue cible, mais confirme également que les formules, les identifiants et les relations de référence n'ont pas été modifiés.

OmniDoc (portail produit) fournit un portail de traduction de documents multiformat et le site officiel présente des fonctions d'OCR, de glossaire et de comparaison bilingue. Si l’équipe souhaite démarrer le traitement directement à partir du fichier, ce chemin peut être évalué avec des échantillons réels. Veuillez utiliser les fichiers désensibilisés que vous êtes autorisé à télécharger et utilisez les éléments de vérification de cet article pour examiner les résultats. Cet article ne prétend pas qu'OmniDoc utilise les bibliothèques open source ou les algorithmes internes mentionnés dans l'article, et n'utilise pas non plus d'exemples comme substitut aux tests de performances du produit.

📝Résumé

data_only=True lit None. Dans la plupart des cas, il n'y a aucune valeur de cache dans le fichier, ce qui signifie que le fichier n'est pas endommagé. Faites d'abord la distinction entre les échecs de cache et les erreurs d'analyse, puis déterminez si les données peuvent être utilisées à des fins commerciales selon la liste d'acceptation.

Essayez-le maintenant : téléchargez le document pour lancer la traduction, en conservant la mise en page d'origine.

Références

Suggestions pour l'étape suivante : utilisez d'abord l'exemple de synthèse de l'article pour confirmer que les versions de openpyxl dans votre environnement ont un comportement cohérent ; puis sélectionnez un véritable dossier commercial, lisez-le respectivement avec data_only=True et data_only=False et enregistrez le statut réel par rapport au formulaire d'acceptation ; enfin, décidez s'il faut optimiser le processus de génération en amont ou introduire un service informatique externe pour compléter le cache en fonction du ratio manquant.

Mis à jour le 2026-11-13