28 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 fiches à un fichier excel. Ici je vous propose un exemple de code pour les travaux afin de parvenir à cette question

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 permet d'économiser deux DataFrames à deux feuilles, nommé "x1" et "x2", respectivement. Si j'ai créer deux nouveaux DataFrames et essayez d'utiliser le même code pour ajouter deux nouvelles feuilles, 'x3' et 'x4', les données d'origine est perdue.

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 est "openpyxl'. J'ai aussi vu qu'il y a déjà d'autres personnes qui ont écrit sur cette question, mais je ne peux pas comprendre comment le faire.

Voici un code à partir de ce 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()

Ils disent que cela fonctionne, mais il est difficile de comprendre comment. Je ne comprends pas ce que "ws.titre", "ws", et "dict" sont dans ce contexte.

Qui est le meilleur moyen d'économiser de "x1" et "x2", puis fermez le fichier, l'ouvrir à nouveau et ajouter "x3" et "x4"?

37voto

Stefano Fedele Points 1163

Je vous remercie. Je crois qu'un exemple complet pourrait être bon pour quiconque a un 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 je comprends, peu importe qu'il soit généré via le moteur "xslxwriter" ou "openpyxl".

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

 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 le travail!

12voto

Grr Points 6929

Dans l'exemple que vous avez partagé vous chargez le fichier existant en book et réglage de l' writer.book valeur book. Dans la ligne writer.sheets = dict((ws.title, ws) for ws in book.worksheets) vous accédez à chaque feuille dans le classeur en tant que ws. Le titre de la fiche est alors ws de sorte que vous êtes la création d'un dictionnaire de {sheet_titles: sheet} - clés, des paires de valeurs. Ce dictionnaire est alors définie à l'écrivain.les draps. Essentiellement, ces mesures sont tout de chargement de données existantes à partir d' 'Masterfile.xlsx' et le remplissage de votre écrivain avec eux.

Maintenant, disons que vous avez déjà un fichier avec l' x1 et x2 que les feuilles. Vous pouvez utiliser l'exemple de code pour charger le fichier et pourrait 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()

Que devrait faire ce que vous êtes recherche pour.

8voto

WONG TAT YAU Points 361

Un exemple simple pour l'écriture de plusieurs données vers excel à un moment. Et aussi quand vous voulez pour ajouter les données à une feuille sur un écrit de fichier excel (fermé fichier excel).

Quand c'est votre première fois à la rédaction d'un document excel. (L'écriture "df1" et "df2" à "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 la fermeture de votre excel, mais vous souhaitez ajouter des données sur le même fichier excel, mais une autre feuille, disons-le, "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()     

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

7voto

Charlie Clark Points 322

Je vous recommande fortement de travailler directement avec openpyxl car il prend désormais en charge Pandas DataFrames .

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

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: