Редактирование и сохранение файлов Excel с помощью Python (pandas, openpyxl)

Опишу, что происходит) Есть файл1, в котором содержится информация по деньгам и проектам. Файл2, который содержит 20 разных шаблонов отчётов. Я делаю всё на примере отчёта 4. Открываю шаблон, произвожу необходимые вычисления с данными из файла1, записываю в новый файл Result (Важно, чтобы сохранялось исходное форматирование, поэтому использую openpyxl, а не pandas). Но проблема в том, что при выполнении этого скрипта, создаётся новый файл "Result.xlsx", в нём всё правильно посчитано и сохранено исходное форматирование, но вместе с нужным листом 4, сохраняются все 20 листов исходных отчётов. И если я запущу аналогичный скрипт для отчёта 5, то он сотрёт все предыдущие отчеты и сохранит только отчёт 5 и 20 остальных пустых листов. А в итоге мне нужно прогнать все 20 скриптов, чтобы они сохранились в файле Result. (т.е. нужно не перезаписывать этот файл, а просто добавлять к нему новый лист с вычислениями соответствующего скрипта)

import pandas as pd
from tqdm import tqdm
import openpyxl

def tablica4():
    # Загружаем первый файл
    niokr = pd.read_excel(r"C:\1\2\3\4\5\6\File1.xlsx",
                          sheet_name="File1")

    # Открываем шаблон
    workbook = openpyxl.load_workbook(filename='Отчет_шаблон.xlsx')
    worksheet = workbook["4"]
    workbook.active = worksheet

    # Условия для фильтрации данных. Код строки
    kod_3 = niokr.loc[niokr['Тип проекта'] == "Тип1"]
    kod_4 = niokr.loc[niokr['Тип проекта'].isin(("Тип2", "Тип3"))]

    # Суммируем поступления по фильтрованному столбцу
    kod_3_4 = kod_3['Сумма'].sum() / 1000
    kod_4_4 = kod_4['Сумма'].sum() / 1000
    kod_2_4 = kod_3_4 + kod_4_4
    kod_1_4 = kod_2_4

    # Подсчитаем уникальные проекты
    kod_3_3 = len(kod_3['ID'].unique())
    kod_4_3 = len(kod_4['ID'].unique())
    kod_2_3 = kod_3_3 + kod_4_3
    kod_1_3 = kod_2_3

    # Записываем данные в ячейки таблицы
    worksheet['D8'].value = kod_3_4
    worksheet['D9'].value = kod_4_4
    worksheet['D7'].value = kod_2_4
    worksheet['D6'].value = kod_1_4

    worksheet['C8'].value = kod_3_3
    worksheet['C9'].value = kod_4_3
    worksheet['C7'].value = kod_2_3
    worksheet['C6'].value = kod_1_3

    workbook.save("Result.xlsx")


tablica4()

P.S. Пробовал различные варианты сохранения, и при использовании pandas всё сохраняется и работает отлично, но слетает исходное форматирование файла шаблона, а мне оно нужно. Поэтому решил использовать openpyxl, он сохраняет форматирование и удобно работает, просто видимо я упускаю какой-то важный момент. Заранее спасибо за помощь :)


Ответы (1 шт):

Автор решения: Павел

Проблема в том, что каждый раз при выполнении функции tablica4() вы создаете новый экземпляр workbook и перезаписываете файл "Result.xlsx". Чтобы сохранять данные в тот же файл, не удаляя при этом предыдущие данные, вам нужно открыть файл "Result.xlsx" один раз в начале вашей программы, а затем использовать этот экземпляр workbook для добавления новых листов с вычислениями. Пример решения:

import pandas as pd
import openpyxl

def main():
    # Открываем файл "Result.xlsx" или создаем новый, если его еще нет
    try:
        workbook = openpyxl.load_workbook(filename='Result.xlsx')
    except FileNotFoundError:
        workbook = openpyxl.Workbook()
        workbook.save('Result.xlsx')

# Загружаем первый файл
niokr = pd.read_excel(r"C:\1\2\3\4\5\6\File1.xlsx",
                      sheet_name="File1")

# Открываем шаблон и добавляем новый лист с вычислениями
worksheet = workbook["4"]
new_worksheet = workbook.create_sheet(title='Отчет 4 - вычисления')
new_worksheet.sheet_properties.tabColor = "1072BA"
new_worksheet = copy_worksheet(worksheet, new_worksheet)
new_worksheet.title = 'Отчет 4 - вычисления'

# Условия для фильтрации данных. Код строки
kod_3 = niokr.loc[niokr['Тип проекта'] == "Тип1"]
kod_4 = niokr.loc[niokr['Тип проекта'].isin(("Тип2", "Тип3"))]

# Суммируем поступления по фильтрованному столбцу
kod_3_4 = kod_3['Сумма'].sum() / 1000
kod_4_4 = kod_4['Сумма'].sum() / 1000
kod_2_4 = kod_3_4 + kod_4_4
kod_1_4 = kod_2_4

# Подсчитаем уникальные проекты
kod_3_3 = len(kod_3['ID'].unique())
kod_4_3 = len(kod_4['ID'].unique())
kod_2_3 = kod_3_3 + kod_4_3
kod_1_3 = kod_2_3

# Записываем данные в ячейки таблицы
new_worksheet['D8'].value = kod_3_4
new_worksheet['D9'].value = kod_4_4
new_worksheet['D7'].value = kod_2_4
new_worksheet['D6'].value = kod_1_4

new_worksheet['C8'].value = kod_3_3
new_worksheet['C9'].value = kod_4_3
new_worksheet['C7'].value = kod_2_3
new_worksheet['C6'].value = kod_1_3

workbook.save
→ Ссылка