File size: 4,729 Bytes
8aacf5b
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
import gradio as gr
import os
import json
import logging
from main import main as process_file_main

LOG_FILE = "ocv_parser_log.txt"

def process_and_download(excel_file, headers_scan_rows, window_size, column_match_threshold):
    """
    Обрабатывает загруженный Excel-файл, генерирует JSON и возвращает файлы для скачивания.
    """
    if excel_file is None:
        return None, None, "Please upload an Excel file.", None

    # Логгер будет настроен внутри process_file_main
    logger = logging.getLogger(__name__)

    try:
        input_filepath = excel_file.name
        output_folder = "output"
        
        # Вызываем основную функцию обработки
        process_file_main(
            input_file=input_filepath,
            output_folder=output_folder,
            debug=True,
            headers_scan_rows=int(headers_scan_rows),
            window_size=int(window_size),
            column_match_threshold=float(column_match_threshold),
            log_file=LOG_FILE,
            clear_log=True  # Очищаем лог для каждого нового запуска
        )
        
        # Определяем путь к выходному файлу, который был создан в main
        input_filename = os.path.basename(input_filepath)
        output_filename = os.path.splitext(input_filename)[0] + '.json'
        output_json_path = os.path.join(output_folder, output_filename)
        
        # Читаем содержимое JSON файла для отображения
        with open(output_json_path, 'r', encoding='utf-8') as f:
            json_content = json.load(f)
            # Форматируем JSON для красивого отображения
            formatted_json = json.dumps(json_content, ensure_ascii=False, indent=2)

        # Логируем успешное завершение
        logging.getLogger(__name__).info(f"Processing successful! JSON at {output_json_path}, Log at {LOG_FILE}")

        return output_json_path, LOG_FILE, "Processing successful!", formatted_json

    except Exception as e:
        # Логируем ошибку
        logging.getLogger(__name__).error(f"An error occurred in Gradio app: {e}", exc_info=True)
        # Возвращаем файл лога даже в случае ошибки
        return None, LOG_FILE, f"An error occurred: {e}", None


# Описание для интерфейса Gradio
description = """
# OCV Parser

Upload your Excel file (Оборотно-сальдовая ведомость), adjust the parsing parameters, and get the structured JSON data.

The parsed data will be shown below and also available for download.
"""

with gr.Blocks() as demo:
    gr.Markdown(description)
    
    with gr.Row():
        with gr.Column():
            # Входные данные
            excel_upload = gr.File(label="Upload Excel File", file_types=[".xlsx", ".xls"])
            
            gr.Markdown("## Parsing Parameters")
            headers_scan_rows_input = gr.Slider(minimum=1, maximum=50, value=15, step=1, label="Headers Scan Rows")
            window_size_input = gr.Slider(minimum=10, maximum=500, value=100, step=10, label="Window Size")
            column_match_threshold_input = gr.Slider(minimum=0.01, maximum=1.0, value=0.05, step=0.01, label="Column Match Threshold")
            
            submit_button = gr.Button("Process File", variant="primary")
            
        with gr.Column():
            # Выходные данные
            status_output = gr.Textbox(label="Status", interactive=False)
            json_output_file = gr.File(label="Download JSON Result")
            log_output_file = gr.File(label="Download Log File")
            
    # JSON viewer в отдельной секции под основным интерфейсом
    with gr.Row():
        json_viewer = gr.Code(
            label="Parsed JSON Result", 
            language="json",
            interactive=False,
            lines=20,  # Показывать 20 строк изначально
            elem_classes=["json-viewer"]  # Для возможной кастомизации стилей
        )

    submit_button.click(
        fn=process_and_download,
        inputs=[
            excel_upload,
            headers_scan_rows_input,
            window_size_input,
            column_match_threshold_input
        ],
        outputs=[
            json_output_file,
            log_output_file,
            status_output,
            json_viewer
        ]
    )

if __name__ == "__main__":
    demo.launch()