[MiPlatform] 다중 그리드 하나의 엑셀 시트에 저장(CreateExportObject함수 사용기)
 
기존에 사용하던 함수 = SaveExcelEX()
- FileDialog 생성 후 사용(아래 참고)
function onClick_btnExcelDownload(obj)
{
	Create("FileDialog", "FileDialog");
	FileDialog.Type = "SAVE";
	FileDialog.FileName = substr(GetDate(),0,8) + "_test.xls";
	FileDialog.Filter = "Excel 97 - 2003 통합문서 (*.xls)|*.xls|Excel 통합문서 (*.xlsx)|*.xlsx|";
	if (!FileDialog.open()){
		Destroy(FileDialog);
		return;
	}
	strFileName = FileDialog.FilePath + "\\" + FileDialog.FileName;
	그리드명.SaveExcelEX(strFileName,"sheet1");
	
	Destroy(FileDialog);	
	if (gf_MsgBox("파일열기", "파일을 바로 열어보시겠습니까?", "C")) {
		ExecShell(strFileName); 
	}	
} 
 SaveExcelEX의 단점 : 
사용하기에 간단하지만 동일한 엑셀 시트에 그리드 하나만 저장할 수 있어 다중 그리드 저장시 적합하지 않음. 그래서 여러 그리드를 동일한 엑셀 시트에 저장할 방법을 모색하기 위해 [F1] 눌러 매뉴얼을 겁나게 뒤짐
 

후...... 마이플랫폼 ................ 열받......
 
- 마이플랫폼 이용 꿀팁 
- chatGPT는 물론이고 구글링으로도 정보를 절대로 찾을 수 없기 때문에  
- PID에서 키보드 F1 > 메뉴얼에서 색인 또는 검색으로 겁나게 서치한 다음 
- 아래의 페이지에서 컴포넌트/개발Tool 메뉴얼 등을 찾아 본다.
 

1. [ F1 ] 누르면 나오는 메뉴얼 
2. 투비소프트 페이지 메뉴얼 >> https://docs.tobesoft.com/TechnicalNote/1bb6a11c6bfc2c3d
 
 
그렇게 찾은... CreateExportObject 함수는 아래처럼 사용한다.
 
 
::: AddExportGrid
· Description
Export 할 Grid Object를 추가하는 Method 입니다.
 · Syntax
ExportObject.AddExportGrid(strRange, GridComp [, bExportHead [, bExportValue, strWordWrap]])
 · Parameters
ParametersTypeDescription
| bExportHead | Object | Export시 HeadColumn을 출력할지 여부를 지정합니다. 지정하지 않으면 true로 설정됩니다. | 
| bExportValue | Object | Export시 Value 만을 출력할지 여부를 지정합니다. False이면 Grid의 Style이 모두 출력됩니다. 지정하지 않으면 true로 설정됩니다. | 
| GridComp | Object | Export될 Grid Component Object입니다. | 
| strRange | Object | Export 될 Range를 지정합니다. "SheetName!A1" 이나 "A1"의 Excel Range형태로 지정합니다. | 
| strWordWrap | String | 워드랩 처리 방식을 지정합니다. "none": 워드랩 처리하지 않음, "excel": default - 엑셀에서 자동 줄바꿈 처리함 (기본동작과 동일) | 
function onClick_btnExcelDownload() {
	var ExpObj;
	Create("FileDialog", "FileDialog");
	FileDialog.Type = "SAVE";
	FileDialog.FileName = substr(GetDate(),0,8) + "_TEST 보고자료.xlsx";
	FileDialog.Filter = "Excel 97 - 2003 통합문서 (*.xls)|*.xls|Excel 통합문서 (*.xlsx)|*.xlsx|";
	
	if (!FileDialog.open()) {
		Destroy(FileDialog);
		return;
	}
	
	var strFileName = FileDialog.FilePath + "\\" + FileDialog.FileName;
	
	ExpObj = CreateExportObject(); 
	ExpObj.ExportType       = "Excel";
	ExpObj.ExportFileName   = strFileName;
	ExpObj.ActiveSheetName  = "sheet1";
	
	// 셀 칸 지정
	var cellCnt = 3; 
	ExpObj.AddExportGrid("sheet1!B" + cellCnt, grdTestList__1, true, false );
	cellCnt = cellCnt + toNumber(dsTest1.GetRowCount()) + 2;
	ExpObj.AddExportGrid("sheet1!B" + cellCnt, grdTestList__2, true, false);
	cellCnt = cellCnt + toNumber(dsTest2.GetRowCount()) + 2;
	ExpObj.AddExportGrid("sheet1!B" + cellCnt, grdTestList__3, true, false );
	ExpObj.AddExportGrid("sheet1!E" + cellCnt, grdTestList__4, true, false );
	
	
	ExpObj.Export(true, true);
	ExpObj.Save();  // Excel을 저장
	//ExpObj.CloseWorkbook();  
	//ExpObj.Close(); 
	ExpObj = null;
	Destroy(FileDialog);
}
 
