несколько фреймов данных на листе, несколько листов на книгу - PullRequest
0 голосов
/ 26 ноября 2018

Я написал функцию, позволяющую записывать несколько кадров данных на один лист Excel, а затем иметь несколько листов в одной книге Excel.Я могу достичь первой части, но не второй.Когда скрипт запускается, он перезаписывает существующую вкладку и записывает поверх нее новую, а это означает, что каждый раз, когда я открываю выходной файл, он имеет только один лист, самый последний.

Я всегда был немного озадачен функцией writer.save () и тем, когда ее использовать (то есть: внутри или в нашем цикле).Есть предложения?

def dfs_to_sheet(dflist, bookname, sheetname, startrow = 0):
    writer = pd.ExcelWriter('{}.xlsx'.format(bookname), engine='openpyxl')
    numdfs = 0
    startrow = 0
    for i in dflist:
        if numdfs == 0:
            i.to_excel(writer, sheet_name=sheetname,  startrow = startrow)
        elif numdfs != 0:
            i.to_excel(writer, sheet_name = sheetname, startrow = startrow)
        startrow = startrow + len(i) + 2
        numdfs += 1
    writer.save()

Ответы [ 2 ]

0 голосов
/ 26 ноября 2018

Ответ, который вы ищете, связан с решением здесь , но, поскольку вы хотите вызывать его в течение нескольких итераций, это немного сложнее.Мое решение приведено ниже, но имейте в виду, что это может привести к путанице, если есть дубликаты листов (например, если существует Лист1, и если вы попытаетесь снова добавить Лист1, он станет Лист11).

import pandas as pd
import os.path
from openpyxl import load_workbook

def dfs_to_sheet(dflist, bookname, sheetname, startrow = 0):
    book_file = '{}.xlsx'.format(bookname)
    writer = pd.ExcelWriter(book_file, engine='openpyxl')
    if os.path.isfile(book_file):
        writer.book = load_workbook(book_file)
    numdfs = 0
    startrow = 0
    for i in dflist:
        if numdfs == 0:
            i.to_excel(writer, sheet_name = sheetname,  startrow = startrow)
        elif numdfs != 0:
            i.to_excel(writer, sheet_name = sheetname, startrow = startrow)
        startrow = startrow + len(i) + 2
        numdfs += 1
    writer.save()
    writer.close()
0 голосов
/ 26 ноября 2018

Вот как я это делаю.Новый лист должен быть добавлен в книгу Excel, а объект workbook также должен получить новый лист.

writer = pd.ExcelWriter('example.xlsx', engine='xlsxwriter')
wb = writer.book
sh = wb.add_worksheet('Sheet1')
writer.sheets['Sheet1'] = sh
sh2 = wb.add_worksheet('Sheet2')
writer.sheets['Sheet2'] = sh2
........
sh.white(...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...