Table des matières
『Description du problème』
Maison développement back-end Tutoriel Python Comment Python traite-t-il les fichiers Excel ?

Comment Python traite-t-il les fichiers Excel ?

May 08, 2023 pm 05:58 PM
excel python

『Description du problème』

Le fichier Excel à traiter cette fois comporte deux feuilles et la valeur de l'autre feuille doit être calculée en fonction des données d'une feuille. Le problème est que la feuille à calculer contient non seulement des valeurs numériques, mais aussi des formules. Jetons un coup d'oeil :

Comment Python traite-t-il les fichiers Excel ?

Comme le montre l'image ci-dessus, cet Excel comporte deux feuilles : CP et DS Nous devons suivre certaines règles commerciales et calculer les données des cellules correspondant à DS en fonction des données de CP. . Les cases bleues de l'image contiennent des formules, tandis que d'autres zones contiennent des valeurs numériques.

Jetons un coup d'œil, si nous suivons la logique de traitement mentionnée précédemment, lisons Excel dans le dataframe par lots à la fois, puis le réécrivons par lots à la fois, quels sont les problèmes ? Cette partie du code est la suivante :

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

import pandas as pd

import xlwings as xw

  

#要处理的文件路径

fpath = "data/DS_format.xlsm"

  

#把CP和DS两个sheet的数据分别读入pandas的dataframe

cp_df = pd.read_excel(fpath,sheet_name="CP",header=[0])

ds_df = pd.read_excel(fpath,sheet_name="DS",header=[0,1])

  

#计算过程省略......

  

#保存结果到excel      

app = xw.App(visible=False,add_book=False)

ds_format_workbook = app.books.open(fpath)

ds_worksheet = ds_format_workbook.sheets["DS"]

ds_worksheet.range("A1").expand().options(index=False).value = ds_df

ds_format_workbook.save()

ds_format_workbook.close()

app.quit()

Copier après la connexion

Le problème avec le code ci-dessus est que lorsque la méthode pd.read_excel() lit les données d'Excel dans le dataframe, pour les cellules avec des formules, les résultats des calculs de formule seront lus directement (sinon, le résultat est renvoyé sous la forme Nan), et lorsque nous écrivons dans Excel, nous réécrivons directement la trame de données par lots à la fois, de sorte que les cellules avec les formules précédentes soient réécrites avec la valeur calculée ou Nan, et la formule est perdu.

D'accord, un problème est survenu, comment devons-nous le résoudre ? Deux idées me viennent à l'esprit ici :

  • Lors de la réécriture du dataframe dans Excel, ne le réécrivez pas par lots à la fois, mais réécrivez uniquement les données calculées par itération de lignes et de colonnes, en laissant les cellules avec les formules inchangées ;

  • Lors de la lecture d'Excel, existe-t-il un moyen de lire la formule des cellules contenant des formules au lieu de lire les résultats des calculs de formule

J'ai essayé les deux idées ci-dessus, jetons un coup d'œil ?

「Option 1」

Le code suivant tente de parcourir la trame de données et d'écrire la valeur correspondante par cellule. Les cellules avec des formules ne bougent pas

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

#根据ds_df来写excel,只写该写的单元格

