2017-10-19 15 views
1
def test(sheet, row=2): 

    writer = pd.ExcelWriter("testing.xlsx", engine='openpyxl') 

    df1 = pd.DataFrame(['Title'], index=[0]) 
    df2 = pd.DataFrame({'user': ['Bob', 'Jane', 'Alice'], 
         'income': [40000, 50000, 42000]}) 

    df1.to_excel(writer, sheet, startrow=0, startcol=0, header=None, \ 
       index=False) 
    df2.to_excel(writer, sheet, startrow=row, index=False) 

    writer.save() 
    writer.close() 

test('aaa') 

Actuellement, cette petite fonction crée une seule feuille de calcul Excel.Afficher ci-dessous une feuille de calcul de contenu existant

Description:

On suppose que la feuille Excel existe. Je veux écrire quelque chose d'autre ci-dessous les lignes existantes avec le code suivant.

In [1]: import pandas as pd 

In [2]: writer = pd.ExcelWriter("testing.xlsx", engine='openpyxl') 

In [4]: from openpyxl import load_workbook 

In [5]: book = load_workbook("testing.xlsx") 

In [6]:  df3 = pd.DataFrame({'amount': ['Chest', 'Bras', 'Braa'], 
    ...:      'income': [40000, 50000, 42000]}) 
    ...: 

In [8]: writer.book = book 

In [9]: ws = book.get_sheet_by_name('aaa') 

In [10]: writer.book 
Out[10]: <openpyxl.workbook.workbook.Workbook at 0x7f9add4e3048> 

In [12]: writer.book.sheetnames 
Out[12]: ['aaa'] 

In [13]: row = ws.max_row 

In [14]: row 
Out[14]: 6 

In [15]: df3.to_excel(writer, "aaa", startrow=row + 2, index=False) 

In [16]: writer.save() 

Ce code fonctionnait presque comme je le voulais. Il crée une nouvelle feuille de travail aaa1 et place le contenu de df à la 8ème ligne comme il se doit normalement. Au lieu de créer la nouvelle feuille aaa1, je veux que le contenu de aaa1 soit ci-dessous le contenu de aaa. Comment pourrais-je résoudre cela pour que cela fonctionne?

Répondre

0

Malheureusement, cela ne sera pas possible si vous utilisez simplement pandas.DataFrame.to_excel. Si vous êtes ouvert à l'utilisation de openpyxl pour la deuxième partie, j'ai une solution ci-dessous. J'ai utilisé le style Pandas pour formater les cellules de la même manière que la première partie a été formatée.

import pandas as pd 
from openpyxl import load_workbook 
from openpyxl.utils.dataframe import dataframe_to_rows 

writer = pd.ExcelWriter("testing.xlsx", engine='openpyxl') 

book = load_workbook("testing.xlsx") 

df3 = pd.DataFrame({'amount': ['Chest', 'Bras', 'Braa'], 
       'income': [40000, 50000, 42000]}) 

writer.book = book 
ws = book['aaa'] 

row = ws.max_row 

#best way to replicate your insertion of 2 blank rows which 
ws.append(tuple()) 
ws.append(tuple()) 

for r in dataframe_to_rows(df3, index=False, header=True): 
    ws.append(r) 

#a quick way to give you the same style as you get with the first part 
for row in ws.iter_rows(min_row=row +3, max_col=2, max_row=row +3): 
    for cell in row: 
     cell.style = 'Pandas' 

writer.save() 

Avec la sortie désirée: Excel Output