Добавление фрейма данных к существующему листу Excel с помощью Openpyxl

Я пытаюсь создать новую электронную таблицу и рабочий лист, содержащий заголовки столбцов из фрейма данных. Затем я хочу добавлять новые данные в рабочий лист на каждой итерации цикла For. У меня, вероятно, будет большой объем данных, и поэтому я подумал, что будет необходимо записывать их в Excel после каждой итерации, а не записывать весь DF в конце. Код «Добавить данные к существующему листу» в цикле For работает правильно (т.е. дает мне 3 строки значений) сам по себе, если я пишу в электронную таблицу, которая уже содержит заголовки столбцов, которые я создал в Excel. Но когда я запускаю код, как вы видите ниже, я получаю только заголовки столбцов и значения из последней итерации цикла For. Я явно упускаю что-то простое, но, похоже, не могу с этим справиться. Любая помощь приветствуется

import openpyxl as xl
import pandas as pd
import numpy as np
import datetime as dt

fn = '00test101.xlsx'
# Create new workbook
wb = xl.Workbook()
wb.save(fn)

book = xl.load_workbook(fn)
writer = pd.ExcelWriter(fn,engine='openpyxl')
writer.book = book
writer.sheets = dict((ws.title, ws) for ws in book.worksheets)
# Write DF column names to new worksheet
DF = pd.DataFrame(columns=['A','B','C'])
DF.to_excel(writer, 'ABC', header=True, startrow=0)
writer.save()

for i in range(3):
    a = np.array([1,3,6]) * i

    # Overwrite existing DF and add data
    DF = pd.DataFrame(columns=['A','B','C'])
    DF.loc[dt.datetime.now()] = a

    # Append data to existing worksheet
    book = xl.load_workbook(fn)
    writer = pd.ExcelWriter(fn,engine='openpyxl')
    writer.book = book
    writer.sheets = dict((ws.title, ws) for ws in book.worksheets)
    DF.to_excel(writer, 'ABC', header=None, startrow=book.active.max_row)
    writer.save()

# Remove unwanted default worksheet
wb = xl.load_workbook(fn)
def_sheet = wb.get_sheet_by_name('Sheet')
wb.remove_sheet(def_sheet)
wb.save(fn)

Я думаю, ваша проблема связана с startrow=book.active.max_row, замените на startrow=book['ABC'].max_row, и он должен работать

Ben.T 01.05.2018 20:40

и для большего объяснения, это потому, что у вас есть лист по умолчанию в вашей книге при выполнении цикла for, и этот лист кажется активным. Если вы удалите его (как вы это делаете в конце), прежде чем войти в свой цикл, я предполагаю, что вы не столкнетесь со своей проблемой при использовании active.

Ben.T 01.05.2018 20:57

Просто используйте openpyxl.readthedocs.io/en/latest/pandas.html

Charlie Clark 02.05.2018 09:16

Да, оба твоих пункта в точности верны, спасибо @ Ben.T. Я предполагал, что лист, на который я писал, по умолчанию активен

4bears 02.05.2018 15:51
Преобразование HTML-таблицы в профессиональный документ Excel
Преобразование HTML-таблицы в профессиональный документ Excel
Это самый простой способ создания Excel из HTML-таблицы.
Импорт excel в laravel в базу данных
Импорт excel в laravel в базу данных
Здравствуйте, дорогой читатель, в этой статье я расскажу практическим и быстрым способом, как импортировать файл Excel в вашу базу данных с помощью...
1
4
2 271
0

Другие вопросы по теме