for row_idx,row in ds_df.iterrows():

    total_capabity_val = row[('Total','Capabity')].strip()

    total_capabity1_val = row[('Total','Capabity.1')].strip()

    #Total和1Gb  Eqv.所在的行不写

    if total_capabity_val!= 'Total' and total_capabity_val != '1Gb  Eqv.':

        #给Delta和LOI赋值

        if total_capabity1_val == 'LOI' or total_capabity1_val == 'Delta':

            ds_worksheet.range((row_idx + 3 ,3)).value = row[('Current week','BOH')]

            print(f"ds_sheet的第{row_idx + 3}行第3列被设置为{row[('Current week','BOH')]}")

        #给Demand和Supply赋值

        if total_capabity1_val == 'Demand' or total_capabity1_val == 'Supply':

            cp_datetime_columns = cp_df.columns[53:]

            for col_idx in range(4,len(ds_df.columns)):

                ds_datetime = ds_df.columns.get_level_values(1)[col_idx]

                ds_month = ds_df.columns.get_level_values(0)[col_idx]

                if type(ds_datetime) == str and ds_datetime != 'TTL' and ds_datetime != 'Total' and (ds_datetime in cp_datetime_columns):

                    ds_worksheet.range((row_idx + 3,col_idx + 1)).value = row[(f'{ds_month}',f'{ds_datetime}')]

                    print(f"ds_sheet的第{row_idx + 3}行第{col_idx + 1}列被设置为{row[(f'{ds_month}',f'{ds_datetime}')]}")

                elif type(ds_datetime) == datetime.datetime and (ds_datetime in cp_datetime_columns):

                    ds_worksheet.range((row_idx + 3,col_idx + 1)).value = row[(f'{ds_month}',ds_datetime)]    

                    print(f"ds_sheet的第{row_idx + 3}行第{col_idx + 1}列被设置为{row[(f'{ds_month}',ds_datetime)]}")

Copier après la connexion

Le code ci-dessus résout en effet le problème, c'est-à-dire les formules pour les cellules avec. Les formules ont été conservées. Cependant, selon les conseils sur le traitement Python d'Excel mentionnés au début de notre article, ce code présente de sérieux problèmes de performances, car il exploite fréquemment les cellules Excel via l'API, ce qui entraîne une écriture très lente. 40 minutes, ce qui était tout simplement inacceptable, le plan a donc dû être abandonné.

「Option 2」

Cette idée est de conserver la valeur de la formule lors de la lecture de cellules avec des valeurs de formule dans Excel. Cela ne peut être trouvé qu'à partir de l'API de chaque bibliothèque Python Excel pour voir s'il existe une méthode correspondante. J'ai regardé attentivement la méthode read_excel() de Pandas et il n'y a pas de support de paramètre correspondant. J'ai trouvé une API qui peut prendre en charge Openpyxl, comme suit :

1

2

3

4

import openpyxl

ds_format_workbook = openpyxl.load_workbook(fpath,data_only=False)

ds_wooksheet = ds_format_workbook['DS']

ds_df =  pd.DataFrame(ds_wooksheet.values)

Copier après la connexion

La clé est le paramètre data_only ici. S'il est vrai, les données seront renvoyées. S'il est faux, la valeur de la formule peut être conservée

. J'ai trouvé la solution correspondante. C'était une bonne affaire. Salut, mais quand j'ai vu la structure des données dans la trame de données lue via openpyxl, j'ai été choqué. Parce que l'en-tête de mon tableau Excel est un en-tête à deux niveaux relativement complexe, et qu'il existe des situations où les cellules sont fusionnées et divisées dans l'en-tête, une fois qu'un tel en-tête est lu dans le dataframe par openpyxl, il ne suit pas le multi-niveau. en-tête des pandas. L'index est traité, mais il est simplement transformé en un index numérique 0123...

Mais mon calcul de la trame de données reposera sur une indexation multi-niveaux, donc cette méthode de traitement d'openpyxl rend mes calculs ultérieurs incapables. processus.

openpyxl ne fonctionne pas, qu'en est-il de xlwings ? Après avoir parcouru la documentation de l'API xlwings, je l'ai trouvée, comme indiqué ci-dessous :

Comment Python traite-t-il les fichiers Excel ?

La classe Range fournit une propriété appelée formule, qui peut obtenir et définir une formule.

Quand j'ai vu cela, j'ai eu l'impression d'avoir trouvé un trésor et j'ai rapidement commencé à pratiquer le code. Peut-être par inertie, ou peut-être ai-je été effrayé par l'efficacité du fonctionnement d'Excel par ligne, colonne et cellule dans le passé, la première solution à laquelle j'ai pensé a été de le faire par lots à la fois, c'est-à-dire de lire toutes les formules. dans Excel à la fois, puis écrivez-les tous en même temps. Revenez en arrière, donc mon code initial était comme ceci :