파일 경로 설정까지는 똑같고 아래부턴 기존과 사용 방식이 다름 
ExpObj = CreateExportObject(); 			// Export 객체 생성
ExpObj.ExportType       = "Excel";		// 생성할 파일 지정
ExpObj.ExportFileName   = strFileName;		// 파일 경로
ExpObj.ActiveSheetName  = "sheet1";		// 저장될 시트 지정
::: AddExportGrid() 함수
	// 셀 칸 지정
	var cellCnt = 3; 
	ExpObj.AddExportGrid("sheet1!B" + cellCnt, grdTestList__1, true, false );
	cellCnt = cellCnt + toNumber(dsTest1.GetRowCount()) + 2;
	ExpObj.AddExportGrid("sheet1!B" + cellCnt, grdTestList__2, true, false);
	cellCnt = cellCnt + toNumber(dsTest2.GetRowCount()) + 2;
	ExpObj.AddExportGrid("sheet1!B" + cellCnt, grdTestList__3, true, false );
	ExpObj.AddExportGrid("sheet1!E" + cellCnt, grdTestList__4, true, false ); 
- cellCnt은 cell 순서(위치)를 카운팅 하는 변수
cellCnt은 cell 순서(위치)를 카운팅 하는 변수로 위치가 항상 고정적이라면 아래처럼 이용
 
ExpObj.AddExportGrid("sheet1!B3", grdTestList__1, true, false ); 
"sheet1!B3" 처럼 지정하면 되지만 이번에 제작한 페이지의 경우. 그리드는 항상 값이 달라지기 때문에 카운팅 하는 변수를 선언하고 시작한다. 
 
-- 아래와 같이 사용
// 해당 그리드에 바인딩 된 데이터셋 이름.GetRowCount() + 2 마지막 2는 GridHead와 한 칸 띄워주는 용도
cellCnt = cellCnt + toNumber(dsTest1.GetRowCount()) + 2; 
- 첫번째 파라미터 : "sheet1!B3"
- "sheet1" : 위에서 .ActiveSheetName로 지정한 시트명
- "!" : split('!') 라고 생각하면 댐. 나누는 용도
- "B3" : 엑셀의 cell 순서
 
- 두번쩨 파라미터 : 그리드 이름. id만 입력하는 건 아니고, Div 안에 있으면 Div1.id 이런식으로 입력해야 됨
- 세번째 파라미터 : head도 출력할건지 말건지. 지정 안 하면 true
- 네번째 : 데이터만 출력 또는 style까지 출력. 지정 안 하면 true 
 
 
아래부터는 저장시 설정할 옵션임
 
ExpObj.Export(true, true); 
- 첫번째 파라미터 : 진행 표시창 유무 
- 두번째 파라미터 : 저장 후 엑셀창을 띄울지 안 띄울지 
 
ExpObj.Save(); 
- 찐 저장
 
ExpObj.CloseWorkbook();  
ExpObj.Close(); 
- Export의 두번째 파라미터를 false로 한 뒤 해당 주석을 풀면 export된 엑셀창이 뜨지 않고 저장만 됨
 
 
 
아래는 가장 중요한 객체/리소스 해제
ExpObj = null;
Destroy(FileDialog); 
목적 :
- 리소스 충돌방지 (필요 없는 정보를 삭제해서 다음 저장시 데이터가 꼬여서 저장되는 것을 막음)
- 메모리 누수 방지
 
 
파일 생성 끝나고 나서도 그렇고 통신할 때도 해제가 가장 중요한데 매 번 까먹어서

 
"허 이거 왜이래?"
 
한참 헤매다가 어이 없게 찾게 됨
그러니 해제된 리소스도 다시 보자
 
 
이번 의뢰 소감 : 이번주 의뢰는 쿼리를 고심해서 짜야 하는 시간이 많아서 재미도 없었구.. 빨리 만들어야 돼서 불안해가지고 하... 못 하면... 배째라 걍...... 이런 마음이었는디 엑셀 저장 부분은 재미져서 글써봄. 역시 파일 다루는 게 제일 재밌다 ㅋㅋ
 
다 끝내고 나니까 기분 조아짐
 
ㅋㅋ 키키 이얏허~~~~!!

 
CreateExportObject 사용 메뉴얼 출처 : 
 
Technical Note
docs.tobesoft.com