|
| 1 | +const ExcelJS = require('exceljs'); |
| 2 | +const path = require('path'); |
| 3 | + |
| 4 | +// excel-style-helper 모듈 로드 |
| 5 | +const excelStyleHelper = require('../src/excel-style-helper'); |
| 6 | + |
| 7 | +(async () => { |
| 8 | + console.log('🔍 ToC 시트 쿼리문 표시 테스트'); |
| 9 | + console.log('====================================='); |
| 10 | + |
| 11 | + try { |
| 12 | + // 워크북 생성 |
| 13 | + const workbook = new ExcelJS.Workbook(); |
| 14 | + |
| 15 | + // 목차 시트 생성 |
| 16 | + const tocSheet = workbook.addWorksheet('목차'); |
| 17 | + |
| 18 | + // 테스트용 시트 정보 (쿼리문 포함) |
| 19 | + const sheetNames = [ |
| 20 | + { |
| 21 | + displayName: '고객_목록', |
| 22 | + originalName: '고객_목록', |
| 23 | + tabName: '고객_목록', |
| 24 | + recordCount: 150, |
| 25 | + aggregateColumn: '지역', |
| 26 | + aggregateData: [ |
| 27 | + { key: '서울', count: 45 }, |
| 28 | + { key: '부산', count: 32 }, |
| 29 | + { key: '대구', count: 28 }, |
| 30 | + { key: '인천', count: 25 } |
| 31 | + ], |
| 32 | + query: 'SELECT CustomerCode as 고객코드, CustomerName as 고객명, ContactName as 담당자명, City as 도시, Region as 지역, CustomerType as 고객유형, FORMAT(CreditLimit, \'N0\') as 신용한도 FROM SampleDB.dbo.Customers WHERE IsActive = 1 ORDER BY CreditLimit DESC' |
| 33 | + }, |
| 34 | + { |
| 35 | + displayName: '주문_목록', |
| 36 | + originalName: '주문_목록', |
| 37 | + tabName: '주문_목록', |
| 38 | + recordCount: 89, |
| 39 | + aggregateColumn: '결제방법', |
| 40 | + aggregateData: [ |
| 41 | + { key: '신용카드', count: 35 }, |
| 42 | + { key: '현금', count: 28 }, |
| 43 | + { key: '계좌이체', count: 26 } |
| 44 | + ], |
| 45 | + query: 'SELECT OrderNumber as 주문번호, FORMAT(OrderDate, \'yyyy-MM-dd\') as 주문일, OrderStatus as 주문상태, PaymentStatus as 결제상태, FORMAT(TotalAmount, \'N0\') as 총금액, PaymentMethod as 결제방법 FROM SampleDB.dbo.Orders WHERE OrderDate >= \'2024-01-01\' AND OrderDate <= \'2024-12-31\' ORDER BY OrderDate DESC' |
| 46 | + }, |
| 47 | + { |
| 48 | + displayName: '복잡한_쿼리_테스트', |
| 49 | + originalName: '복잡한_쿼리_테스트', |
| 50 | + tabName: '복잡한_쿼리_테스트', |
| 51 | + recordCount: 67, |
| 52 | + aggregateColumn: '카테고리', |
| 53 | + aggregateData: [ |
| 54 | + { key: '전자제품', count: 25 }, |
| 55 | + { key: '의류', count: 22 }, |
| 56 | + { key: '식품', count: 20 } |
| 57 | + ], |
| 58 | + query: 'SELECT p.ProductID as 상품ID, p.ProductName as 상품명, c.CategoryName as 카테고리, FORMAT(p.UnitPrice, \'N0\') as 단가, p.UnitsInStock as 재고수량, p.Discontinued as 단종여부, CASE WHEN p.UnitsInStock > 100 THEN \'충분\' WHEN p.UnitsInStock > 50 THEN \'보통\' ELSE \'부족\' END as 재고상태 FROM SampleDB.dbo.Products p INNER JOIN SampleDB.dbo.Categories c ON p.CategoryID = c.CategoryID WHERE p.Discontinued = 0 ORDER BY c.CategoryName, p.ProductName' |
| 59 | + } |
| 60 | + ]; |
| 61 | + |
| 62 | + console.log('📋 ToC 시트에 쿼리문 정보 추가 중...'); |
| 63 | + |
| 64 | + // ToC 시트에 내용 채우기 (쿼리문 포함) |
| 65 | + excelStyleHelper.populateTableOfContents(tocSheet, sheetNames); |
| 66 | + |
| 67 | + console.log('✅ ToC 시트 생성 완료'); |
| 68 | + console.log(` - 총 ${sheetNames.length}개 시트 정보`); |
| 69 | + console.log(' - 쿼리문 컬럼 포함'); |
| 70 | + console.log(' - 집계 정보 포함'); |
| 71 | + |
| 72 | + // 파일 저장 |
| 73 | + const fileName = 'test-toc-with-query.xlsx'; |
| 74 | + await workbook.xlsx.writeFile(fileName); |
| 75 | + console.log(`\n🎉 테스트 완료! 결과 파일: ${fileName}`); |
| 76 | + console.log('\n📋 ToC 시트 구성:'); |
| 77 | + console.log('- No: 시트 번호'); |
| 78 | + console.log('- Sheet Name: 시트명 (하이퍼링크)'); |
| 79 | + console.log('- Records: 데이터 건수 (하이퍼링크)'); |
| 80 | + console.log('- Aggregate Info: 집계 정보 (하이퍼링크)'); |
| 81 | + console.log('- Query: 사용된 쿼리문 (최대 100자)'); |
| 82 | + console.log('- Note: 비고사항'); |
| 83 | + |
| 84 | + } catch (error) { |
| 85 | + console.error('❌ 테스트 중 오류 발생:', error); |
| 86 | + process.exit(1); |
| 87 | + } |
| 88 | +})(); |
0 commit comments