1

2

3

4

5

6

7

8

9

10

11

#使用xlwings来读取formula

app = xw.App(visible=False,add_book=False)

ds_format_workbook = app.books.open(fpath)

ds_worksheet = ds_format_workbook.sheets["DS"]

#先把所有公式一次性读取并保存下来

formulas = ds_worksheet.used_range.formula

  

#中间计算过程省略...

  

#一次性把所有公式写回去

ds_worksheet.used_range.formula = formulas

Copier après la connexion

Mais j'ai mal pensé ds_worksheet.used_range.formula m'a fait mal comprendre que la formule ne renverrait que les cellules avec des formules. dans Excel, mais en fait il renvoie toutes les cellules, seules les formules sont conservées pour les cellules avec des formules. Ainsi, lorsque je réécrirai la formule, elle écrasera les autres valeurs que j'ai calculées via le dataframe et écrites dans Excel.

Si tel est le cas, alors je ne peux traiter les cellules avec les formules que séparément au lieu de les traiter toutes en même temps, donc le code doit être écrit comme ceci :

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

#使用xlwings来读取formula

app = xw.App(visible=False,add_book=False)

ds_format_workbook = app.books.open(fpath)

ds_worksheet = ds_format_workbook.sheets["DS"]

  

#保留excel中的formula

#找到DS中Total所在的行,Total之后的行都是formula

row = ds_df.loc[ds_df[('Total','Capabity')]=='Total ']

total_row_index = row.index.values[0]

#获取对应excel的行号(dataframe把两层表头当做索引,从数据行开始计数,而且从0开始计数。excel从表头就开始计数,而且从1开始计数)

excel_total_row_idx = int(total_row_index+2)

#获取excel最后一行的索引

excel_last_row_idx = ds_worksheet.used_range.rows.count

#保留按日期计算的各列的formula

I_col_formula = ds_worksheet.range(f'I3:I{excel_total_row_idx}').formula

N_col_formula = ds_worksheet.range(f'N3:N{excel_total_row_idx}').formula

T_col_formula = ds_worksheet.range(f'T3:T{excel_total_row_idx}').formula

U_col_formula = ds_worksheet.range(f'U3:U{excel_total_row_idx}').formula

Z_col_formula = ds_worksheet.range(f'Z3:Z{excel_total_row_idx}').formula

AE_col_formula = ds_worksheet.range(f'AE3:AE{excel_total_row_idx}').formula

AK_col_formula = ds_worksheet.range(f'AK3:AK{excel_total_row_idx}').formula

AL_col_formula = ds_worksheet.range(f'AL3:AL{excel_total_row_idx}').formula

#保留Total行开始一直到末尾所有行的formula

total_to_last_formula = ds_worksheet.range(f'A{excel_total_row_idx+1}:AL{excel_last_row_idx}').formula

  

#中间计算过程省略...

  

#保存结果到excel                

#直接把ds_df完整赋值给excel,会导致excel原有的公式被值覆盖

ds_worksheet.range("A1").expand().options(index=False).value = ds_df

#用之前保留的formulas,重置公式

ds_worksheet.range(f'I3:I{excel_total_row_idx}').formula = I_col_formula

ds_worksheet.range(f'N3:N{excel_total_row_idx}').formula = N_col_formula

ds_worksheet.range(f'T3:T{excel_total_row_idx}').formula = T_col_formula

ds_worksheet.range(f'U3:U{excel_total_row_idx}').formula = U_col_formula

ds_worksheet.range(f'Z3:Z{excel_total_row_idx}').formula = Z_col_formula

ds_worksheet.range(f'AE3:AE{excel_total_row_idx}').formula = AE_col_formula

ds_worksheet.range(f'AK3:AK{excel_total_row_idx}').formula = AK_col_formula

ds_worksheet.range(f'AL3:AL{excel_total_row_idx}').formula = AL_col_formula

