312 lines
12 KiB
Plaintext
312 lines
12 KiB
Plaintext
{
|
||
"cells": [
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 70,
|
||
"id": "c7f0feca",
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"import pandas as pd\n",
|
||
"import openpyxl\n",
|
||
"import os\n",
|
||
"from tqdm import tqdm\n",
|
||
"from datetime import datetime"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 71,
|
||
"id": "c3d2a034",
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"DB_FILE = 'files/source.xlsx'\n",
|
||
"TEMPLATE_FILE = 'files/template.xlsx'\n",
|
||
"OUTPUT_FOLDER = 'files/output/'\n",
|
||
"\n",
|
||
"\n",
|
||
"MAPPING = {\n",
|
||
" 'Дата МО' : 'Q1',\n",
|
||
" 'Время МО' : 'Q2',\n",
|
||
" 'Номер направления': 'A13',\n",
|
||
" 'Фамилия, имя, отчество': 'D21',\n",
|
||
" 'Дата рождения': 'D22',\n",
|
||
" 'Структурное подразделение': 'F26',\n",
|
||
" 'Должность работника ': 'F27',\n",
|
||
" '''Наименование вредных производственных факторов или фидов работ (приложение к приказу Минздрава РФ от 28.01.2021 №29Н)''': 'F30'\n",
|
||
"}\n",
|
||
"\n",
|
||
"if not os.path.exists(OUTPUT_FOLDER):\n",
|
||
" os.makedirs(OUTPUT_FOLDER)"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 72,
|
||
"id": "753709e8",
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"name": "stdout",
|
||
"output_type": "stream",
|
||
"text": [
|
||
"Всего сотрудников в списке: 1482\n"
|
||
]
|
||
},
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"Index(['Дата МО', 'Время МО', 'Номер направления', 'Фамилия, имя, отчество',\n",
|
||
" 'Должность работника ', 'Дата рождения', 'Структурное подразделение',\n",
|
||
" 'Наименование вредных производственных факторов или фидов работ (приложение к приказу Минздрава РФ от 28.01.2021 №29Н)',\n",
|
||
" 'Примечания'],\n",
|
||
" dtype='object')"
|
||
]
|
||
},
|
||
"execution_count": 72,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"df = pd.read_excel(DB_FILE)\n",
|
||
"print(f\"Всего сотрудников в списке: {len(df)}\")\n",
|
||
"# print(df.columns.tolist())\n",
|
||
"\n",
|
||
"df.columns"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 73,
|
||
"id": "dca336b7",
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/html": [
|
||
"<div>\n",
|
||
"<style scoped>\n",
|
||
" .dataframe tbody tr th:only-of-type {\n",
|
||
" vertical-align: middle;\n",
|
||
" }\n",
|
||
"\n",
|
||
" .dataframe tbody tr th {\n",
|
||
" vertical-align: top;\n",
|
||
" }\n",
|
||
"\n",
|
||
" .dataframe thead th {\n",
|
||
" text-align: right;\n",
|
||
" }\n",
|
||
"</style>\n",
|
||
"<table border=\"1\" class=\"dataframe\">\n",
|
||
" <thead>\n",
|
||
" <tr style=\"text-align: right;\">\n",
|
||
" <th></th>\n",
|
||
" <th>Дата МО</th>\n",
|
||
" <th>Время МО</th>\n",
|
||
" <th>Номер направления</th>\n",
|
||
" <th>Фамилия, имя, отчество</th>\n",
|
||
" <th>Должность работника</th>\n",
|
||
" <th>Дата рождения</th>\n",
|
||
" <th>Структурное подразделение</th>\n",
|
||
" <th>Наименование вредных производственных факторов или фидов работ (приложение к приказу Минздрава РФ от 28.01.2021 №29Н)</th>\n",
|
||
" <th>Примечания</th>\n",
|
||
" </tr>\n",
|
||
" </thead>\n",
|
||
" <tbody>\n",
|
||
" <tr>\n",
|
||
" <th>0</th>\n",
|
||
" <td>2026-02-02</td>\n",
|
||
" <td>09:30</td>\n",
|
||
" <td>1</td>\n",
|
||
" <td>Орлова Ксения Николаевна</td>\n",
|
||
" <td>Доцент</td>\n",
|
||
" <td>17.07.1985</td>\n",
|
||
" <td>кафедра радиационной физики и безопасности ато...</td>\n",
|
||
" <td>4.1</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>1</th>\n",
|
||
" <td>2026-02-02</td>\n",
|
||
" <td>09:35</td>\n",
|
||
" <td>2</td>\n",
|
||
" <td>Камнев Владимир Александрович</td>\n",
|
||
" <td>Специалист по учебно-методической работе 1 кат...</td>\n",
|
||
" <td>24.01.1955</td>\n",
|
||
" <td>кафедра радиационной физики и безопасности ато...</td>\n",
|
||
" <td>4.1</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>2</th>\n",
|
||
" <td>2026-02-02</td>\n",
|
||
" <td>09:40</td>\n",
|
||
" <td>3</td>\n",
|
||
" <td>Стогов Юрий Владимирович</td>\n",
|
||
" <td>Доцент</td>\n",
|
||
" <td>05.01.1959</td>\n",
|
||
" <td>кафедра теоретической и экспериментальной физи...</td>\n",
|
||
" <td>4.1</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>3</th>\n",
|
||
" <td>2026-02-02</td>\n",
|
||
" <td>09:45</td>\n",
|
||
" <td>4</td>\n",
|
||
" <td>Алферов Владимир Петрович</td>\n",
|
||
" <td>Заместитель главного инженера исследовательско...</td>\n",
|
||
" <td>08.11.1948</td>\n",
|
||
" <td>исследовательский реактор типовой атомного центра</td>\n",
|
||
" <td>4.1</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>4</th>\n",
|
||
" <td>2026-02-02</td>\n",
|
||
" <td>09:50</td>\n",
|
||
" <td>5</td>\n",
|
||
" <td>Савостиков Сергей Алексеевич</td>\n",
|
||
" <td>Слесарь по ремонту и обслуживанию систем венти...</td>\n",
|
||
" <td>20.05.1988</td>\n",
|
||
" <td>теплоэнергетический отдел службы главного инже...</td>\n",
|
||
" <td>5.1, 6.2</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" </tr>\n",
|
||
" </tbody>\n",
|
||
"</table>\n",
|
||
"</div>"
|
||
],
|
||
"text/plain": [
|
||
" Дата МО Время МО Номер направления Фамилия, имя, отчество \\\n",
|
||
"0 2026-02-02 09:30 1 Орлова Ксения Николаевна \n",
|
||
"1 2026-02-02 09:35 2 Камнев Владимир Александрович \n",
|
||
"2 2026-02-02 09:40 3 Стогов Юрий Владимирович \n",
|
||
"3 2026-02-02 09:45 4 Алферов Владимир Петрович \n",
|
||
"4 2026-02-02 09:50 5 Савостиков Сергей Алексеевич \n",
|
||
"\n",
|
||
" Должность работника Дата рождения \\\n",
|
||
"0 Доцент 17.07.1985 \n",
|
||
"1 Специалист по учебно-методической работе 1 кат... 24.01.1955 \n",
|
||
"2 Доцент 05.01.1959 \n",
|
||
"3 Заместитель главного инженера исследовательско... 08.11.1948 \n",
|
||
"4 Слесарь по ремонту и обслуживанию систем венти... 20.05.1988 \n",
|
||
"\n",
|
||
" Структурное подразделение \\\n",
|
||
"0 кафедра радиационной физики и безопасности ато... \n",
|
||
"1 кафедра радиационной физики и безопасности ато... \n",
|
||
"2 кафедра теоретической и экспериментальной физи... \n",
|
||
"3 исследовательский реактор типовой атомного центра \n",
|
||
"4 теплоэнергетический отдел службы главного инже... \n",
|
||
"\n",
|
||
" Наименование вредных производственных факторов или фидов работ (приложение к приказу Минздрава РФ от 28.01.2021 №29Н) \\\n",
|
||
"0 4.1 \n",
|
||
"1 4.1 \n",
|
||
"2 4.1 \n",
|
||
"3 4.1 \n",
|
||
"4 5.1, 6.2 \n",
|
||
"\n",
|
||
" Примечания \n",
|
||
"0 NaN \n",
|
||
"1 NaN \n",
|
||
"2 NaN \n",
|
||
"3 NaN \n",
|
||
"4 NaN "
|
||
]
|
||
},
|
||
"execution_count": 73,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"df.head()"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 74,
|
||
"id": "94ab472b",
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"name": "stderr",
|
||
"output_type": "stream",
|
||
"text": [
|
||
"100%|██████████| 1482/1482 [00:54<00:00, 27.41it/s]"
|
||
]
|
||
},
|
||
{
|
||
"name": "stdout",
|
||
"output_type": "stream",
|
||
"text": [
|
||
"\n",
|
||
"Файлы сохранены в 'files/output/'\n"
|
||
]
|
||
},
|
||
{
|
||
"name": "stderr",
|
||
"output_type": "stream",
|
||
"text": [
|
||
"\n"
|
||
]
|
||
}
|
||
],
|
||
"source": [
|
||
"for index, row in tqdm(df.iterrows(), total=len(df)):\n",
|
||
" wb = openpyxl.load_workbook(TEMPLATE_FILE)\n",
|
||
" ws = wb.active\n",
|
||
"\n",
|
||
" # Заполняем поля по словарю MAPPING\n",
|
||
" for excel_col, cell_address in MAPPING.items():\n",
|
||
" value = row.get(excel_col, \"\")\n",
|
||
"\n",
|
||
" if pd.isna(value):\n",
|
||
" value = \"\"\n",
|
||
"\n",
|
||
" if cell_address == 'A13':\n",
|
||
" ws[cell_address] = f\"НАПРАВЛЕНИЕ № {value}\"\n",
|
||
"\n",
|
||
" elif isinstance(value, (datetime, pd.Timestamp)):\n",
|
||
" ws[cell_address] = value.strftime('%d.%m.%Y')\n",
|
||
"\n",
|
||
" else:\n",
|
||
" ws[cell_address] = str(value)\n",
|
||
"\n",
|
||
" num = str(row.get('Номер направления', index + 1))\n",
|
||
" fio = str(row.get('Фамилия, имя, отчество')).strip().replace(' ', '_')\n",
|
||
" file_name = f\"Направление_№{num}_{fio}.xlsx\"\n",
|
||
"\n",
|
||
" save_path = os.path.join(OUTPUT_FOLDER, file_name)\n",
|
||
" wb.save(save_path)\n",
|
||
"\n",
|
||
"print(f\"\\nФайлы сохранены в '{OUTPUT_FOLDER}'\")"
|
||
]
|
||
}
|
||
],
|
||
"metadata": {
|
||
"kernelspec": {
|
||
"display_name": "med-check-generator",
|
||
"language": "python",
|
||
"name": "python3"
|
||
},
|
||
"language_info": {
|
||
"codemirror_mode": {
|
||
"name": "ipython",
|
||
"version": 3
|
||
},
|
||
"file_extension": ".py",
|
||
"mimetype": "text/x-python",
|
||
"name": "python",
|
||
"nbconvert_exporter": "python",
|
||
"pygments_lexer": "ipython3",
|
||
"version": "3.13.11"
|
||
}
|
||
},
|
||
"nbformat": 4,
|
||
"nbformat_minor": 5
|
||
}
|