Il est assez facile d’ajouter de nombreux cadres de données sur les pandas dans un classeur Excel à condition qu’il s’agisse de feuilles de calcul différentes. Cependant, il est quelque peu délicat de regrouper plusieurs images dans une seule feuille de calcul si vous souhaitez utiliser les fonctionnalités intégrées de pandas dans df.to_Excel.
# Creating Excel Writer Object from Pandas
writer = pd.ExcelWriter('test.xlsx',engine='xlsxwriter')
workbook=writer.book
worksheet=workbook.add_worksheet('Validation')
df.to_Excel(writer,sheet_name='Validation',startrow=0 , startcol=0)
another_df.to_Excel(writer,sheet_name='Validation',startrow=20, startcol=0)
Le code ci-dessus ne fonctionnera pas. Vous obtiendrez l'erreur de
Sheetname 'Validation', with case ignored, is already in use.
Maintenant, j'ai suffisamment expérimenté pour trouver un moyen de le faire fonctionner.
writer = pd.ExcelWriter('test.xlsx',engine='xlsxwriter') # Creating Excel Writer Object from Pandas
workbook=writer.book
df.to_Excel(writer,sheet_name='Validation',startrow=0 , startcol=0)
another_df.to_Excel(writer,sheet_name='Validation',startrow=20, startcol=0)
Cela fonctionnera. Donc, le but de poster cette question sur stackoverflow est double. Premièrement, j'espère que cela aidera quelqu'un s'il/elle tente de mettre plusieurs images dans une seule feuille de travail chez Excel.
Deuxièmement, quelqu'un peut-il m'aider à comprendre la différence entre ces deux blocs de code? Il me semble qu’elles sont à peu près les mêmes, à l’exception du premier bloc de feuille de calcul créé par code appelé "Validation" à l’avance, contrairement au second. Je comprends cette partie.
Ce que je ne comprends pas, c'est pourquoi cela devrait-il être différent? Même si je ne crée pas la feuille de calcul à l'avance, cette ligne, la ligne juste avant la dernière,
df.to_Excel(writer,sheet_name='Validation',startrow=0 , startcol=0)
créera quand même une feuille de travail. Par conséquent, au moment où nous avons atteint la dernière ligne de code, la feuille de calcul "Validation" est déjà créée dans le deuxième bloc de code. Donc, ma question est la suivante: pourquoi le deuxième bloc de code devrait-il fonctionner alors que le premier ne fonctionne pas?
Indiquez également s'il existe un autre moyen de mettre de nombreuses images dans Excel en utilisant la fonctionnalité intégrée df.to_Excel !!
Pour créer la feuille de calcul à l'avance, vous devez ajouter la feuille créée à la variable sheets
:
writer.sheets['Validation'] = worksheet
En utilisant votre code original:
# Creating Excel Writer Object from Pandas
writer = pd.ExcelWriter('test.xlsx',engine='xlsxwriter')
workbook=writer.book
worksheet=workbook.add_worksheet('Validation')
writer.sheets['Validation'] = worksheet
df.to_Excel(writer,sheet_name='Validation',startrow=0 , startcol=0)
another_df.to_Excel(writer,sheet_name='Validation',startrow=20, startcol=0)
Si nous regardons la fonction to_Excel
de pandas, elle utilise la fonction write_cells
du rédacteur:
Excel_writer.write_cells(formatted_cells, sheet_name, startrow=startrow, startcol=startcol)
Donc, en regardant la fonction write_cells
pour xlsxwriter
:
def write_cells(self, cells, sheet_name=None, startrow=0, startcol=0):
# Write the frame cells using xlsxwriter.
sheet_name = self._get_sheet_name(sheet_name)
if sheet_name in self.sheets:
wks = self.sheets[sheet_name]
else:
wks = self.book.add_worksheet(sheet_name)
self.sheets[sheet_name] = wks
Nous pouvons voir ici qu’il vérifie sheet_name
dans self.sheets
et qu’il doit donc être ajouté là aussi.
user3817518: "S'il vous plaît, partagez également s'il existe un autre moyen de mettre de nombreuses images dans Excel en utilisant la fonctionnalité intégrée df.to_Excel !!"
Voici ma tentative:
Un moyen facile de rassembler un grand nombre de cadres de données sur une seule feuille ou sur plusieurs onglets. Laissez-moi savoir si cela fonctionne!
- Pour tester, il suffit d'exécuter les exemples de cadres de données et les deuxième et troisième portions de code.
import pandas as pd
import numpy as np
# Sample dataframes
randn = np.random.randn
df = pd.DataFrame(randn(15, 20))
df1 = pd.DataFrame(randn(10, 5))
df2 = pd.DataFrame(randn(5, 10))
# funtion
def multiple_dfs(df_list, sheets, file_name, spaces):
writer = pd.ExcelWriter(file_name,engine='xlsxwriter')
row = 0
for dataframe in df_list:
dataframe.to_Excel(writer,sheet_name=sheets,startrow=row , startcol=0)
row = row + len(dataframe.index) + spaces + 1
writer.save()
# list of dataframes
dfs = [df,df1,df2]
# run function
multiple_dfs(dfs, 'Validation', 'test1.xlsx', 1)
# function
def dfs_tabs(df_list, sheet_list, file_name):
writer = pd.ExcelWriter(file_name,engine='xlsxwriter')
for dataframe, sheet in Zip(df_list, sheet_list):
dataframe.to_Excel(writer, sheet_name=sheet, startrow=0 , startcol=0)
writer.save()
# list of dataframes and sheet names
dfs = [df, df1, df2]
sheets = ['df','df1','df2']
# run function
dfs_tabs(dfs, sheets, 'multi-test.xlsx')
Je serais plus enclin à concaténer les cadres de données d'abord, puis à transformer ce cadre de données en un format Excel. Pour associer deux cadres de données (plutôt que l'un au-dessus de l'autre), procédez comme suit:
writer = pd.ExcelWriter('test.xlsx',engine='xlsxwriter') # Creating Excel Writer Object from Pandas
workbook=writer.book
df.to_Excel(writer,sheet_name='Validation',startrow=0 , startcol=0)
new_df = pd.concat([df, another_df], axis=1)
new_df.to_Excel(writer,sheet_name='Validation',startrow=0 , startcol=0)