Как записать в существующий файл excel без перезаписи данных (с помощью pandas)?
Я использую pandas для записи в файл excel следующим образом:
import pandas
writer = pandas.ExcelWriter('Masterfile.xlsx')
data_filtered.to_excel(writer, "Main", cols=['Diff1', 'Diff2'])
writer.save()
Мастерфильм.xlsx уже состоит из нескольких различных вкладок.
панды правильно пишет на "главный" лист, к сожалению, он также удаляет все другие вкладки.
7 ответов:
Pandas docs говорит, что он использует openpyxl для файлов xlsx. Быстрый просмотр кода в
ExcelWriter
дает подсказку, что что-то вроде этого может сработать: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()
С
openpyxl
версия2.4.0
иpandas
версия0.19.2
, процесс @ski придумал становится немного проще: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!
вот вспомогательная функция:
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') # Python 2.x: define [FileNotFoundError] exception if it doesn't exist try: FileNotFoundError except NameError: FileNotFoundError = IOError 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()
Примечание: для панд sheet_name С
sheetname
!примеры использования:
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)
старый вопрос, но я предполагаю, что некоторые люди все еще ищите это - так...
Я нахожу этот метод приятным, потому что все листы загружаются в словарь пар имен листов и фреймов данных, созданных пандами с опцией sheetname=None. Это просто добавить, удалить или изменить листы между чтением электронной таблицы в формате dict и записать его обратно из dict. Для меня xlsxwriter работает лучше, чем openpyxl для этой конкретной задачи с точки зрения скорости и формат.
Примечание: будущие версии pandas (0.21.0+) изменят параметр "sheetname" на "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)
для примера в вопросе 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)
Я знаю, что это старый нить, но это первый элемент, который вы найдете при поиске, а выше решения не работают, если вам нужно сохранить диаграммы в книге, которую вы уже создали. В этом случае xlwings является лучшим вариантом - он позволяет записывать в Книгу excel и сохраняет диаграммы/данные диаграммы.
простой пример:
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()
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
Это прекрасно работает только то, что форматирование главного файла (файл, к которому мы добавляем новый лист) теряется.