Замена данных в листе xlsx на pandas dataframe - PullRequest
1 голос
/ 10 октября 2019

У меня есть файл xlsx с несколькими вкладками, одна из которых Town_names, в которой уже есть некоторые данные.

Я хотел бы перезаписать эти данные с помощью фрейма данных - Town_namesDF - в то время каксохраняя остальные вкладки xlsx без изменений.

Я пробовал следующее:

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()

Но в итоге создается новая вкладка Town_names1 вместо перезаписи вкладки Town_names,Я что-то пропустил? Спасибо.

Ответы [ 3 ]

1 голос
/ 11 октября 2019

Так как вы хотите перезаписать, но прямой опции для этого нет (как и в XLSX Джулии, есть опция для cell_ref). Просто удалите дубликат, если он существует, а затем напишите.

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 голос
/ 10 октября 2019

Вы можете попробовать это, чтобы временно сохранить все остальные листы, а затем добавить их обратно. Я не думаю, что это сохранит какие-либо формулы или форматирование.

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()
0 голосов
/ 11 октября 2019

Ну, мне удалось это сделать. Это не чистое решение и совсем не быстрое, но я использовал документацию openpyxl для работы с пандами, найденными здесь: https://openpyxl.readthedocs.io/en/latest/pandas.html

Я эффективно выбираю лист Town_names, очищая егос ws.delete_rows() и затем добавлением каждой строки моего информационного кадра на лист.

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')

Немного грязно, и я надеюсь, что есть лучшее решение, чем у меня, но это сработало для меня.

...