ds_worksheet.range(f'A{excel_total_row_idx+1}:AL{excel_last_row_idx}').formula = total_to_last_formula

  

ds_format_workbook.save()

ds_format_workbook.close()

app.quit()

Copier après la connexion
Après test, le code ci-dessus répond parfaitement à mes besoins, et les performances sont également bonnes.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn

Outils d'IA chauds

Undresser.AI Undress

Undresser.AI Undress

Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover

AI Clothes Remover

Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool

Undress AI Tool

Images de déshabillage gratuites

Clothoff.io

Clothoff.io

Dissolvant de vêtements AI

AI Hentai Generator

AI Hentai Generator

Générez AI Hentai gratuitement.

Article chaud

R.E.P.O. Crystals d'énergie expliqués et ce qu'ils font (cristal jaune)
1 Il y a quelques mois By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Meilleurs paramètres graphiques
1 Il y a quelques mois By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Comment réparer l'audio si vous n'entendez personne
1 Il y a quelques mois By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Commandes de chat et comment les utiliser
1 Il y a quelques mois By 尊渡假赌尊渡假赌尊渡假赌

Outils chauds

Bloc-notes++7.3.1

Bloc-notes++7.3.1

Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise

SublimeText3 version chinoise

Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1

Envoyer Studio 13.0.1

Puissant environnement de développement intégré PHP

Dreamweaver CS6

Dreamweaver CS6

Outils de développement Web visuel

SublimeText3 version Mac

SublimeText3 version Mac

Logiciel d'édition de code au niveau de Dieu (SublimeText3)

PHP et Python: exemples de code et comparaison PHP et Python: exemples de code et comparaison Apr 15, 2025 am 12:07 AM

PHP et Python ont leurs propres avantages et inconvénients, et le choix dépend des besoins du projet et des préférences personnelles. 1.Php convient au développement rapide et à la maintenance des applications Web à grande échelle. 2. Python domine le domaine de la science des données et de l'apprentissage automatique.

Comment entraîner le modèle Pytorch sur Centos Comment entraîner le modèle Pytorch sur Centos Apr 14, 2025 pm 03:03 PM

Une formation efficace des modèles Pytorch sur les systèmes CentOS nécessite des étapes, et cet article fournira des guides détaillés. 1. Préparation de l'environnement: Installation de Python et de dépendance: le système CentOS préinstalle généralement Python, mais la version peut être plus ancienne. Il est recommandé d'utiliser YUM ou DNF pour installer Python 3 et Mettez PIP: sudoyuMupDatePython3 (ou sudodnfupdatepython3), pip3install-upradepip. CUDA et CUDNN (accélération GPU): Si vous utilisez Nvidiagpu, vous devez installer Cudatool

Explication détaillée du principe docker Explication détaillée du principe docker Apr 14, 2025 pm 11:57 PM

Docker utilise les fonctionnalités du noyau Linux pour fournir un environnement de fonctionnement d'application efficace et isolé. Son principe de travail est le suivant: 1. Le miroir est utilisé comme modèle en lecture seule, qui contient tout ce dont vous avez besoin pour exécuter l'application; 2. Le Système de fichiers Union (UnionFS) empile plusieurs systèmes de fichiers, ne stockant que les différences, l'économie d'espace et l'accélération; 3. Le démon gère les miroirs et les conteneurs, et le client les utilise pour l'interaction; 4. Les espaces de noms et les CGROUP implémentent l'isolement des conteneurs et les limitations de ressources; 5. Modes de réseau multiples prennent en charge l'interconnexion du conteneur. Ce n'est qu'en comprenant ces concepts principaux que vous pouvez mieux utiliser Docker.

Comment est la prise en charge du GPU pour Pytorch sur Centos Comment est la prise en charge du GPU pour Pytorch sur Centos Apr 14, 2025 pm 06:48 PM

