pandas: escribiendo en un archivo de excel existente (xlsx) usando to_excel

Tengo un caso de uso simple para df.to_excel() que estoy luchando. Quiero escribir en una pestaña específica de la hoja de trabajo (llamémosla “Datos”) de un libro de trabajo XLSX existente, al que se podría hacer referencia mediante fórmulas y pivotes en otras tabs.

He intentado modificar ExcelWriter de dos maneras, pero ambas producen errores desde openpyxl.

  1. Lea una hoja existente usando get_sheet_by_name (Esto errores: “NotImplementedError: use ‘iter_rows ()’ en su lugar”.)
  2. Crea una nueva hoja usando create_sheet. (Este error: “ReadOnlyWorkbookException: no se puede crear una hoja nueva en un libro de solo lectura”)

     df=DataFrame() from openpyxl.reader.excel import load_workbook book = load_workbook('my_excel_file.xlsx', use_iterators=True) # Assume my_excel_file.xlsx contains a sheet called 'Data' class temp_excel_writer(ExcelWriter): # I need this to inherit the other methods of ExcelWriter in io/parsers.py def __init__(self, path, book): self.book=book test_sheet=self.book.create_sheet(title='Test') # This errors: ReadOnlyWorkbookException self.use_xlsx = True self.sheet_names=self.book.get_sheet_names() self.actual_sheets=self.book.worksheets self.sheets={} for i,j in enumerate(self.sheet_names): self.sheets[j] = (self.actual_sheets[i],1) self.cur_sheet = None self.path = save my_temp_writer=temp_excel_writer('my_excel_file.xlsx', book) df.to_excel(my_temp_writer, sheet_name='Data') 

¿Alguna idea? ¿Me estoy perdiendo algo obvio? Todavía estoy en pandas 7.2

Cuando carga su libro de trabajo con use_iterators=True , entonces _set_optimized_read() en el objeto de libro de trabajo, lo que hace que se cargue solo para lectura.

Así, con el siguiente código:

 from openpyxl.reader.excel import load_workbook book = load_workbook('t.xlsx', use_iterators=False) # Assume t.xlsx contains ['Data', 'Feuil2', 'Feuil3'] print book.get_sheet_names() class temp_excel_writer(): def __init__(self, path, book): self.book=book test_sheet=self.book.create_sheet(title='Test') # No exception here now self.book.save(path) self.use_xlsx = True self.sheet_names=self.book.get_sheet_names() print self.sheet_names self.actual_sheets=self.book.worksheets self.sheets={} for i,j in enumerate(self.sheet_names): self.sheets[j] = (self.actual_sheets[i],1) self.cur_sheet = None self.path = path # I had to modify this line also my_temp_writer = temp_excel_writer('my_excel_file.xlsx', book) 

Crea un archivo llamado my_excel_file.xlsx y la siguiente salida:

  ['Data', 'Feuil2', 'Feuil3'] ['Data', 'Feuil2', 'Feuil3', 'Test'] 

Espero eso ayude