یک سرویس وب یکپارچه برای پردازش و ادغام فایلهای اکسل با رابط کاربری فارسی
این پروژه با استفاده از Feature-Sliced Design (FSD) و FastAPI طراحی شده است. کد به صورت ماژولار و بر اساس ویژگیهای کسبوکار سازماندهی شده است، نه لایههای فنی. هر ویژگی در پوشه خودش قرار دارد و میتواند به صورت مستقل حذف یا اضافه شود.
- جداسازی ویژگیها: هر ویژگی در پوشه خودش قرار دارد
- قابلیت توسعه: افزودن ویژگی جدید با ایجاد یک پوشه جدید
- قابلیت نگهداری: مرزهای واضح و جداسازی نگرانیها
- قابلیت تست: ویژگیها به صورت مستقل قابل تست هستند
- API بدون حالت: استفاده از File ID به جای Session برای مقیاسپذیری
- ادغام فایلها: ترکیب چندین فایل اکسل در یک فایل واحد
- پیدا کردن و ادغام تکراریها: شناسایی ردیفهای تکراری و ادغام آنها با جمعآوری مقادیر عددی
- مرتبسازی: مرتبسازی دادهها بر اساس ستون انتخابی (صعودی یا نزولی)
- تبدیل اعداد: تبدیل اعداد فارسی (۰-۹) به انگلیسی (0-9) و بالعکس
- فیلتر داده: فیلتر دادهها بر اساس شرایط مختلف
- مدیریت ستونها: حذف، تغییر نام، و مرتبسازی مجدد ستونها
- جستجو و جایگزینی: جستجو و جایگزینی متن در ستونهای مشخص
- تبدیل نوع داده: تبدیل نوع داده ستونها (عدد، متن، تاریخ و ...)
- ستونهای محاسباتی: افزودن ستونهای محاسباتی با فرمولهای مختلف
- تقسیم داده: تقسیم داده به چند فایل بر اساس ستون یا تعداد ردیف
- پشتیبانی از فارسی و انگلیسی: شناسایی خودکار ستونها با نامهای فارسی و انگلیسی
- رابط کاربری فارسی: رابط کاربری زیبا و کاربرپسند با پشتیبانی کامل از راستچین
- Python 3.11 یا بالاتر
- مرورگر وب مدرن
- Docker installed (Install Docker)
- Docker Compose installed (usually included with Docker Desktop)
- ایجاد و فعالسازی محیط مجازی (توصیه میشود):
python3 -m venv venv
source venv/bin/activate # در ویندوز: venv\Scripts\activate- نصب وابستگیها:
pip install -r requirements.txt- اجرای برنامه:
uvicorn app.main:app --host 0.0.0.0 --port 5000 --reloadیا:
python -m uvicorn app.main:app --host 0.0.0.0 --port 5000- باز کردن مرورگر و رفتن به آدرس:
http://localhost:5000
-
ساخت و اجرای کانتینر:
docker compose up -d
-
مشاهده لاگها:
docker compose logs -f
-
توقف سرویس:
docker compose down
-
بازسازی کانتینر (پس از تغییرات):
docker compose up -d --build
-
ساخت تصویر:
docker build -t excel-processor . -
اجرای کانتینر:
docker run -d \ --name excel-processing-service \ -p 5000:5000 \ -v $(pwd)/uploads:/app/uploads \ -v $(pwd)/output:/app/output \ excel-processor
-
مشاهده لاگها:
docker logs -f excel-processing-service
-
توقف کانتینر:
docker stop excel-processing-service docker rm excel-processing-service
پس از اجرای کانتینر، برنامه در آدرس زیر در دسترس است:
http://localhost:5000
تغییر پورت:
برای تغییر پورت در docker-compose.yml:
ports:
- "8080:5000" # پورت خارجی:پورت داخلییا در دستور Docker:
docker run -d -p 8080:5000 ...متغیرهای محیطی:
میتوانید متغیرهای محیطی را در docker-compose.yml تنظیم کنید:
environment:
- HOST=0.0.0.0
- PORT=5000
- FLASK_DEBUG=0مدیریت دادهها:
- فایلهای آپلود شده در پوشه
uploads/ذخیره میشوند - فایلهای پردازش شده در پوشه
output/ذخیره میشوند - این پوشهها به صورت volume به کانتینر متصل شدهاند
بررسی وضعیت کانتینر:
docker psبررسی لاگهای خطا:
docker-compose logs excel-processorورود به کانتینر:
docker exec -it excel-processing-service bashبازسازی کامل:
docker-compose down
docker-compose build --no-cache
docker-compose up -dبرای بهروزرسانی برنامه:
# دریافت آخرین تغییرات
git pull
# بازسازی و راهاندازی مجدد
docker-compose up -d --buildبرای محیط تولید، توصیه میشود:
- استفاده از uvicorn با workers متعدد
- تنظیم reverse proxy (Nginx)
- استفاده از HTTPS
- تنظیم محدودیتهای امنیتی
مثال با uvicorn workers:
uvicorn app.main:app --host 0.0.0.0 --port 5000 --workers 4- آپلود فایلهای اکسل (میتوانید چند فایل را همزمان آپلود کنید)
- انتخاب گزینههای پردازش مورد نظر
- تنظیم گزینههای پیشرفته (ستونهای گروهبندی، مرتبسازی و ...)
- کلیک روی دکمه "پردازش فایلها"
- دانلود فایل پردازش شده
Unified_Excel_Service/
├── app/ # برنامه اصلی FastAPI
│ ├── __init__.py # Export اصلی
│ ├── main.py # نقطه ورود برنامه
│ ├── config.py # تنظیمات برنامه
│ │
│ ├── shared/ # ابزارهای مشترک
│ │ ├── storage/ # مدیریت فایل
│ │ │ ├── manager.py # مدیریت ذخیرهسازی فایل
│ │ │ └── cleanup.py # پاکسازی فایلهای موقت
│ │ ├── excel/ # ابزارهای اکسل
│ │ │ ├── reader.py # خواندن ایمن فایل اکسل
│ │ │ ├── column_detector.py # شناسایی ستونها
│ │ │ └── number_converter.py # تبدیل اعداد فارسی/انگلیسی
│ │ └── responses.py # فرمت پاسخهای API
│ │
│ ├── features/ # ماژولهای ویژگی (FSD)
│ │ ├── __init__.py # ثبت ویژگیها
│ │ │
│ │ ├── file_upload/ # ویژگی: آپلود فایل
│ │ │ ├── api.py # مسیرهای FastAPI
│ │ │ ├── service.py # منطق کسبوکار
│ │ │ └── models.py # مدلهای Pydantic
│ │ │
│ │ ├── file_preview/ # ویژگی: پیشنمایش داده
│ │ ├── statistics/ # ویژگی: آمار و خلاصه
│ │ ├── processing/ # ویژگی: پردازش (Orchestration)
│ │ │ ├── api.py
│ │ │ ├── service.py
│ │ │ ├── models.py
│ │ │ └── pipeline.py # ساختار خط پردازش
│ │ │
│ │ ├── processors/ # پردازشگرهای فردی
│ │ │ ├── __init__.py # ثبت پردازشگرها
│ │ │ ├── concatenate/ # ادغام فایلها
│ │ │ ├── duplicate_detection/ # شناسایی تکراریها
│ │ │ ├── sorting/ # مرتبسازی
│ │ │ ├── number_conversion/ # تبدیل اعداد
│ │ │ ├── filtering/ # فیلتر داده
│ │ │ ├── column_removal/ # حذف ستون
│ │ │ ├── column_rename/ # تغییر نام ستون
│ │ │ ├── column_reorder/ # مرتبسازی ستون
│ │ │ ├── find_replace/ # جستجو و جایگزینی
│ │ │ ├── type_conversion/ # تبدیل نوع داده
│ │ │ ├── calculated_column/ # ستون محاسباتی
│ │ │ ├── data_splitting/ # تقسیم داده
│ │ │ ├── amount_normalization/ # یکسانسازی Amount
│ │ │ ├── aggregation/ # تجمع داده
│ │ │ └── mobile_exclusion/ # حذف بر اساس موبایل
│ │ │
│ │ └── file_download/ # ویژگی: دانلود فایل
│ │
│ └── middleware/ # Middleware سراسری
│ ├── error_handler.py # مدیریت خطا
│ └── cleanup.py # پاکسازی پسزمینه
│
├── static/ # فایلهای استاتیک
│ ├── css/
│ │ ├── base.css # استایلهای پایه
│ │ └── features/ # استایلهای ویژگیمحور
│ │ ├── file-upload.css
│ │ ├── processing-options.css
│ │ ├── preview.css
│ │ ├── statistics.css
│ │ └── download.css
│ ├── js/
│ │ ├── app.js # برنامه اصلی
│ │ ├── api/ # کلاینت API
│ │ │ ├── client.js
│ │ │ └── endpoints.js
│ │ └── features/ # ماژولهای ویژگی
│ │ ├── file-upload/
│ │ ├── preview/
│ │ ├── statistics/
│ │ └── processing/
│ │ └── utils/ # ابزارهای مشترک
│ │ ├── file-id-manager.js
│ │ └── error-handler.js
│
├── templates/
│ └── index.html # رابط کاربری HTML
│
├── uploads/ # فایلهای آپلود شده (موقت)
├── output/ # فایلهای پردازش شده
│
├── requirements.txt # وابستگیهای Python
├── Dockerfile # تصویر Docker
├── docker-compose.yml # تنظیمات Docker Compose
└── README.md # این فایل
همه فایلهای آپلود شده را در یک فایل واحد ترکیب میکند.
- ردیفهای تکراری را بر اساس ستونهای انتخابی شناسایی میکند
- مقادیر عددی را جمع میزند
- ستون "تعداد تکرار" را اضافه میکند که نشان میدهد هر ردیف چند بار تکرار شده است
- انتخاب ستون برای مرتبسازی
- انتخاب جهت مرتبسازی (صعودی یا نزولی)
همه اعداد فارسی (۰۱۲۳۴۵۶۷۸۹) را به اعداد انگلیسی (0123456789) تبدیل میکند.
همه اعداد انگلیسی (0123456789) را به اعداد فارسی (۰۱۲۳۴۵۶۷۸۹) تبدیل میکند.
فیلتر دادهها بر اساس شرایط مختلف (برابر، شامل، بزرگتر از، کوچکتر از و ...)
- حذف ستونهای مشخص
- تغییر نام ستونها
- مرتبسازی مجدد ستونها
جستجو و جایگزینی متن در ستونهای مشخص
تبدیل نوع داده ستونها (عدد صحیح، اعشاری، متن، تاریخ، بولین)
افزودن ستونهای محاسباتی با فرمولهای مختلف (جمع، میانگین، ضرب، تقسیم و ...)
تقسیم داده به چند فایل بر اساس ستون یا تعداد ردیف
برنامه به طور خودکار ستونهای زیر را شناسایی میکند:
- نام:
نام،نام و نام خانوادگی،نام خانوادگی - تلفن:
شماره تماس،تلفن،موبایل - تعداد:
تعداد،تعداد اعلام حضور،شمارش
- نام:
name - تلفن:
phone - تعداد:
count
POST /api/upload- آپلود فایلهای اکسلPOST /api/upload-exclusion- آپلود فایل استثنا برای حذف موبایل
POST /api/preview- پیشنمایش دادههاPOST /api/statistics- دریافت آمار و خلاصه
POST /api/process- پردازش فایلها با گزینههای انتخابی
GET /api/download/{filename}- دانلود فایل پردازش شده
.xlsx(Excel 2007+).xls(Excel 97-2003)
- حداکثر اندازه فایل: 100 مگابایت
- فایلهای آپلود شده به صورت موقت ذخیره میشوند و پس از پردازش پاک میشوند
- در صورت بروز خطا، پیام خطا به فارسی نمایش داده میشود
- API بدون حالت است و از File ID برای مدیریت فایلها استفاده میکند
برای افزودن یک ویژگی جدید:
- ایجاد پوشه ویژگی در
app/features/ - ایجاد فایلهای
api.py,service.py,models.py - ثبت router در
app/features/__init__.py - ویژگی به صورت خودکار در برنامه ثبت میشود
برای افزودن یک پردازشگر جدید:
- ایجاد پوشه پردازشگر در
app/features/processors/ - پیادهسازی تابع
process(df, config)درprocessor.py - ثبت پردازشگر در
app/features/processors/__init__.py - پردازشگر در خط پردازش در دسترس خواهد بود
مشکل: "ModuleNotFoundError"
- راه حل: وابستگیها را نصب کنید:
pip install -r requirements.txt
مشکل: "خطا در خواندن فایل"
- راه حل: مطمئن شوید فایل اکسل معتبر است و فرمت صحیح دارد (.xlsx یا .xls)
مشکل: "هیچ فایلی برای پردازش یافت نشد"
- راه حل: ابتدا فایلها را آپلود کنید و سپس روی دکمه پردازش کلیک کنید
مشکل: "ImportError"
- راه حل: مطمئن شوید که از Python 3.11 یا بالاتر استفاده میکنید
برای مشکلات Docker، به بخش "عیبیابی Docker" در بالا مراجعه کنید.
این پروژه برای اهداف پردازش داده ارائه شده است.
میتوانید این برنامه را برای نیازهای خاص خود تغییر دهید.
