1 분 소요

2018년 11월 30일 추가.

아래의 내용보다 더 좋은 엑셀파일 처리 라이브러리를 찾았다.

https://dongbumkim.com/2018/11/30/handling-excel-in-cplusplus


MFC에서 자료를 엑셀파일로 저장하는 방법을 찾아보았다.

여러가지 방법들이 많이 있었는데 그중에 가장 괜찮은 방법이어서 나중에 잊어버리지 않도록 여기에 써둔다.

아래 내용을 이용하기 위한 파일은 XLAutomation 이다.

혹시나 이 글을 볼 사람들이 있을까봐 아래의 코드는 짬식(wingyui)님 블로그의 내용이며 이 코드 및 내용에 대한 모든 권리는 짬식(wingyui)님에게 있다는 것을 밝혀둔다.

int i=1,j=1,k=1;
 int columnNum=0;
 char temp[10];
 CString m_strFileName;

 CXLEzAutomation XL(FALSE); // FALSE: 처리 과정을 화면에 보이지 않는다

 m_strFileName = "Student Quiz Results";   // 저장할 파일 Name

 // column 데이터
 XL.SetCellValue(++columnNum, 1, "Login ID");
 XL.SetCellValue(++columnNum, 1, "Student ID");
 XL.SetCellValue(++columnNum, 1, "Name");

 //column 에 Quiz 번호 만큼 추가
 for(i=1;i<=m_iQuizNum;i++){
  _snprintf(temp, 10, "Quiz %d", i);
  XL.SetCellValue(++columnNum, 1 ,temp);
 }

 //학생수와 Quiz 수만큼 리스트 컨트롤에서 엑셀로 가져옴.
 for(k=1; k<=m_iStudentNum; k++)
  for(j=1; j<=columnNum; j++)
   XL.SetCellValue(j, k+1, m_ctrlScroeList.GetItemText(k-1, j));

 CFileDialog cFDlg(false,"xlsx",m_strFileName+".xlsx", OFN_HIDEREADONLY |
  OFN_OVERWRITEPROMPT | OFN_NOCHANGEDIR, "xlsx 파일 (*.xlsx)|*.xlsx|", NULL );

 if(cFDlg.DoModal() == IDOK)
  XL.SaveFileAs(cFDlg.GetPathName());

 XL.ReleaseExcel();

코드는 그다지 어렵지 않다. 하나 중요한 점은 Column과 Row 번호를 지정할 때는 0부터 시작하는 것이 아니라 1부터 시작한다는 것. 프로그래밍 할때 모든 루프는 다 0부터 시작하다보니 어색하게 느껴진다. 반드시 1부터 넣을 것.

또 하나 중요한 점은 파일을 저장할 때 확장명을 xlsx로 해야 잘 열린다. xls로 해도 저장이 되긴 하는데 MS Excel 2010으로 열려고 하니 형식이 이상하다는 경고가 한번씩 떴다. xlsx로 저장하니 오류 없이 잘 열린다.

댓글남기기