mirror of
https://github.com/serty2005/rmser.git
synced 2026-02-04 19:02:33 -06:00
2612-есть ок OCR, нужно допиливать бота под новый flow для операторов
This commit is contained in:
46
ocr-service/app/services/excel.py
Normal file
46
ocr-service/app/services/excel.py
Normal file
@@ -0,0 +1,46 @@
|
||||
import io
|
||||
import logging
|
||||
import re
|
||||
from openpyxl import load_workbook
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
|
||||
def extract_text_from_excel(content: bytes) -> str:
|
||||
"""
|
||||
Извлекает текстовое содержимое из Excel файла (.xlsx).
|
||||
|
||||
Проходит по всем строкам активного листа, собирает значения ячеек
|
||||
и формирует текстовую строку для передачи в LLM парсер.
|
||||
|
||||
Args:
|
||||
content: Байтовое содержимое Excel файла
|
||||
|
||||
Returns:
|
||||
Строка с текстовым представлением содержимого Excel файла
|
||||
"""
|
||||
try:
|
||||
# Загружаем workbook из байтов, data_only=True берет значения, а не формулы
|
||||
wb = load_workbook(filename=io.BytesIO(content), data_only=True)
|
||||
sheet = wb.active
|
||||
|
||||
lines = []
|
||||
for row in sheet.iter_rows(values_only=True):
|
||||
# Собираем непустые значения в строку через разделитель
|
||||
row_text = " | ".join([
|
||||
str(cell).strip()
|
||||
for cell in row
|
||||
if cell is not None and str(cell).strip() != ""
|
||||
])
|
||||
# Простая эвристика: строка должна содержать хотя бы одну букву (кириллица/латиница) И хотя бы одну цифру.
|
||||
# Это отсеет пустые разделители и чистые заголовки.
|
||||
if row_text and re.search(r'[a-zA-Zа-яА-Я]', row_text) and re.search(r'\d', row_text):
|
||||
lines.append(row_text)
|
||||
|
||||
result = "\n".join(lines)
|
||||
logger.info(f"Extracted {len(lines)} lines from Excel file")
|
||||
return result
|
||||
|
||||
except Exception as e:
|
||||
logger.error(f"Error extracting text from Excel: {e}", exc_info=True)
|
||||
raise
|
||||
Reference in New Issue
Block a user