Mail.ruПочтаМой МирОдноклассникиВКонтактеИгрыЗнакомстваНовостиКалендарьОблакоЗаметкиВсе проекты

Написать скрипт для обработки эксель-файла

Фулберт Страшный Профи (656), на голосовании 1 месяц назад
Разработать скрипт на языке Python, который будет сортировать данные в Excel-файле. Скрипт должен корректно распределять строки с подчиненными под соответствующими менеджерами и сохранять изменения в новом файле.

Структура файла:
Данные начинаются с седьмой строки, до этого идёт шапка.
Столбец E (название столбца 'Unnamed: 4') содержит логины менеджеров и подчиненных.
Столбец I (название столбца 'Unnamed: 8') содержит логины подчиненных.
Логины менеджеров начинаются с 'SVlife' (например, SVlife03).
Логины подчиненных начинаются с 'Aqlife' (например, Aqlife90).

Сортировка:
Для каждой строки с логином менеджера в столбце 'Unnamed: 4' необходимо найти все строки с подчиненными, у которых в столбце 'Unnamed: 8' указан логин этого менеджера.
Строки с подчиненными должны идти сразу после строки с соответствующим менеджером.
Если у менеджера нет подчиненных, строка с этим менеджером остается на месте.
Если строка содержит '#Н/Д' или пустое значение в столбце 'Unnamed: 4' или 'Unnamed: 8', она должна быть удалена.
Голосование за лучший ответ
Сергей Колесников Ученик (223) 2 месяца назад
 import pandas as pd 
from openpyxl import load_workbook
from openpyxl.utils.dataframe import dataframe_to_rows
from copy import copy

# Загрузка исходного файла
file_path = 'D:/Загрузки/EXPERIMENT_ITOG.xlsx'
wb = load_workbook(file_path)
ws = wb.active

# Извлечение шапки
header = []
for row in ws.iter_rows(min_row=1, max_row=6, values_only=True):
header.append(row)

# Сохранение форматов шапки
header_formats = []
for row in ws.iter_rows(min_row=1, max_row=6):
row_formats = []
for cell in row:
cell_format = {
"fill": copy(cell.fill),
"font": copy(cell.font),
"border": copy(cell.border),
"alignment": copy(cell.alignment),
"number_format": copy(cell.number_format),
"protection": copy(cell.protection),
}
row_formats.append(cell_format)
header_formats.append(row_formats)

# Загрузка данных начиная с 7-й строки
data = pd.DataFrame(ws.iter_rows(min_row=7, values_only=True))

# Заменить 'Н/Д' на '#N/A'
data.replace('Н/Д', '#N/A', inplace=True)

# Функция сортировки отчета
def sort_report(report):
sorted_report = pd.DataFrame()
remaining_report = report.copy()

while not remaining_report.empty:
manager_idx = remaining_report[remaining_report.iloc[:, 4].str.startswith('SVlife', na=False)].index
if len(manager_idx) == 0:
break

manager_idx = manager_idx[0]
manager_row = remaining_report.loc[manager_idx]
manager_login = manager_row[8]

sorted_report = pd.concat([sorted_report, pd.DataFrame([manager_row])], ignore_index=True)
remaining_report = remaining_report.drop(manager_idx)

subordinates = remaining_report[remaining_report[4] == manager_login]
sorted_report = pd.concat([sorted_report, subordinates], ignore_index=True)
remaining_report = remaining_report.drop(subordinates.index)

return sorted_report

# Применить сортировку
sorted_report = sort_report(data)

# Создание нового файла с сохранением шапки и форматов
new_file_path = 'D:/Загрузки/sorted_EXPERIMENT_ITOG_final_38.xlsx'
new_wb = load_workbook(file_path)
new_ws = new_wb.active

# Перенос шапки
for r_idx, row in enumerate(header, start=1):
for c_idx, value in enumerate(row, start=1):
new_cell = new_ws.cell(row=r_idx, column=c_idx, value=value)
format = header_formats[r_idx-1][c_idx-1]
new_cell.fill = format['fill']
new_cell.font = format['font']
new_cell.border = format['border']
new_cell.alignment = format['alignment']
new_cell.number_format = format['number_format']
new_cell.protection = format['protection']

# Перенос отсортированных данных
for r_idx, row in enumerate(dataframe_to_rows(sorted_report, index=False, header=False), start=7):
for c_idx, value in enumerate(row, start=1):
new_ws.cell(row=r_idx, column=c_idx, value=value)

# Сохранение нового файла
new_wb.save(new_file_path)

print(f"Отчет сохранен в файл {new_file_path}")
Похожие вопросы