Tengo un archivo xlsx con varias pestañas, una de ellas es Town_names que ya tiene algunos datos.

Me gustaría sobrescribir esos datos con un marco de datos - Town_namesDF - mientras mantengo el resto de las pestañas xlsx intactas.

He probado lo siguiente:

with pd.ExcelWriter(r'path/to/file.xlsx', engine='openpyxl', mode='a') as writer:
    Town_namesDF.to_excel(writer,sheet_name='Town_names')
    writer.save()

writer.close()

Pero termina creando una nueva pestaña Town_names1 en lugar de sobrescribir la pestaña Town_names. ¿Me estoy perdiendo de algo? Gracias.

1
Robert C 10 oct. 2019 a las 18:10

3 respuestas

La mejor respuesta

Bueno, me las arreglé para hacer esto. Esta no es una solución limpia ni rápida en absoluto, pero he utilizado la documentación de openpyxl para trabajar con pandas que se encuentra aquí: https://openpyxl.readthedocs.io/en/latest/pandas.html

Estoy seleccionando efectivamente la hoja Town_names, borrándola con ws.delete_rows() y luego agrego cada fila de mi marco de datos a la hoja.

wb = openpyxl.load_workbook(r'path/to/file.xlsx')
ws = wb.get_sheet_by_name('Town_names')
ws.delete_rows(0, 1000)

wb.save(r'path/to/file.xlsx')

wb = openpyxl.load_workbook(r'path/to/file.xlsx')
activeSheet = wb.get_sheet_by_name('Town_names')

for r in dataframe_to_rows(Town_namesDF, index=False, header=True):
    activeSheet.append(r)

for cell in activeSheet['A'] + activeSheet[1]:
    cell.style = 'Pandas'

wb.save(r'path/to/file.xlsx')

Un poco desordenado y espero que haya una solución mejor que la mía, pero esto funcionó para mí.

0
Robert C 11 oct. 2019 a las 10:37

Como desea sobrescribir, pero no hay una opción directa para eso (como en el XLSX de julia hay una opción para cell_ref). Simplemente elimine el duplicado si existe y luego escriba.

with pd.ExcelWriter('/path/to/file.xlsx',engine = "openpyxl",  mode='a') as writer:
 workBook = writer.book
 try:
  workBook.remove(workBook['Town_names'])
 except:
  print("worksheet doesn't exist")
 finally:
  df.to_excel(writer, sheet_name='Town_names')
 writer.save()
1
Yugandhar 11 oct. 2019 a las 03:07

Puede intentar esto para almacenar todas las otras hojas temporalmente y luego agregarlas nuevamente. Sin embargo, no creo que esto guarde ninguna fórmula o formato.

Store_sheet1=pd.read_excel('path/to/file.xlsx',sheetname='Sheet1')
Store_sheet2=pd.read_excel('path/to/file.xlsx',sheetname='Sheet2')
Store_sheet3=pd.read_excel('path/to/file.xlsx',sheetname='Sheet3')

with pd.ExcelWriter(r'path/to/file.xlsx', engine='openpyxl', mode='a') as writer:
    Town_namesDF.to_excel(writer,sheet_name='Town_names')
    Store_sheet1.to_excel(writer,sheet_name='Sheet1')
    Store_sheet2.to_excel(writer,sheet_name='Sheet2')
    Store_sheet3.to_excel(writer,sheet_name='Sheet3')
writer.save()
writer.close()
1
MBA Coder 10 oct. 2019 a las 15:25
58326076