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.
3 respuestas
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í.
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()
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()