2017-10-20 5 views
1
def multiple_dfs(sheet, row=2): 

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

    f1 = { 
     'user': ['Bob', 'Jane', 'Alice'], 
     'income': [40000, 50000, 42000], 
    } 

    f2 = { 
     'amount': ['Chest', 'Bras', 'Braa'], 
     'income': [40000, 50000, 42000] 
    } 

    frames = [f1, f2] 


    for f in frames: 
     try: 
      wb = load_workbook("testing.xlsx") 
      ws = wb.get_sheet_by_name("aaa") 

      writer.wb = wb 
      writer.sheets = dict((ws.title, ws) for ws in wb.worksheets) 

      row = ws.max_row + 2 
     except: 
      pass 

     df = pd.DataFrame(f) 
     df.to_excel(writer, sheet, startrow=row, index=False) 
     writer.save() 
    # writer.close() 

multiple_dfs('aaa') 

J'ai obtenu cette erreur, mais je ne peux pas la réparer. J'adapte cette courte représentation de ce qui se passe dans mon code, mais il est difficile de voir où se situe le vrai problème. Voici leIndexError: Au moins une feuille doit être visible

Traceback (most recent call last): 
    File "create_and_update_xlsx_sheets.py", line 144, in <module> 
    create_and_update_worksheets() 
    File "create_and_update_xlsx_sheets.py", line 140, in create_and_update_worksheets 
    writer.save() 
    File "/home/jeremie/.virtualenvs/NHL/lib/python3.5/site-packages/pandas/io/excel.py", line 824, in save 
    return self.book.save(self.path) 
    ... 
    File "/home/jeremie/.virtualenvs/NHL/lib/python3.5/site-packages/openpyxl/writer/workbook.py", line 61, in get_active_sheet 
    raise IndexError("At least one sheet must be visible") 
IndexError: At least one sheet must be visible 

Comment résoudre ce problème?

P.S. Soyez conscient que l'erreur est affichée la moitié du temps.

+0

load_workbook et ExcelWriter/to_excel sont deux façons différentes de traiter des fichiers Excel, je ne pense pas que vous pouvez les faire ensemble. On ne sait pas ce qui est cassé ici, en partie à cause du try: except: block (qui attrape toutes les exceptions ... cela ne devrait pas être nécessaire). –

+0

Je ne comprends pas cette erreur, qu'est-ce que deux secondes? –

Répondre

1

Il semble que ce que vous voulez faire est d'écrire juste chaque trame de données à la même feuille (annexant en dessous du dernier), donc je pense que vous pouvez écrire ce que:

start_row = 1 
for df in frames: # assuming they're already DataFrames 
    df.to_excel(writer, sheet, startrow=start_row, index=False) 
    start_row += len(df) + 1 # add a row for the column header? 
writer.save() # we only need to save to disk at the very end! 
2

Sinon, si vous ne Pas besoin de charger un classeur, vous pouvez simplement utiliser xlsxwriter au lieu de openpyxl; il n'a pas ce problème. Vous pouvez également créer un classeur avec le

wb= Workbook() 
ws=wb.active 
with pd.ExcelWriter(output_filepath, engine="openpyxl") as writer: 
    writer.book=wb 
    writer.sheets = dict((ws.title, ws) ws in wb.worksheets) 
    #useful code 

régulière, vous pouvez maintenant travailler avec les deux pandas.to_excel et les méthodes intéressantes de openpyxl qui ne sont pas traduits en elle (ce n'est pas mon bidouille, a trouvé ici, mais ne peut pas trouver où)