135 votes

Comment enregistrer une nouvelle feuille dans un fichier Excel existant, en utilisant Pandas ?

Je veux utiliser des fichiers excel pour stocker des données élaborées avec python. Mon problème est que je ne peux pas ajouter des feuilles à un fichier excel existant. Je vous propose ici un exemple de code avec lequel vous pouvez travailler pour résoudre ce problème.

import pandas as pd
import numpy as np

path = r"C:\Users\fedel\Desktop\excelData\PhD_data.xlsx"

x1 = np.random.randn(100, 2)
df1 = pd.DataFrame(x1)

x2 = np.random.randn(100, 2)
df2 = pd.DataFrame(x2)

writer = pd.ExcelWriter(path, engine = 'xlsxwriter')
df1.to_excel(writer, sheet_name = 'x1')
df2.to_excel(writer, sheet_name = 'x2')
writer.save()
writer.close()

Ce code enregistre deux DataFrames dans deux feuilles, nommées respectivement "x1" et "x2". Si je crée deux nouveaux DataFrames et que j'essaie d'utiliser le même code pour ajouter deux nouvelles feuilles, "x3" et "x4", les données originales sont perdues.

import pandas as pd
import numpy as np

path = r"C:\Users\fedel\Desktop\excelData\PhD_data.xlsx"

x3 = np.random.randn(100, 2)
df3 = pd.DataFrame(x3)

x4 = np.random.randn(100, 2)
df4 = pd.DataFrame(x4)

writer = pd.ExcelWriter(path, engine = 'xlsxwriter')
df3.to_excel(writer, sheet_name = 'x3')
df4.to_excel(writer, sheet_name = 'x4')
writer.save()
writer.close()

Je veux un fichier excel avec quatre feuilles : x1', 'x2', 'x3', 'x4'. Je sais que "xlsxwriter" n'est pas le seul "moteur", il y a aussi "openpyxl". J'ai également vu que d'autres personnes ont déjà écrit sur ce sujet, mais je n'arrive toujours pas à comprendre comment faire.

Voici un code tiré de ce document lien

import pandas
from openpyxl import load_workbook

book = load_workbook('Masterfile.xlsx')
writer = pandas.ExcelWriter('Masterfile.xlsx', engine='openpyxl') 
writer.book = book
writer.sheets = dict((ws.title, ws) for ws in book.worksheets)

data_filtered.to_excel(writer, "Main", cols=['Diff1', 'Diff2'])

writer.save()

On dit que ça marche, mais il est difficile de savoir comment. Je ne comprends pas ce que sont "ws.title", "ws" et "dict" dans ce contexte.

Quelle est la meilleure façon d'enregistrer "x1" et "x2", puis de fermer le fichier, de l'ouvrir à nouveau et d'ajouter "x3" et "x4" ?

177voto

Stefano Fedele Points 1163

Merci. Je pense qu'un exemple complet pourrait être utile à tous ceux qui ont le même problème :

import pandas as pd
import numpy as np

path = r"C:\Users\fedel\Desktop\excelData\PhD_data.xlsx"

x1 = np.random.randn(100, 2)
df1 = pd.DataFrame(x1)

x2 = np.random.randn(100, 2)
df2 = pd.DataFrame(x2)

writer = pd.ExcelWriter(path, engine = 'xlsxwriter')
df1.to_excel(writer, sheet_name = 'x1')
df2.to_excel(writer, sheet_name = 'x2')
writer.save()
writer.close()

Ici, je génère un fichier excel, d'après ce que j'ai compris, il n'est pas vraiment important qu'il soit généré via le moteur "xslxwriter" ou "openpyxl".

Quand je veux écrire sans perdre les données originales, alors

import pandas as pd
import numpy as np
from openpyxl import load_workbook

path = r"C:\Users\fedel\Desktop\excelData\PhD_data.xlsx"

book = load_workbook(path)
writer = pd.ExcelWriter(path, engine = 'openpyxl')
writer.book = book

x3 = np.random.randn(100, 2)
df3 = pd.DataFrame(x3)

x4 = np.random.randn(100, 2)
df4 = pd.DataFrame(x4)

df3.to_excel(writer, sheet_name = 'x3')
df4.to_excel(writer, sheet_name = 'x4')
writer.save()
writer.close()

ce code fait l'affaire !

0 votes

une idée, pourquoi quand j'essaie ceci j'obtiens : ValueError : No Excel writer 'Sales Leads Calculations.xlsx' ?

1 votes

oui, il s'agit d'ajouter la feuille à l'excel sans effacer les feuilles préexistantes. Merci !

0 votes

