Почему вместе с нужным листом 4, сохраняются все 20 листов при сохранение файлов Excel?

Рейтинг: 1Ответов: 1Опубликовано: 17.04.2023

Задача: Есть шаблон файла с 20 разными таблицами для отчёта, нужно заполнить их все, используя различную логику. Я прописываю её на pandas. Далее покажу свою проблему, на примере отчёта 4:

Есть файл1, в котором содержится информация по деньгам и проектам. Файл2, который содержит 20 разных шаблонов отчётов.

Мои действия: Открываю шаблон, произвожу необходимые вычисления с данными из файла1, записываю в новый файл Result (Важно, чтобы сохранялось исходное форматирование таблиц и шрифтов, поэтому использую openpyxl, а не pandas, для чтения и записи шаблона).

Проблема: при выполнении этого скрипта, создаётся новый файл Result.xlsx, в нём всё правильно посчитано и сохранено исходное форматирование, но вместе с нужным листом 4, сохраняются все 20 листов исходных отчётов из файла2. И если я запущу аналогичный скрипт для отчёта 5, то он сотрёт все предыдущие посчитанные отчеты и сохранит только отчёт 5 и 20 остальных пустых листов из файла2.

А в итоге мне нужно прогнать все 20 скриптов, чтобы они сохранили и посчитали 20 отчётов в файле Result. (т.е. нужно не перезаписывать этот файл, а просто добавлять к нему новый лист с вычислениями соответствующего скрипта)

import pandas as pd
from tqdm import tqdm
import openpyxl

def tablica4():
# Загружаем первый файл
file1 = 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 = file1 .loc[file1 ['Тип'] == "Тип1"]
kod_4 = file1 .loc[file1 ['Тип'].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, он сохраняет форматирование и удобно работает, просто видимо я упускаю какой-то важный момент.

Ответы

▲ 2Принят

Вообще судя по описанию и коду всё работает так как я бы и ожидал:

  1. вы открываете файл шаблона: workbook = openpyxl.load_workbook(filename='Отчет_шаблон.xlsx')
  2. выбираете конретный лист: worksheet = workbook["4"]
  3. модифицируете его (при этом все остальные листы шаблона на месте)
  4. затем сохраняете его как новый файл workbook.save("Result.xlsx")

Логично что каждый раз результат перезатирается пустым шаблоном с единственным модифицированным листом. В данном случае непонятно, каким же образом у вас всё корректно работает в случае pandas

Я бы предположил что правильно было бы так:

  1. открыть файл шаблона
  2. скопировать из него лист в новую книгу Result.xlsx
  3. модифицировать уже его там
  4. сохранить результат

Таким образом у вас в Result.xlsx будут последовательно добавлятся листы с данными.

Другой вариант разово копировать шаблон в Result.xlsx и далее работать только ним, суть думаю понятна.