Загрузка данных
from flask import Flask, render_template, request, send_file
import psycopg2
import traceback
import os
import tempfile
import xlrd
from xlutils.copy import copy as xl_copy
app = Flask(__name__)
# -------------------- Настройки подключения --------------------
DB_HOST = "172.16.2.38"
DB_PORT = 5432
DB_NAME = "dev_intern"
DB_USER = "dev_intern"
DB_PASSWORD = "Cneltynbr33"
TEMPLATE_PATH = "BLANKS6.XLS" # шаблон лежит в корне проекта
def get_db_connection():
return psycopg2.connect(
host=DB_HOST, port=DB_PORT, dbname=DB_NAME,
user=DB_USER, password=DB_PASSWORD
)
# -------------------- Главная страница --------------------
@app.route("/")
def index():
search_tabnum = request.args.get("tabnum", "").strip()
search_fam = request.args.get("fam", "").strip()
try:
conn = get_db_connection()
cur = conn.cursor()
query = "SELECT Tabnum, fam, imja, otch, nam_dol FROM rabotnik WHERE 1=1"
params = []
if search_tabnum:
query += " AND Tabnum = %s"
params.append(search_tabnum)
if search_fam:
query += " AND fam ILIKE %s"
params.append(f"%{search_fam}%")
query += " ORDER BY fam, imja"
cur.execute(query, params)
rows = cur.fetchall()
columns = [desc[0] for desc in cur.description]
cur.close()
conn.close()
return render_template("index.html", rows=rows, columns=columns,
search_tabnum=search_tabnum, search_fam=search_fam)
except Exception as e:
return f"<h2>Ошибка загрузки работников</h2><pre>{traceback.format_exc()}</pre>"
# -------------------- Страница детей --------------------
@app.route("/employee/<tabnum>/children")
def select_children(tabnum):
try:
conn = get_db_connection()
cur = conn.cursor()
cur.execute("SELECT fam, imja, otch, Tabnum, nam_dol FROM rabotnik WHERE Tabnum = %s", (tabnum,))
worker = cur.fetchone()
if not worker:
return f"<h2>Работник с таб. № {tabnum} не найден</h2><a href='/'>Назад</a>"
cur.execute("SELECT id, fam_rod, imja_rod, otch_rod, drog_rod, step_rod, pol_rod FROM deti WHERE tabnum = %s ORDER BY id", (tabnum,))
children = cur.fetchall()
cur.close()
conn.close()
# ВАЖНО: имя шаблона – employee.html (как у вас в папке templates)
return render_template("employee.html", worker=worker, children=children)
except Exception as e:
return f"<h2>Ошибка загрузки детей</h2><pre>{traceback.format_exc()}</pre>"
# -------------------- Экспорт ФИО в BLANKS6.XLS --------------------
@app.route("/employee/<tabnum>/export_worker")
def export_worker(tabnum):
try:
conn = get_db_connection()
cur = conn.cursor()
cur.execute("SELECT fam, imja, otch FROM rabotnik WHERE Tabnum = %s", (tabnum,))
worker = cur.fetchone()
cur.close()
conn.close()
if not worker:
return "Работник не найден"
if not os.path.exists(TEMPLATE_PATH):
return f"Файл шаблона {TEMPLATE_PATH} не найден. Положите его в папку с проектом."
rb = xlrd.open_workbook(TEMPLATE_PATH, formatting_info=True)
wb = xl_copy(rb)
ws = wb.get_sheet(0)
# ------------------------------------------------------------
# 1. БЕРЁМ ОБРАЗЕЦ СТИЛЯ из ячейки, где уже есть нужное форматирование
# (шрифт Times New Roman, выравнивание по центру, чёрные границы)
# Например, ячейка D18 (строка 18, колонка D) – на скриншоте видно,
# что там текст "Страховой номер...", значит, стиль там правильный.
# Индексы: строка 17, колонка 3 (т.к. счёт с 0)
# ------------------------------------------------------------
sample_row = 17 # строка 18
sample_col = 3 # колонка D
try:
sample_xf_index = rb.sheet_by_index(0).cell(sample_row, sample_col).xf_index
except:
sample_xf_index = None # если не получилось – будем писать без стиля
# Строки для ФИО (15, 16, 17) и стартовая колонка D
rows_for_fio = [14, 15, 16]
start_col = 3 # колонка D
fam, imja, otch = worker
# Запись фамилии (строка 15)
for i, ch in enumerate(fam):
col = start_col + i * 3 # D, G, J, M, ...
if col < 256:
if sample_xf_index is not None:
ws.write(rows_for_fio[0], col, ch, style=sample_xf_index)
else:
ws.write(rows_for_fio[0], col, ch)
# Запись имени (строка 16)
for i, ch in enumerate(imja):
col = start_col + i * 3
if col < 256:
if sample_xf_index is not None:
ws.write(rows_for_fio[1], col, ch, style=sample_xf_index)
else:
ws.write(rows_for_fio[1], col, ch)
# Запись отчества (строка 17)
for i, ch in enumerate(otch):
col = start_col + i * 3
if col < 256:
if sample_xf_index is not None:
ws.write(rows_for_fio[2], col, ch, style=sample_xf_index)
else:
ws.write(rows_for_fio[2], col, ch)
# Сохраняем во временный файл и отдаём
fd, tmp_path = tempfile.mkstemp(suffix=".xls")
os.close(fd)
wb.save(tmp_path)
return send_file(tmp_path, as_attachment=True,
download_name=f"BLANKS6_{tabnum}.xls",
mimetype="application/vnd.ms-excel")
except Exception as e:
return f"<h2>Ошибка экспорта</h2><pre>{traceback.format_exc()}</pre>"
# -------------------- Запуск --------------------
if __name__ == "__main__":
app.run(debug=True, host="0.0.0.0", port=5000)