Excel Import/Export
Detail modul excel_import.py - format Excel klien, validasi struktur, bulk insert, ekspor.
Modul: Excel Import/Export
Source:
backend/app/services/excel_import.pyLihat juga: Operasional → Instalasi
Tanggung Jawab
Impor dan ekspor soal dari/ke format Excel klien. Mendukung:
- Validasi struktur file Excel
- Parse metadata (KUNCI, TK, BOBOT) + data soal
- Bulk insert ke tabel
items - Ekspor tryout ke format Excel yang sama (round-trip)
Format Excel Klien
File .xlsx dengan struktur tetap. Sheet wajib: CONTOH.
Layout Baris & Kolom
Penting: Row 4 dan 5 berisi hasil formula Excel. Untuk membaca nilai terhitung (bukan formula string), harus pakai openpyxl.load_workbook(file, data_only=True).
Kolom Data Soal (Row 6+)
Minimum 8 kolom wajib.
Fungsi Publik
validate_excel_structure
Cek Validasi
parse_excel_import
Langkah:
- Validate structure (
validate_excel_structure) - Baca KUNCI dari Row 2 (
data_only=False) - Baca TK & BOBOT dari Row 4-5 (
data_only=True) - Iterasi Row 6+ untuk extract data soal
- Map ke struktur internal
ItemDict - Compute stats (valid/skipped)
bulk_insert_items
Menggunakan sqlalchemy bulk operations (session.add_all()) untuk efisiensi.
export_questions_to_excel
Round-trip fidelity: hasil ekspor harus bisa di-impor ulang dengan struktur identik.
Workflow Impor End-to-End
flowchart TD
A["Admin upload .xlsx"] --> B["validate_excel_structure"]
B -->|"invalid"| C["Return error list"]
B -->|"valid"| D["parse_excel_import"]
D --> E["Baca KUNCI row 2"]
D --> F["Baca TK row 4 data_only=True"]
D --> G["Baca BOBOT row 5 data_only=True"]
E --> H["Iterasi row 6+ extract soal"]
F --> H
G --> H
H --> I["Map ke ItemDict + compute p/bobot"]
I --> J["bulk_insert_items ke DB"]
J --> K["Return summary: inserted/failed"]
Handling Formula Excel
Excel klien punya formula di Row 4 (TK) dan Row 5 (BOBOT).openpyxl punya 2 mode baca:
Caveat: data_only=True hanya bekerja kalau file terakhir disimpan oleh Excel/Calc (yang meng-cache nilai formula). File yang dibuat via script tanpa pembukaan Excel akan punya value = None untuk cell berformula.
Error Handling
Strategi
- Fail-fast di
validate_excel_structure— hentikan kalau struktur dasar salah - Skip & log di
parse_excel_import— skip row individual yang invalid, lanjutkan row lain - Atomic insert di
bulk_insert_items— gunakan transaction, rollback semua kalau ada error fatal
Error yang Umum
Endpoint API
Detail: API → Admin.
Dependency
openpyxl(baca/tulis.xlsx)pandas(manipulasi data untuk laporan)sqlalchemyasync session- Model:
Item,Tryout
Bacaan Lanjutan
- Operasional → Instalasi — setup environment
- API → Admin — endpoint terkait
- Data → Data Models — struktur tabel
items - Modul → CTT Scoring — rumus p & Bobot yang di-impor
Last updated Jul 25, 2026