comment gérer les choses si le fichier n'existe pas ? J'obtiens un FileNotFoundError exception à la book =.. ligne.

17voto

Grr Points 6929

Dans l'exemple que vous avez partagé, vous chargez le fichier existant en book et la mise en place de la writer.book valeur pour être book . Dans la ligne writer.sheets = dict((ws.title, ws) for ws in book.worksheets) vous accédez à chaque feuille du classeur en tant que ws . Le titre de la feuille est alors ws vous créez donc un dictionnaire de {sheet_titles: sheet} paires clé-valeur. Ce dictionnaire est ensuite placé dans writer.sheets. Pour l'essentiel, ces étapes consistent à charger les données existantes à partir de la base de données de l'UE. 'Masterfile.xlsx' et de peupler votre écrivain avec eux.

Maintenant, disons que vous avez déjà un fichier avec x1 et x2 comme des feuilles. Vous pouvez utiliser le code d'exemple pour charger le fichier et ensuite faire quelque chose comme ceci pour ajouter x3 et x4 .

path = r"C:\Users\fedel\Desktop\excelData\PhD_data.xlsx"
writer = pd.ExcelWriter(path, engine='openpyxl')
df3.to_excel(writer, 'x3', index=False)
df4.to_excel(writer, 'x4', index=False)
writer.save()

Cela devrait faire ce que vous recherchez.

0 votes

une idée, pourquoi quand j'essaie ceci j'obtiens : ValueError : No Excel writer 'Sales Leads Calculations.xlsx' ?

27 votes

il s'agit d'effacer les feuilles préexistantes.

15voto

Pulkit Khandelwal Points 101

Pour créer un nouveau fichier

x1 = np.random.randn(100, 2)
df1 = pd.DataFrame(x1)
with pd.ExcelWriter('sample.xlsx') as writer:  
    df1.to_excel(writer, sheet_name='x1')

Pour l'ajout au fichier, utilisez l'argument mode='a' sur pd.ExcelWriter .

x2 = np.random.randn(100, 2)
df2 = pd.DataFrame(x2)
with pd.ExcelWriter('sample.xlsx', engine='openpyxl', mode='a') as writer:  
    df2.to_excel(writer, sheet_name='x2')

La valeur par défaut est mode ='w' . Voir documentation .

0 votes

Cette solution n'a pas écrasé les feuilles précédentes pour moi.

15voto

WONG TAT YAU Points 361

Un exemple simple pour écrire plusieurs données dans Excel à la fois. Et aussi lorsque vous voulez ajouter des données à une feuille d'un fichier excel écrit (fichier excel fermé).

Lorsque c'est la première fois que vous écrivez à un excel. (Ecriture de "df1" et "df2" sur "1st_sheet" et "2nd_sheet")

import pandas as pd 
from openpyxl import load_workbook

df1 = pd.DataFrame([[1],[1]], columns=['a'])
df2 = pd.DataFrame([[2],[2]], columns=['b'])
df3 = pd.DataFrame([[3],[3]], columns=['c'])

excel_dir = "my/excel/dir"

with pd.ExcelWriter(excel_dir, engine='xlsxwriter') as writer:    
    df1.to_excel(writer, '1st_sheet')   
    df2.to_excel(writer, '2nd_sheet')   
    writer.save()    

Après avoir fermé votre excel, vous souhaitez "ajouter" des données sur le même fichier excel mais sur une autre feuille, disons "df3", au nom de la feuille "3rd_sheet".

book = load_workbook(excel_dir)
with pd.ExcelWriter(excel_dir, engine='openpyxl') as writer:
    writer.book = book
    writer.sheets = dict((ws.title, ws) for ws in book.worksheets)    

    ## Your dataframe to append. 
    df3.to_excel(writer, '3rd_sheet')  

    writer.save()     

Notez que le format excel ne doit pas être xls, vous pouvez utiliser xlsx.

2 votes

Je ne vois pas ce que cette réponse apporte. En fait, l'utilisation répétée d'un gestionnaire de contexte comme celui-ci impliquera beaucoup plus d'entrées/sorties.

8voto

Charlie Clark Points 322

Je vous recommande vivement de travailler directement avec openpyxl puisqu'il supporte maintenant les DataFrames de Pandas .

Cela vous permet de vous concentrer sur le code Excel et Pandas pertinent.

4 votes

Il serait vraiment utile d'ajouter un peu plus d'exemples de "Pandas" semblables à ceux qui suivent ce

0 votes

Je ne travaille pas beaucoup avec Pandas moi-même, je ne peux donc pas vraiment fournir beaucoup d'exemples, mais je serais heureux d'améliorer la documentation.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X