guardar - write excel python pandas
¿Cómo escribir en un archivo Excel existente sin sobreescribir datos(usando pandas)? (7)
Aquí hay una función auxiliar:
def append_df_to_excel(filename, df, sheet_name=''Sheet1'', startrow=None,
truncate_sheet=False,
**to_excel_kwargs):
"""
Append a DataFrame [df] to existing Excel file [filename]
into [sheet_name] Sheet.
If [filename] doesn''t exist, then this function will create it.
Parameters:
filename : File path or existing ExcelWriter
(Example: ''/path/to/file.xlsx'')
df : dataframe to save to workbook
sheet_name : Name of sheet which will contain DataFrame.
(default: ''Sheet1'')
startrow : upper left cell row to dump data frame.
Per default (startrow=None) calculate the last row
in the existing DF and write to the next row...
truncate_sheet : truncate (remove and recreate) [sheet_name]
before writing DataFrame to Excel file
to_excel_kwargs : arguments which will be passed to `DataFrame.to_excel()`
[can be dictionary]
Returns: None
"""
from openpyxl import load_workbook
# ignore [engine] parameter if it was passed
if ''engine'' in to_excel_kwargs:
to_excel_kwargs.pop(''engine'')
writer = pd.ExcelWriter(filename, engine=''openpyxl'')
try:
# try to open an existing workbook
writer.book = load_workbook(filename)
# get the last row in the existing Excel sheet
# if it was not specified explicitly
if startrow is None and sheet_name in writer.book.sheetnames:
startrow = writer.book[sheet_name].max_row
# truncate sheet
if truncate_sheet and sheet_name in writer.book.sheetnames:
# index of [sheet_name] sheet
idx = writer.book.sheetnames.index(sheet_name)
# remove [sheet_name]
writer.book.remove(writer.book.worksheets[idx])
# create an empty sheet [sheet_name] using old index
writer.book.create_sheet(sheet_name, idx)
# copy existing sheets
writer.sheets = {ws.title:ws for ws in writer.book.worksheets}
except FileNotFoundError:
# file does not exist yet, we will create it
pass
if startrow is None:
startrow = 0
# write out the new sheet
df.to_excel(writer, sheet_name, startrow=startrow, **to_excel_kwargs)
# save the workbook
writer.save()
NOTA: para Pandas <0.21.0, reemplace sheet_name
con sheetname
!
Ejemplos de uso:
append_df_to_excel(''d:/temp/test.xlsx'', df)
append_df_to_excel(''d:/temp/test.xlsx'', df, header=None, index=False)
append_df_to_excel(''d:/temp/test.xlsx'', df, sheet_name=''Sheet2'', index=False)
append_df_to_excel(''d:/temp/test.xlsx'', df, sheet_name=''Sheet2'', index=False, startrow=25)
Yo uso pandas para escribir en el archivo Excel de la siguiente manera:
import pandas
writer = pandas.ExcelWriter(''Masterfile.xlsx'')
data_filtered.to_excel(writer, "Main", cols=[''Diff1'', ''Diff2''])
writer.save()
Masterfile.xlsx ya consiste en el número de pestañas diferentes.
Pandas escribe correctamente en la hoja "Principal", desafortunadamente también borra todas las demás pestañas.
Con openpyxl
versión 2.4.0
y pandas
versión 0.19.2
, el proceso @ski se hizo un poco más simple:
import pandas
from openpyxl import load_workbook
with pandas.ExcelWriter(''Masterfile.xlsx'', engine=''openpyxl'') as writer:
writer.book = load_workbook(''Masterfile.xlsx'')
data_filtered.to_excel(writer, "Main", cols=[''Diff1'', ''Diff2''])
#That''s it!
Pandas docs dice que usa openpyxl para archivos xlsx. Una mirada rápida a través del código en ExcelWriter
da una pista de que algo así podría funcionar:
import pandas
from openpyxl import load_workbook
book = load_workbook(''Masterfile.xlsx'')
writer = pandas.ExcelWriter(''Masterfile.xlsx'', engine=''openpyxl'')
writer.book = book
writer.sheets = dict((ws.title, ws) for ws in book.worksheets)
data_filtered.to_excel(writer, "Main", cols=[''Diff1'', ''Diff2''])
writer.save()
Sé que este es un hilo más antiguo, pero este es el primer elemento que encuentras al buscar, y las soluciones anteriores no funcionan si necesitas conservar gráficos en un libro de trabajo que ya has creado. En ese caso, xlwings es una mejor opción: le permite escribir en el libro de Excel y guardar los gráficos / tablas de datos.
ejemplo simple:
import xlwings as xw
import pandas as pd
#create DF
months = [''2017-01'',''2017-02'',''2017-03'',''2017-04'',''2017-05'',''2017-06'',''2017-07'',''2017-08'',''2017-09'',''2017-10'',''2017-11'',''2017-12'']
value1 = [x * 5+5 for x in range(len(months))]
df = pd.DataFrame(value1, index = months, columns = [''value1''])
df[''value2''] = df[''value1'']+5
df[''value3''] = df[''value2'']+5
#load workbook that has a chart in it
wb = xw.Book(''C://data//bookwithChart.xlsx'')
ws = wb.sheets[''chartData'']
ws.range(''A1'').options(index=False).value = df
wb = xw.Book(''C://data//bookwithChart_updated.xlsx'')
xw.apps[0].quit()
Una vieja pregunta, pero supongo que algunas personas aún buscan esto, así que ...
Me parece agradable este método porque todas las hojas de trabajo se cargan en un diccionario de pares de nombre de hoja y marco de datos, creados por pandas con la opción de nombre de hoja = Ninguno. Es simple agregar, eliminar o modificar hojas de trabajo entre leer la hoja de cálculo en el formato dict y escribirla desde el dict. Para mí, el xlsxwriter funciona mejor que openpyxl para esta tarea en particular en términos de velocidad y formato.
Nota: las versiones futuras de pandas (0.21.0+) cambiarán el parámetro "sheetname" a "sheet_name".
# read a single or multi-sheet excel file
# (returns dict of sheetname(s), dataframe(s))
ws_dict = pd.read_excel(excel_file_path,
sheetname=None)
# all worksheets are accessible as dataframes.
# easy to change a worksheet as a dataframe:
mod_df = ws_dict[''existing_worksheet'']
# do work on mod_df...then reassign
ws_dict[''existing_worksheet''] = mod_df
# add a dataframe to the workbook as a new worksheet with
# ws name, df as dict key, value:
ws_dict[''new_worksheet''] = some_other_dataframe
# when done, write dictionary back to excel...
# xlsxwriter honors datetime and date formats
# (only included as example)...
with pd.ExcelWriter(excel_file_path,
engine=''xlsxwriter'',
datetime_format=''yyyy-mm-dd'',
date_format=''yyyy-mm-dd'') as writer:
for ws_name, df_sheet in ws_dict.items():
df_sheet.to_excel(writer, sheet_name=ws_name)
Para el ejemplo en la pregunta de 2013:
ws_dict = pd.read_excel(''Masterfile.xlsx'',
sheetname=None)
ws_dict[''Main''] = data_filtered[[''Diff1'', ''Diff2'']]
with pd.ExcelWriter(''Masterfile.xlsx'',
engine=''xlsxwriter'') as writer:
for ws_name, df_sheet in ws_dict.items():
df_sheet.to_excel(writer, sheet_name=ws_name)
def append_sheet_to_master(self, master_file_path, current_file_path, sheet_name):
try:
master_book = load_workbook(master_file_path)
master_writer = pandas.ExcelWriter(master_file_path, engine=''openpyxl'')
master_writer.book = master_book
master_writer.sheets = dict((ws.title, ws) for ws in master_book.worksheets)
current_frames = pandas.ExcelFile(current_file_path).parse(pandas.ExcelFile(current_file_path).sheet_names[0],
header=None,
index_col=None)
current_frames.to_excel(master_writer, sheet_name, index=None, header=False)
master_writer.save()
except Exception as e:
raise e
Esto funciona perfectamente bien, lo único que se pierde es el formato del archivo maestro (archivo al que agregamos una nueva hoja).
writer = pd.ExcelWriter(''prueba1.xlsx''engine=''openpyxl'',keep_date_col=True)
La esperanza de "keep_date_col" te ayuda