본문 바로가기

개발일지/Miplatform

[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

bExportHeadObjectExport시 HeadColumn을 출력할지 여부를 지정합니다. 지정하지 않으면 true로 설정됩니다.
bExportValueObjectExport시 Value 만을 출력할지 여부를 지정합니다. False이면 Grid의 Style이 모두 출력됩니다. 지정하지 않으면 true로 설정됩니다.
GridCompObjectExport될 Grid Component Object입니다.
strRangeObjectExport 될 Range를 지정합니다. "SheetName!A1" 이나 "A1"의 Excel Range형태로 지정합니다.
strWordWrapString워드랩 처리 방식을 지정합니다. "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

 

'개발일지 > Miplatform' 카테고리의 다른 글

[마이플랫폼] 콤보 박스 두 개 사용 시 참고  (1) 2023.02.06