Install with Codex or Claude Copy this prompt, paste it into Codex, Claude, or another assistant, and let it review the skill page and install it for you.
A direct command skips the review prompt. Inspect the source before running it.
서버 스크립트(WorkBook API), 클라이언트 스크립트(iGrid API), SQL, .ds 수정
.json2 부분 수정(셀 값, 스타일, 조건부서식)
AI가 할 수 없는 작업:
.json2 전체 신규 생성, .xlsx 파일 생성/편집
2. 서버 스크립트 API — WorkBook
서버 스크립트에서 MX-GRID를 조작하는 핵심 API입니다.
2.1 WorkBook 획득 방법
// 방법 1: 현재 실행 중인 MX-GRID의 WorkBook (OnExecute 이벤트에서 사용)var wb = .();
wb = .(req.(), );
wb = .(req.(), , );
path = fso.([, req.(), ]) + ;
wb = .(path);
Matrix
getWorkBook
// 방법 2: 특정 MX-GRID 템플릿을 열기 (내보내기, 별도 처리용)
var
Matrix
OpenWorkBook
getReportCode
"MX_GRID_CODE"
// 방법 3: 수식 포함하여 열기
var
Matrix
OpenWorkBook
getReportCode
"MX_GRID_CODE"
true
// 방법 4: .json2 파일 경로로 직접 열기
var
PathCombine
"iGRID_DESIGN"
getReportCode
"MX_GRID_CODE"
".json2"
var
Matrix
CreateWorkBookByJson
2.2 ScriptWorkBook 주요 메서드
// 시트 접근var ws = wb.getWorkSheet("V1"); // 이름으로 시트 접근var ws = wb.getWorkSheet(0); // 인덱스로 시트 접근var activeSheet = wb.getActiveSheet(); // 활성 시트var count = wb.WorkSheetCount(); // 시트 수// 시트 생성/삭제var newSheet = wb.CreateWorkSheet("시트명");
wb.AddWorkSheet(ws, "시트명"); // 다른 워크북의 시트를 추가
wb.RemoveWorkSheet("시트명"); // 시트 삭제
wb.MergeSheets(); // 모든 시트를 첫 번째 시트에 통합// 데이터 실행 및 수식
wb.ExecuteDataSet(); // .ds에 정의된 데이터셋 실행
wb.ClearDataSet(); // 바인딩된 데이터 삭제
wb.Calculate(); // 수식 계산
wb.Calculate(true); // 수식 계산 후 수식 삭제 (값만 유지)
wb.Calculate(true, ["V1", "V2"]); // 특정 시트만 수식 계산
wb.DisableFormula(false); // 수식 활성화 (재계산 전 필요)
wb.UpdateFormulaReference(); // 수식 참조 관계 업데이트// 이름 정의 (Named Range)var names = wb.getNameList(); // 이름 정의 목록var name = wb.getName("_D_DATA"); // 이름 정의 객체var range = wb.getNameRange("V1!A1"); // 이름 또는 셀주소로 범위 반환var text = wb.getNameRangeText("V1!A1"); // 셀의 텍스트 반환var value = wb.getNameRangeValue("_D_DATA"); // 이름 정의 셀의 값
wb.setNameRangeValue("_D_DATA", "새값"); // 이름 정의 셀의 값 변경
wb.addName("이름", "시트명", "A1:B10"); // 이름 정의 추가
wb.removeName("이름"); // 이름 정의 삭제// 데이터 바인딩 정보var bindInfo = wb.getDataBindingRange("데이터셋명"); // 바인딩 영역 정보var ds = wb.getDataSet(); // 데이터셋 객체// 파일 저장
wb.Save("경로.xlsx"); // 엑셀 저장
wb.Save("경로.xlsx", "V1,V2"); // 특정 시트만 저장
wb.Save("경로.xlsx", ["V1", "V2"]); // 배열로도 가능
wb.SaveAsPDF("경로.pdf", "V1"); // PDF 저장
wb.SaveAsPDF("경로.pdf", ["V1", "V2"]); // 여러 시트 PDF
wb.SaveAsMSWord("경로.docx", "V1"); // MS Word 저장
wb.SaveAsHML("경로.hwpx", "V1"); // 한글(HWPX) 저장
wb.SaveRangeToCSV("경로.csv", "V1!B2"); // 특정 영역을 CSV로 저장
wb.WriteTemplate("경로.json2"); // MX-GRID 템플릿으로 저장// 스타일var style = wb.CreateCellStyle(
"font-family:Tahoma;font-size:10;font-weight:bold;font-color:#000000;", // 폰트"border-left:solid,#000000;border-top:solid,#000000;", // 테두리"#FFFFFF", // 배경색"#,##0.00", // 포맷
enHorizontal.Center, // 가로정렬
enVertical.Center// 세로정렬
);
// 데이터 Reader (대용량 읽기)var reader = wb.getWorkSheetDataReader("V1!B2");
var table = reader.ReadSchema();
while(reader.hasNext()){
var row = reader.next();
}
API 타입 정의: types/com/matrix/script/excel/ScriptWorkBook.ts
3. 서버 스크립트 API — WorkSheet
3.1 ScriptWorkSheet 주요 메서드
var ws = wb.getWorkSheet("V1");
// 셀 접근var cell = ws.getRange("B5"); // 셀 주소로 접근var cell = ws.getRange(5, 2); // 행/열 번호로 접근 (1부터 시작)var exists = ws.hasRange(5, 2); // 셀 존재 여부 확인var usedArea = ws.getUsedRange(); // 사용 중인 전체 영역// 셀 값 쓰기
ws.setCellText("B5", "텍스트"); // 텍스트 작성
ws.setCellText(5, 2, "텍스트"); // 행/열 번호로 작성
ws.setCellValue("B5", 12345); // 수치값 작성
ws.setCellValue(5, 2, 12345);
ws.setCellFormula("C5", "=B5*1.1"); // 수식 작성
ws.setCellFormula(5, 3, "=B5*1.1");
// 셀 스타일
ws.setCellStyle("B5", style); // 스타일 객체 적용
ws.setCellStyle(5, 2, style);
ws.setCellStyle(5, 2,
"font-family:Tahoma;font-size:10;", // 폰트"border-left:solid,#000000;", // 테두리"#FFFFFF", // 배경색"#,##0", // 포맷
enHorizontal.Center, // 가로정렬
enVertical.Center// 세로정렬
);
ws.setRangeStyle("B5:G10", style); // 범위에 스타일 적용// 행/열 크기 조절
ws.setRowHeight(5, 30); // 행 높이 (0 = 숨기기)
ws.setRowHeightByPixel(5, 40); // 행 높이 (pixel)
ws.setAutoRowHeight(5); // 행 높이 자동 맞춤
ws.setColumnWidth(2, 100); // 열 너비 (0 = 숨기기)
ws.setColumnWidthByPixel(2, 120); // 열 너비 (pixel)
ws.setColumnWidthUnit(2, "%"); // 열 너비 단위 (% 또는 빈값)// 행/열 삽입/삭제
ws.InsertRows(5, 3); // 5번 위치에 3행 삽입
ws.InsertColumns(2, 2); // 2번 위치에 2열 삽입
ws.DeleteRow(5); // 5번 행 삭제
ws.DeleteRows(5, 10); // 5~10번 행 삭제
ws.DeleteColumn(2); // 2번 열 삭제
ws.DeleteColumns(2, 5); // 2~5번 열 삭제
ws.DeleteHiddenRows(); // 숨겨진 행 삭제
ws.DeleteHiddenColumns(); // 숨겨진 열 삭제// 셀 병합
ws.MergeCell(5, 2, 7, 4); // 행/열 번호로 병합
ws.MergeCell("B5", "D7"); // 주소로 병합
ws.MergeCell("B5:D7"); // 범위로 병합// 영역 복사/붙이기var copied = ws.Copy("B5", "G10"); // 영역 복사var copied = ws.Copy("B5:G10"); // 범위 복사var copied = ws.Copy(5, 2, 10, 7); // 행/열 번호로 복사
copied.Paste(ws, 15, 2); // 대상 시트의 위치에 붙이기// DataTable → 시트에 삽입var area = ws.CopyFromDataTable(table, "B5", true); // 헤더 포함var area = ws.CopyFromDataTable(table, "B5", true, "COL1,COL2,COL3"); // 특정 컬럼만
ws.CopyFromJsonTable(jsonText, "B5"); // JSON 데이터 삽입// 데이터 바인딩 (템플릿 기반)var binder = ws.getDataTableBinder("B10", false, -1);
// 인자: 시작셀, 헤더표시여부, 스타일복사대상Row(-1이면 미사용)// 차트/이미지 생성var chart = ws.CreateChart(enChartType.Column, "B15", "G25");
var chart = ws.CreateChartByJson(jsonText, "B15", "G25");
var img = ws.CreateImage("이미지경로", "B15", "G25");
var img = ws.CreateImageByBase64(base64, "B15", "G25");
// 시트 설정
ws.setName("새시트명"); // 시트명 변경
ws.IsActive(true); // 시트 활성화
ws.IsVisible(false); // 시트 숨기기
ws.setFreezePanes(3, 2); // 틀 고정
ws.setDisplayGridlines(false); // 눈금선 숨기기
ws.setDefaultRowHeight(20); // 기본 행 높이
ws.DisableFormula(true); // 수식 비활성화
ws.setColumnHeaderRange("A1:G1"); // 헤더 영역 설정
ws.UpdateProtection(true, true); // 보호 옵션var viewRange = ws.getViewRange(); // MX-GRID 표시 영역
API 타입 정의: types/com/matrix/script/excel/ScriptWorkSheet.ts
4. 서버 스크립트 예제
4.1 데이터 바인딩 (템플릿 시트 활용)
import { Matrix } from"@AUD_SERVER/matrix/script/Matrix";
letMatrix: Matrix;
var req = Matrix.getRequest();
var res = Matrix.getResponse();
try {
var wb = Matrix.getWorkBook();
var v1 = wb.getWorkSheet("V1"); // 뷰 시트var t1 = wb.getWorkSheet("T1"); // 템플릿 시트// 템플릿 영역 복사var dataTemplate = t1.Copy("B12", "I13"); // 데이터 필드 정의var styleTemplate = t1.Copy("B4", "I5"); // 스타일 템플릿var altStyleTemplate = t1.Copy("B8", "I9"); // 반복행 스타일var firstRowTemplate = t1.Copy("B16", "I17"); // 첫 행 스타일// 데이터 바인더 생성var binder = v1.getDataTableBinder("B10", false, -1);
binder.setDataBindingTemplate(dataTemplate);
binder.setFirstRowStyleTemplate(firstRowTemplate);
binder.setStyleTemplate(styleTemplate);
binder.setAlternateStyleTemplate(altStyleTemplate);
// 데이터소스 실행 (바인더에 자동 바인딩)
req.ExecuteReportDataSource("데이터", binder);
// 합계행 복사하여 데이터 아래에 붙이기var total = t1.Copy("B21:I22");
total.Paste(v1, binder.getBindedArea().getBottom() + 1,
binder.getBindedArea().getLeft());
} catch(e) {
Matrix.ThrowException("Error: " + e.message);
}
4.2 셀 값에 따른 행/열 숨기기
import { Matrix } from"@AUD_SERVER/matrix/script/Matrix";
letMatrix: Matrix;
try {
var wb = Matrix.getWorkBook();
var ws = wb.getWorkSheet("V1");
wb.Calculate(); // 수식 계산 먼저 수행// 열 숨기기: 첫 행의 값이 "HIDDEN"인 열var idx = 1;
while (true) {
var rng = ws.getRange(1, idx);
if (rng == null || rng.getText() == "") break;
if (rng.getText() == "HIDDEN") {
ws.setColumnWidth(idx, 0);
}
idx++;
}
// 행 숨기기: 첫 열의 값이 "HIDDEN"인 행
idx = 1;
while (true) {
var rng = ws.getRange(idx, 1);
if (rng == null || rng.getText() == "") break;
if (rng.getText() == "HIDDEN") {
ws.setRowHeight(idx, 0);
}
idx++;
}
// 필요 시 숨겨진 행/열을 완전히 삭제// ws.DeleteHiddenRows();// ws.DeleteHiddenColumns();
} catch(e) {
Matrix.ThrowException("Error: " + e.message);
}
4.3 PDF 내보내기 (파라미터별 반복 생성 + 병합)
import { Matrix } from"@AUD_SERVER/matrix/script/Matrix";
letMatrix: Matrix;
var req = Matrix.getRequest();
var res = Matrix.getResponse();
var util = Matrix.getUtility();
var fso = Matrix.getFileSystemObject();
try {
var params = req.getParam("VS_CODE").split(",");
var wb = Matrix.OpenWorkBook(req.getReportCode(), "MX_GRID_CODE");
varPDF_FILES: string[] = [];
for (var i = 0; i < params.length; i++) {
req.setParam("VS_CODE", params[i]); // 조회 조건 변경
wb.ClearDataSet(); // 이전 데이터 삭제
wb.ExecuteDataSet(); // 데이터 재실행
wb.DisableFormula(false); // 수식 활성화
wb.Calculate(); // 수식 계산var pdfPath = fso.getTemplatePath(util.getUniqueKey("PDF") + ".pdf");
wb.SaveAsPDF(pdfPath, "V1");
PDF_FILES.push(pdfPath);
}
// PDF 병합var mergedPath = util.getUniqueKey("PDF") + ".pdf";
varPDFDocument = util.CreatePDFDocument();
PDFDocument.MergeFiles(PDF_FILES, fso.getTemplatePath(mergedPath));
res.WriteResponseText(JSON.stringify({ "FILE_NAME": mergedPath }));
} catch(e) {
Matrix.ThrowException("Error: " + e.message);
}
4.4 여러 조건의 엑셀을 하나의 파일에 합치기
import { Matrix } from"@AUD_SERVER/matrix/script/Matrix";
letMatrix: Matrix;
var req = Matrix.getRequest();
var res = Matrix.getResponse();
var util = Matrix.getUtility();
var fso = Matrix.getFileSystemObject();
try {
varFILE_PATH = util.getUniqueKey("XLS") + ".xlsx";
// 기본 워크북 열기 (빈 껍데기용)var wb = Matrix.OpenWorkBook(req.getReportCode(), "EXPORT");
wb.RemoveWorkSheet("V1"); // 불필요 시트 제거
wb.RemoveWorkSheet("P1");
// 데이터소스에서 조건 목록 조회var table = req.ExecuteReportDataSource("Data1");
for (var r = 0; r < table.getRowCount(); r++) {
var product = table.getRow(r).getString("D1");
req.setParam("VS_PRODUCT", product);
// 조건별로 워크북 생성 후 시트를 합치기var wb2 = Matrix.OpenWorkBook(req.getReportCode(), "EXPORT");
wb.AddWorkSheet(wb2.getWorkSheet("V1"), product);
}
wb.Save(fso.PathCombine("_TEMP_", FILE_PATH), null);
var json = res.getJsonResponseWriter();
json.beginObject()
.addProperty("FILE_NAME", FILE_PATH)
.endObject();
} catch(e) {
Matrix.ThrowException("Error: " + e.message);
}
5. 클라이언트 스크립트 API — iGrid
5.1 iGrid 컨트롤 접근
// iGrid 컨트롤 획득letMXGrid = Matrix.getObject("MXGrid컨트롤명") as iGrid;
5.2 주요 속성
속성
타입
설명
ActiveSheet
string
활성화된 시트 이름
WorkBook
IWorkBook
클라이언트 WorkBook 모델
TemplateCode
string
원본 엑셀 템플릿 코드
UseMultiSheet
boolean
다중 시트 사용 여부
EnableZoom
boolean
확대/축소 기능
EnableSheetProtection
boolean
시트 보호 적용 여부
IgnoreExportHiddenCells
boolean
내보내기 시 숨김셀 제거
ScrollLeft / ScrollTop
number
스크롤 위치
BeforeScript
string
서버 쿼리 실행 전 스크립트
AfterScript
string
서버 쿼리 실행 후 스크립트
MenuOption
MenuOption
메뉴 옵션
5.3 주요 메서드
// 데이터 조작MXGrid.Refresh(); // 데이터 새로고침 (서버 요청)MXGrid.Calculate(); // 수식 재계산MXGrid.Calculate(true); // 서버에 계산 요청// 시트 조작MXGrid.ChangeSheet("V2"); // 시트 전환var sheets = MXGrid.getWorkSheetNames(); // 전체 시트 목록// 셀 접근var cell = MXGrid.getCell(5, 2); // 행/열 번호로 셀 접근var cell = MXGrid.getRange("B5"); // 주소로 셀 접근// 행/열 표시MXGrid.ShowHideRows([3, 4, 5], false); // 행 숨기기MXGrid.ShowHideColumns([1, 2], true); // 열 표시// 확장/축소 (AUD_EXPAND_ROW/COLUMN 사용 시)MXGrid.ExpandAll(); // 모두 펼치기MXGrid.CollapsedAll(); // 모두 접기// 내보내기MXGrid.ExportServiceCall("Excel", function(p) {
// p.FolderName, p.FileNameMatrix.DownloadFile(p.FolderName, p.FileName, p.FileName, true);
});
// 편집 모드MXGrid.setEditable(true); // 편집 활성화MXGrid.IsModified(); // 수정 여부 확인MXGrid.Validate(); // 유효성 검사// DataTable 접근 (_D_ 이름 정의 영역)var dt = MXGrid.getDataTable("DATA"); // _D_DATA 이름 정의의 DataTable// 스크롤MXGrid.ScrollTo(10, 5); // 특정 셀로 스크롤MXGrid.ScrollMove(0, 100, 300); // 특정 위치로 스크롤// WorkBook/유틸리티var wb = MXGrid.getWorkBook(); // 클라이언트 WorkBook 모델var sel = MXGrid.getSelection(); // 선택기 객체var xlsUtil = MXGrid.getUtility(); // MX-Grid 유틸리티// 내보내기 방식MXGrid.setExcelExportType("AllSheets"); // Default, AllSheets, AllSheetsWithoutAUDFunction// 화면 갱신MXGrid.Update(); // 다시 그리기
5.4 이벤트
이벤트
설명
주요 인자
OnClick
컨트롤 클릭
Id
OnCellClick
셀 클릭
Cell, X, Y
OnCellDoubleClick
셀 더블클릭
Cell, X, Y
OnCellBeginEdit
편집 시작
Cell, Cancel, MergeColumn, LOVList
OnCellEndEdit
편집 완료
getCells(), Cancel
OnSelectionChange
셀 선택 변경
Cells
OnDataBindEnd
데이터 바인딩 완료
RecordCount
OnActivateSheetChanged
시트 변경
Sheet
OnSheetChanged
시트 전환 완료
SheetName
OnCalculateStart
CRUD 서버 요청 시작
Cancel
OnCalculateEnd
CRUD 서버 결과 처리 완료
Id
OnExecuteStart
서버 데이터 요청 전
Cancel
OnContextMenuOpening
컨텍스트 메뉴 열림
Cell, Menu, Cancel
OnCellValidatorMessage
유효성 메시지 표시
Cell, Validator, Title, Message, Cancel
OnScroll
스크롤 변경
ScrollLeft, ScrollTop
OnMessage
메시지 출력
Code, Message, Type, Handled
이벤트 사용 예시:
MXGrid.OnCellClick = function(sender, args) {
let cell = args.Cell;
Matrix.Alert("클릭한 셀: " + cell.getText());
};
MXGrid.OnCellBeginEdit = function(sender, args) {
// 특정 열만 편집 허용if (args.Cell.Column < 3) {
args.Cancel = true; // 편집 취소
}
// 콤보박스 목록 설정
args.LOVList = ["옵션1", "옵션2", "옵션3"];
};
MXGrid.OnCellEndEdit = function(sender, args) {
var cells = args.getCells();
// 수정된 셀 처리
args.Cancel = true; // 서버 계산 요청 취소
};
API 타입 정의: types/aud/control/iGrid.ts
6. 예약어 (이름 정의) 레퍼런스
엑셀의 이름 정의(Named Range) 에 특정 예약어를 설정하면 MX-GRID가 자동으로 인식합니다.
6.1 화면 표시 영역
예약어
설명
_VIEW_RANGE_xx
MX-GRID로 표시할 영역을 지정. xx는 순번. 예: _VIEW_RANGE_01 = A1:Z100
{"DataSources":{"Datas":[{"Id":"데이터소스코드","Name":"데이터소스명","OutputAddress":"'V1'!$C$9:$K$9","WriterColumnHeader":true,"ConnectionCode":"AUD_SAMPLE_DB","SQL":"select * from table","MetaLayout":"",}]}}
필드
설명
Id
데이터 소스의 고유 ID
Name
데이터소스 표시명
OutputAddress
데이터가 출력되어 있는 영역의 주소
WriterColumnHeader
컬럼 헤더 출력 여부
ConnectionCode
데이터베이스 연결코드
SQL
데이터베이스 연결코드
MetaLayout
i-META를 사용하는 경우 META 배치 정보
수정 시 주의사항:
MetaLayout의 값이 있는 경우 수정 하면 안된다.
9. .json2 부분 수정 가이드
.json2는 대용량 구조이므로 전체 생성은 불가하지만, 특정 부분은 수정 가능합니다.
수정 가능 영역:
영역
키
설명
셀 값
WorkSheets[].Ranges[].Value
특정 셀의 텍스트/수식 변경
스타일
WorkSheets[].Styles[]
색상, 폰트, 테두리 등 변경
행/열 크기
WorkSheets[].Rows[].Height, Columns[].Width
크기 변경
조건부서식
WorkSheets[].FormatConditions[]
조건부 서식 규칙
이름 정의
Names[]
예약어(이름 정의) 추가/수정
수정 방법:
.json2 파일을 읽고 특정 키를 검색
Ranges 배열에서 Row/Col 로 대상 셀을 찾음
Value 또는 Formula 필드를 수정
11. API 인터페이스 위치
상세 API 정의는 다음 파일을 참조하세요:
서버 WorkBook: types/com/matrix/script/excel/ScriptWorkBook.ts
서버 WorkSheet: types/com/matrix/script/excel/ScriptWorkSheet.ts
서버 CellRange: types/com/matrix/script/excel/ScriptCellRange.ts
서버 CellStyle: types/com/matrix/script/excel/ScriptCellStyle.ts
서버 TableBinder: types/com/matrix/script/data/ScriptWorkSheetTableBinder.ts
서버 Chart: types/com/matrix/script/excel/ScriptChart.ts
서버 Image: types/com/matrix/script/excel/ScriptImage.ts