1. Kirish: Nega yana “Excel”?
Korporativ yechimlarni ishlab chiqishda eng keng tarqalgan, ammo eng murakkab talablardan biri, shubhasiz, **“Excel bilan ishlash”**dir. Haqiqiy biznes muhitidagi foydalanuvchilar veb-ekranlardagi chiroyli dashboardlarni shunchaki ko‘rish bilan cheklanib qolishni istamaydilar: ular murakkab, ko‘p sarlavhali jadval ma’lumotlarini so‘rashni, guruhlar asosidagi daraxt tuzilmasida formatlangan shablonlarni yuklab olishni, oflayn ishlashni va keyin natijalarni tizimga ommaviy tarzda qayta yuklashni xohlaydilar.
Uzoq vaqt davomida Apache POI Java backend ekotizimida Excel bilan ishlash uchun amaldagi standart bo‘lib kelgan. Ochiq manbali ekotizimdagi ko‘plab qo‘llanmalar va bepul ekanining katta afzalligi tufayli aksariyat loyihalar POI bilan boshlanadi. Biroq quyidagi murakkab biznes talablari birlashganda, ishlab chiqish jamoalari ulkan texnik to‘siqqa duch keladilar.
-
**Murakkab ierarxik ko‘p sarlavhali (Multi-Header)** va daraxt tuzilmalariga ega guruh maydonlari shablonlarini yaratish
-
Quyidagiga o‘xshash yuqori unumdor elektron jadval komponenti joriy etilganda: SpreadJSveb interfeysda frontend va backend o‘rtasida formatlash va ma’lumotlarni sinxronlashtirish nomuvofiqliklari yuzaga kelishi mumkin
-
Oddiy qiymatlarni kiritish/chiqarishdan tashqari, SUMPRODUCT, DSUM va boshqa ilg‘or statistik/formulalarni hisoblash mexanizmlariserver tomonida real vaqt rejimida hisoblanishi
-
O‘n minglabdan yuz minglab qatorlargacha bo‘lgan ma’lumotlarni qayta ishlashda JVM OutOfMemoryError(OOM) va GC keskin o‘sishlari yuzaga keladi
Ushbu maqolada Apache POI muhitida duch kelgan amaliy cheklovlar ko‘rib chiqiladi va **DsExcel (Document Solutions for Excel, avvalgi nomi GcExcel)**ʼni joriy etish orqali arxitekturani yangilash tajribamiz bilan o‘rtoqlashiladi. Xususan, frontenddagi SpreadJS bilan native JSON integratsiyasining uyg‘unligi, shuningdek, daraxt tuzilmasidagi shablonlarni import qilish, ko‘p sarlavhali jadvallarni eksport qilish va murakkab formulalarni qayta ishlash strategiyalari— biz avval domen modellashtirish va ma’lumotlar dizayni jarayonida sinchiklab ko‘rib chiqqan yondashuvlar — kod va arxitektura darajalarida batafsil yoritiladi.
2. Backend Excel mexanizmlarini chuqur taqqoslash: Apache POI va DsExcel
Backend uchun Excel kutubxonasini tanlashda e’tiborga olinadigan asosiy omillar — xotira arxitekturasi, formulalarni hisoblash mexanizmi, shablonlar bilan ishlash samaradorligi va litsenziya xarajatlari.
2.1 Arxitektura va xotirani boshqarish modellari
Apache POIʼning ikki xil modeli (XSSFWorkbook va SXSSFWorkbook)
-
XSSFWorkbook (DOM modeli): XLSX faylidagi barcha varaqlar, qatorlar, kataklar va uslub obyektlarini to‘liq obyektlar grafigi ko‘rinishida JVM heap xotirasiga yuklaydi. Ma’lumotlar o‘n minglab yozuvlardan oshganda, har bir katak uchun ko‘plab Java wrapper obyektlari yaratiladi, natijada xotira sarfi eksponensial ravishda oshib, tezda OOM yuzaga keladi.
-
SXSSFWorkbook (oqimli oyna modeli): OOM muammosini bartaraf etish uchun u xotirada faqat siljiydigan oynani (masalan, eng so‘nggi 100 ta qatorni) saqlaydi, qolganlarini esa diskdagi vaqtinchalik fayllarga chiqarib yuboradi. Biroq bu yondashuv jiddiy cheklovlarga ega.
-
Avval qayta ishlangan qatorlarni o‘zgartirish yoki ularga teskari tartibda murojaat qilishning imkoni yo‘q.
-
Birlashtirilgan kataklarni (Merged Region) yoki ierarxik sarlavhalarni dinamik ravishda qayta hisoblash nihoyatda qiyin.
-
Varaqlararo havolalarga ega formulalarni hisoblash va pivot jadvallarni qo‘llab-quvvatlash deyarli imkonsiz.
-
Shablon asosidagi hisobotlarni yaratishda mavjud shablon formatini o‘qish bilan bir vaqtda oqimli yozish amallarini (Read-Write Template) bajarish qiyin.
DsExcelʼning yuqori unumdor mexanizm arxitekturasi
-
DsExcel Microsoft Excelʼning hisoblash mexanizmi va ichki ma’lumotlar tuzilmalarini mukammal taqlid qiladi, shu bilan birga Java/.NET muhitlariga moslashtirilgan, yuqori darajada optimallashtirilgan xotira xaritasi tuzilmasidan foydalanadi.
-
Pointerlar va primitiv massivlarga asoslangan xotira optimallashtirishi: POI kabi har bir katak uchun og‘ir obyekt nusxalarini cheksiz yaratish o‘rniga, u ma’lumotlar va uslublarni ichki indekslar asosida keshlaydi. Shu tariqa heap xotirasidan foydalanish POIʼnikining taxminan 1/5–1/10 qismi bilan cheklanadi.
-
U vaqtinchalik disk kiritish/chiqarish amallaridan foydalanmasdan, yuz minglab yoki undan ham ko‘p qatorli ish kitoblarini to‘liq xotirada yuqori tezlikda yaratishi va tahlil qilishi mumkin.
2.2 Formulalarni hisoblash mexanizmidagi farqlar
Amaliyotda SUMPRODUCT, DSUM, INDEX/MATCH, XLOOKUP va dinamik massivlar (Spill) kabi ko‘p so‘raladigan formulalarni qo‘llab-quvvatlash mexanizm yetukligining hal qiluvchi ko‘rsatkichidir.
-
Apache POI: FormulaEvaluator ichki o‘rnatilgan bo‘lsa-da, qo‘llab-quvvatlanadigan funksiyalar ro‘yxati cheklangan. Xususan, ko‘p shartli massiv amallarini bajaruvchi SUMPRODUCT yoki ma’lumotlar bazasi funksiyalarini (DSUM, DCOUNT) hisoblashda implementatsiyalar ko‘pincha mavjud bo‘lmaydi yoki murakkab ichma-ich qavslarni tahlil qilishda NotImplementedException tez-tez yuzaga keladi.
-
DsExcel: Unda Microsoft Excel spetsifikatsiyalariga 100% mos keladigan, mustaqil va yuqori unumdor formulalarni hisoblash mexanizmi mavjud bo‘lib, u 450 dan ortiq standart Excel funksiyalarini oflayn rejimda (server tomonida) mukammal hisoblay oladi. Excel Desktop yoki Office Interop (Interop)ʼni o‘rnatmasdan, formulalarning to‘liq izchilligini kafolatlaydi.
2.3 Shablonlarni bog‘lash samaradorligi
-
POI yondashuvi: Loyihalashtirilgan Excel formatini yuklagandan so‘ng, dasturchilar qator/ustun indekslarini (rowNum++, cellNum++) qo‘lda hisoblashlari va Java kodi orqali shrift, chegara hamda fon rangi uslublarini kiritishlari kerak. Rejalashtiruvchi yoki dizayner formatlashning hatto bitta qatorini o‘zgartirsa ham, backendʼdagi indekslarni hisoblash mantiqi to‘liq buziladi.
-
DsExcel yondashuvi: Kuchli Deklarativ shablon mexanizmistandart holatda taqdim etiladi. Agar Excel fayliga {{ds.fieldName}} va {{ds.group(R=T)}} kabi sintaksisni to‘g‘ridan-to‘g‘ri yozsangiz, backend Java POJO yoki JSON ma’lumotlar to‘plamini uzatish orqali takrorlanuvchi qatorlarni avtomatik kengaytirish, oraliq jami/jami qatorlarini qo‘shish va kataklarni dinamik birlashtirishni yakunlashi mumkin.
2.4 Keng qamrovli taqqoslash jadvali
|
Taqqoslash bandi |
Apache POI (XSSF / SXSSF) |
DsExcel (Document Solutions for Excel) |
|---|---|---|
|
Litsenziya |
Ochiq manbali (Apache License 2.0, bepul) |
Tijoriy litsenziya (MESCIUS, dasturchi/yadro litsenziyasi) |
|
Xotira hajmi |
XSSF: juda yuqori / SXSSF: past |
Xotira ichidagi optimallashtirish tufayli juda past va barqaror |
|
Oqimli ishlash cheklovlari |
O‘qish/o‘zgartirish bo‘yicha cheklovlar mavjud va formulalarni hisoblash qo‘llab-quvvatlanmaydi |
Interfeysni to‘liq qo‘llab-quvvatlash (tasodifiy kirish mavjud) |
|
SpreadJS integratsiyasi |
Standart bo‘lmagan (XLSX baytlarini tahlil qilish talab etiladi) |
Mahalliy qo‘llab-quvvatlash (fromJson va toJson bilan to‘liq moslik) |
|
Formulalarni hisoblashni qo‘llab-quvvatlash |
Asosan asosiy funksiyalarga yo‘naltirilgan, ilg‘or formulalarda cheklovlar mavjud |
450 dan ortiq Excel funksiyalari va dinamik massivlarni qo‘llab-quvvatlaydi |
|
Shablon mexanizmi |
Mavjud emas (qo‘lda kod yozish talab etiladi) |
O‘rnatilgan deklarativ shablon sintaksisi |
|
Hujjatlarni konvertatsiya qilish imkoniyatlari |
Alohida vositalar bilan integratsiyani talab qiladi |
PDF, HTML va tasvirlarga to‘g‘ridan-to‘g‘ri konvertatsiyani qo‘llab-quvvatlaydi |
3. Frontend (SpreadJS) bilan uyg‘unlik: to‘liq full-stack Excel quvuri
SpreadJS’niSpreadJSfrontend jadval komponenti sifatida qabul qilgan tizimlar uchun backend mexanizmi sifatida DsExcel’ni tanlash shunchaki muqobil variant emas, balki muhim arxitektura qaroridir.
3.1 Yo‘qotishsiz mahalliy JSON almashinuvi (fidelitetning nol darajada yo‘qolishi)
Odatda veb-ekran (grid) tarkibini server tomonidagi Excel fayliga eksport qilish yoki undan import qilish quyidagi murakkab to‘siq bosqichlaridan o‘tishni talab qiladi.
-
Mavjud yondashuv (SpreadJS + Apache POI):
a. Mijoz tomonida XLSX ikkilik blobini yaratish (SpreadJS)
b. Tarmoq orqali bir necha MB ikkilik ma’lumotni uzatish
c. Backend’da POI ZIP arxivini ochadi va minglab XML fayllarini tahlil qiladi
d. O‘zgartirishdan so‘ng ma’lumotlarni qayta ZIP arxiviga siqish va mijozga qaytarish
-Muammolar: CPU yuklanishining ortishi, uzatish tarmoqli kengligining behuda sarflanishi va POI talqin qila olmaydigan ilg‘or CSS/mavzular/shartli formatlashning yo‘qolishi.
-
Zamonaviy arxitektura (SpreadJS + DsExcel):
-SpreadJS va DsExcel **bir xil ma’lumotlar sxemasi va JSON spetsifikatsiyasidan (SpreadJS JSON Format)** foydalanadi.
-Mijoz faqat grid’ning seriyalashtirilgan JSON satrini (spread.toJSON()) uzatadi.
-Backend (DsExcel) uni bitta qatorda o‘qiydi.
Workbook workbook = new Workbook();
workbook.fromJson(spreadJsonString);
-Serverda biznes mantiqi operatsiyalari, katta hajmdagi ma’lumotlarni birlashtirish va maskalashni bajargandan so‘ng, natijani workbook.toJson() yordamida qaytarishi yoki uni darhol yakuniy tarqatish uchun .xlsx yoki .pdf fayli sifatida ko‘rsatishi mumkin.
3.2 Uslublar, bir nechta birlashtirishlar va shartli formatlashni yo‘qotishsiz saqlash
SpreadJS’da foydalanuvchilar tomonidan sozlangan ko‘p darajali sarlavha qamrovlari (Span), shrift iyerarxiyalari, ma’lumotlar panellari (Data Bar), rang shkalalari va ochiluvchi ro‘yxatdagi ma’lumotlarni tekshirish qoidalari backend DsExcel’da 100% aniqlik bilan aks ettiriladi. POI’dan foydalanishda uchraydigan — CellStyle’ni alohida-alohida moslashtirish va indeksning to‘lib ketishidan xavotirlanish kabi — tuzilmaviy muammolar butunlay bartaraf etiladi.
4. Haqiqiy amaliy holat tahlili: korporativ sohaga oid murakkab muammolarni hal qilish
4.1 1-holat: ko‘p darajali sarlavhalarga (Multi-Header) ega iyerarxik veb-grid uchun Excel’ni yo‘qotishsiz import va eksport qilish
-
Muammoning ta’rifi:Ekrandagi web-grid uch yoki undan ortiq darajali guruhlangan sarlavha tuzilmasiga ega edi. Buni POI yordamida qayta ishlash uchun CellRangeAddress orqali gorizontal va vertikal birlashtirish koordinatalarini rekursiv tarzda hisoblashimizga to‘g‘ri keldi, ustunlar dinamik ravishda o‘zgarganda esa koordinatalar buzilib ketardi.
-
DsExcel + SpreadJS yechimi:SpreadJS ustun sarlavhasi tuzilmasini fromJson yordamida bevosita DsExcel’ga uzatish orqali ichki birlashtirish koordinatalari to‘liq saqlanadi. Bu server va front end’dagi sarlavha sxemalari o‘rtasidagi nomuvofiqliklarni bartaraf etadi.
4.2 2-holat: Daraxt tuzilmasidagi guruh maydonlari ma’lumotlarini import qilish shabloni
-
Muammo ta’rifi:Entity modelida asosiy kategoriyalar ostida quyi kategoriyalar mavjud bo‘lib, dinamik atribut maydonlari daraxt tuzilmasida ular ostida guruhlangan edi.
-
DsExcel shablon mexanizmidan foydalanish:Shablon XLSX faylida {{ds.groupName(M=T)}} kabi deklarativ markerlarni o‘rnatib, dataset’ni shunchaki uzatish orqali dinamik qatorlarni kengaytirish va kataklarni birlashtirish avtomatlashtirildi. Ko‘rsatkichlarni qo‘lda hisoblashga asoslangan mantiq bartaraf etilib, qo‘llab-quvvatlash qulayligi maksimal darajaga yetkazildi.
4.3 3-holat: Murakkab formulalarni (SUMPRODUCT, DSUM) qayta ishlash va server tomonida hisoblash
-
Muammo ta’rifi:Serverda yuklangan fayllardagi murakkab shartli vaznlash hisob-kitoblari natijalarini darhol tekshirishimiz kerak edi.
-
Yechim strategiyasi:DsExcel’ning workbook.calculate() funksiyasini chaqirish orqali Excel bilan mos ichki mexanizm barcha bog‘liq kataklarni aniqlaydi va aniq natijalarni hisoblab chiqaradi. Shu tariqa matematik mantiqni Java kodida qayta amalga oshirishga ketadigan ortiqcha mehnatning oldi olinadi.
4.4 4-holat: Biriktirmalar va ma’lumotlarni boshqarish uchun domen modeli arxitekturasi
-
Arxitektura dizayni:Katta hajmdagi ma’lumotlarni qayta ishlash vaqtida HTTP oqimlarining tugab qolishining oldini olish uchun asinxron navbat konveyerini (Spring Task / RabbitMQ) joriy etdik va DsExcel workbook resurslarini darhol bo‘shatish uchun try-with-resources’dan foydalandik. Natijada JVM xotirasidan barqaror foydalanish ta’minlandi.
5. Amaliy kod tahlili: POI va DsExcel
5.1 Apache POI’ni amalga oshirish misoli (koordinatalarni qo‘lda xaritalash)
Workbook poiWorkbook = new XSSFWorkbook();
Sheet sheet = poiWorkbook.createSheet("계층형데이터");
Row headerRow1 = sheet.createRow(0);
headerRow1.createCell(0).setCellValue("조직 인프라 정보");
sheet.addMergedRegion(new CellRangeAddress(0, 0, 0, 1));
int rowIndex = 2;
for (DepartmentDto dto : dataList) {
Row row = sheet.createRow(rowIndex++);
row.createCell(0).setCellValue(dto.getDivision());
// ... 인덱스 수동 관리 및 스타일 설정 생략
}
5.2 DsExcel + SpreadJS konveyerini amalga oshirish misoli
public byte[] generateExcelWithDsExcel(String spreadJsJson, List<DepartmentDto> dataList) {
try (Workbook workbook = new Workbook()) {
workbook.fromJson(spreadJsJson); // 프론트 디자인 로드
IWorksheet sheet = workbook.getActiveSheet();
sheet.addDataSource("dept", dataList); // 데이터 바인딩
workbook.calculate(); // 수식 재계산
ByteArrayOutputStream out = new ByteArrayOutputStream();
workbook.save(out, SaveFileFormat.Xlsx);
return out.toByteArray();
}
}
6. Xulosa va joriy etish bo‘yicha qaror qabul qilish qo‘llanmasi
6.1 POI’dan foydalanishni davom ettirish ma’qul bo‘lgan holatlar
-
Xom ma’lumotlarni oddiy bir o‘lchamli jadval formatida eksport qilish
-
Qat’iy formatdagi kichik Excel fayllarini yaratish (bir necha mingtagacha yozuv)
-
Qo‘shimcha litsenziya xarajatlariga mablag‘ ajrata olmaydigan ochiq manbali loyihalar
6.2 DsExcel’ga migratsiya qilish qat’iy tavsiya etiladigan holatlar
-
SpreadJSFoydalanish orqali mukammal WYSIWYG muhitini talab qiladigan loyihalar
-
Murakkab ko‘p darajali sarlavhalar, daraxt tuzilmasidagi ma’lumotlar va ko‘plab birlashtirilgan kataklarni o‘z ichiga olgan shablonlarni boshqarish
-
SUMPRODUCT va XLOOKUP kabi ilg‘or formulalarni server tomonida ishonchli baholash talab etilganda
-
Katta hajmdagi ma’lumotlarni qayta ishlash vaqtida POI OOM xatolari tufayli tizim barqarorligiga tahdid tug‘ilganda
Yakuniy mulohazalar
Zamonaviy korporativ arxitekturalarda Excel shunchaki fayl emas, balki asosiy biznes qoidalari to‘plamidir. DsExcel va SpreadJS kombinatsiyasiishlab chiquvchilarga koordinatalarni hisoblash bilan bog‘liq zerikarli ishlardan xalos bo‘lib, biznes mantiqiga e’tibor qaratish erkinligini beradi.
BigJumbo