기존에 사용하던 함수 = 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
'개발일지 > Miplatform' 카테고리의 다른 글
[마이플랫폼] 콤보 박스 두 개 사용 시 참고 (1) | 2023.02.06 |
---|