Activer l'accélération du GPU Pytorch sur le système CentOS nécessite l'installation de versions CUDA, CUDNN et GPU de Pytorch. Les étapes suivantes vous guideront tout au long du processus: CUDA et CUDNN Installation détermineront la compatibilité de la version CUDA: utilisez la commande NVIDIA-SMI pour afficher la version CUDA prise en charge par votre carte graphique NVIDIA. Par exemple, votre carte graphique MX450 peut prendre en charge CUDA11.1 ou plus. Téléchargez et installez Cudatoolkit: visitez le site officiel de Nvidiacudatoolkit et téléchargez et installez la version correspondante selon la version CUDA la plus élevée prise en charge par votre carte graphique. Installez la bibliothèque CUDNN:

Python vs JavaScript: communauté, bibliothèques et ressources Python vs JavaScript: communauté, bibliothèques et ressources Apr 15, 2025 am 12:16 AM

Python et JavaScript ont leurs propres avantages et inconvénients en termes de communauté, de bibliothèques et de ressources. 1) La communauté Python est amicale et adaptée aux débutants, mais les ressources de développement frontal ne sont pas aussi riches que JavaScript. 2) Python est puissant dans les bibliothèques de science des données et d'apprentissage automatique, tandis que JavaScript est meilleur dans les bibliothèques et les cadres de développement frontaux. 3) Les deux ont des ressources d'apprentissage riches, mais Python convient pour commencer par des documents officiels, tandis que JavaScript est meilleur avec MDNWEBDOCS. Le choix doit être basé sur les besoins du projet et les intérêts personnels.

Comment choisir la version Pytorch sous Centos Comment choisir la version Pytorch sous Centos Apr 14, 2025 pm 02:51 PM

Lors de la sélection d'une version Pytorch sous CentOS, les facteurs clés suivants doivent être pris en compte: 1. CUDA Version Compatibilité GPU Prise en charge: si vous avez NVIDIA GPU et que vous souhaitez utiliser l'accélération GPU, vous devez choisir Pytorch qui prend en charge la version CUDA correspondante. Vous pouvez afficher la version CUDA prise en charge en exécutant la commande nvidia-SMI. Version CPU: Si vous n'avez pas de GPU ou que vous ne souhaitez pas utiliser de GPU, vous pouvez choisir une version CPU de Pytorch. 2. Version Python Pytorch

Miniopen Centos Compatibilité Miniopen Centos Compatibilité Apr 14, 2025 pm 05:45 PM

Minio Object Storage: Déploiement haute performance dans le système Centos System Minio est un système de stockage d'objets distribué haute performance développé sur la base du langage Go, compatible avec Amazons3. Il prend en charge une variété de langages clients, notamment Java, Python, JavaScript et GO. Cet article introduira brièvement l'installation et la compatibilité de Minio sur les systèmes CentOS. Compatibilité de la version CentOS Minio a été vérifiée sur plusieurs versions CentOS, y compris, mais sans s'y limiter: CentOS7.9: fournit un guide d'installation complet couvrant la configuration du cluster, la préparation de l'environnement, les paramètres de fichiers de configuration, le partitionnement du disque et la mini

Comment installer nginx dans Centos Comment installer nginx dans Centos Apr 14, 2025 pm 08:06 PM

CENTOS L'installation de Nginx nécessite de suivre les étapes suivantes: Installation de dépendances telles que les outils de développement, le devet PCRE et l'OpenSSL. Téléchargez le package de code source Nginx, dézippez-le et compilez-le et installez-le, et spécifiez le chemin d'installation AS / USR / LOCAL / NGINX. Créez des utilisateurs et des groupes d'utilisateurs de Nginx et définissez les autorisations. Modifiez le fichier de configuration nginx.conf et configurez le port d'écoute et le nom de domaine / adresse IP. Démarrez le service Nginx. Les erreurs communes doivent être prêtées à prêter attention, telles que les problèmes de dépendance, les conflits de port et les erreurs de fichiers de configuration. L'optimisation des performances doit être ajustée en fonction de la situation spécifique, comme l'activation du cache et l'ajustement du nombre de processus de travail.

See all articles