Как записать в существующий файл Excel с openpyxl, сохранив сводные таблицы - PullRequest
0 голосов
/ 13 февраля 2020

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

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

Метод 1

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

Но, когда файл записывается, сводная точка таблица преобразуется в обычный текст. Решение, которое я нашел для сохранения сводной таблицы, состоит в том, чтобы читать и записывать рабочую книгу, используя следующие методы.

Метод 2

workbook = load_workbook(filename=updating_file)
sheet = workbook["Pivot"]
pivot = sheet._pivots[0]
# any will do as they share the same cache
pivot.cache.refreshOnLoad = True
workbook.save(filename=updating_file)

Это добавляет дополнительную строку к Сводная таблица как «Значение», которая разрушает значения таблиц на основе сводной таблицы. enter image description here

Согласно здесь с использованием pd.ExcelWriter не сохранит сводные таблицы. Единственный пример, который я нашел для обновления существующего файла Excel с фреймом данных, требует pandas ExcelWriter.

Некоторая помощь будет принята с благодарностью, так как я не могу найти метод для выполнения обоих требований

Единственный вариант, который я пока вижу, - записать части данных с помощью Pandas. Затем удалите существующий сводный лист и скопируйте лист из оригинала f ie. Но, опять же, я должен найти способ очистить таблицу на основе сводки и переписать с помощью openpyxl, используя второй метод. (Мы не можем копировать листы между рабочими книгами)

Ответы [ 2 ]

1 голос
/ 13 февраля 2020

Придерживайтесь Метод 1 : если вы конвертируете df в сводную таблицу в pandas и , то экспортируйте в Excel, это будет работать.

Пример:

import pandas as pd 
import numpy as np 

# create dataframe 
df = pd.DataFrame({'A': ['John', 'Boby', 'Mina', 'Peter', 'Nicky'], 
      'B': ['Masters', 'Graduate', 'Graduate', 'Masters', 'Graduate'], 
      'C': [27, 23, 21, 23, 24]}) 

table = pd.pivot_table(df, values ='A', index =['B', 'C'], 
                         columns =['B'], aggfunc = np.sum)

table.to_excel("filename.xlsx")

Выходы

Excel Output

0 голосов
/ 14 февраля 2020

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

current_sheet.insert_rows(idx=11, amount=len(backend_report_df))
sheet_row_idx = 11
is_valid_row = False
for row in dataframe_to_rows(backend_report_df, index=True, header=True):
    is_valid_row = False
    for col_idx in range (0, len(row)):
        if col_idx == 0 and row[col_idx] is None:
            logger.info("Header row/blank row")
            break
        else:
            is_valid_row = True
            if col_idx != 0:
                current_sheet.cell(row=sheet_row_idx, column=col_idx).value = row[col_idx]
    if is_valid_row:
        sheet_row_idx = sheet_row_idx + 1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...