Редактирование и сохранение файлов 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