MFC

[MFC] MFC에서 Excel 사용(Automation Class 와 ExcelFormat Library )

성엽이 2014. 2. 26. 20:23

Automation Class 활용      


두 클래스를 이용

Excel Automation class - CXLAutomation 

Wrpper class               - CXLEzAutomation 

 

필요한 파일

    XLEzAutomation.h
    XLEzAutomation.cpp
    XLAutomation.h
    XLAutomation.cpp

 

 함수를 구현할 파일에 추가

   #include "XLEzAutomation.h"


wchar_t chThisPath[_MAX_PATH];
GetCurrentDirectory( _MAX_PATH, chThisPath);

 

UpdateData(TRUE);

 

// 엑셀파일이 있는 경로 지정

CString strThisPath ;

strThisPath.Format(_T("%s\\%s.xlsx")

                          ,_T("C:\\Work\\Basketball\\Season 1"),m_city);

 

GetModuleFileName( NULL, chThisPath, _MAX_PATH);

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

 

XL.OpenExcelFile(strThisPath);             // 엑셀 파일 열기

 

XL.SetCellValue(1, 1, "안녕");                // WorkSheet의 (1,1)에 값을 저장

XL.SaveFileAs(strThisPath);                  //  엑셀 파일 저장 

 

XL.ReleaseExcel();                             // 엑셀 파일 해제




엑셀 파일 읽기

wchar_t chThisPath[_MAX_PATH];
GetCurrentDirectory( _MAX_PATH, chThisPath);

UpdateData(TRUE);

// 엑셀파일이 있는 경로 지정

CString strThisPath ;

strThisPath.Format(_T("%s\\%s.xlsx")

,_T("C:\\Work\\Basketball\\Season 1"), m_city);

GetModuleFileName( NULL, chThisPath, _MAX_PATH);

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

XL.OpenExcelFile(strThisPath); // 액셀 파일 열기

int temp = _ttoi(XL.GetCellValue(1, 1)); // WorkSheet의 (1, 1)의 값을 얻음

XL.ReleaseExcel(); // 엑셀 파일 해제




CXL Connection methods

 Method

 Group

 Function

Class constructor

 Open/Exit app

 엑셀 시작, 워크시트생성

ReleaseExcel()

 Open/Exit app

 엑셀 닫기

SetCellValue(..)

 Data exchange

 cell 값 설정

GetCellValue(..)

 Data exchange

 cell 값 얻음

ExportCString(..)

 Data exchange

 클립보드 사용

CreateXYChart(..)

 Chart methods

 XY 차트 생성

UpdateXYChart(..)

 Chart methods

 XY 차트 업데이트

InsertPictureFromClipboard(..)

 Picture methods

 DIB 그림 삽입

InsertPictureFromFile(..)

 Picture methods

 그림 파일 삽입

SaveFileAs(..)

 File access

 엑셀 파일 저장

OpenExcelFile(..)

 File access

 읽기를 위한 엑셀파일 열기

DeleteRow(..)

 Worksheet housekeeping

 현재 워그시트의 열 삭제



Automation Class

.cpp / .h


XLAutomation.cpp


XLAutomation.h


XLEzAutomation.cpp


XLEzAutomation.h


////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////



예전 진행했던 프로젝트에서 엑셀 파일 연 후  자동으로 검색하여 수정해야 할 필요가 있었습니다. 본 클래스는 그때 만들었던 라이브러리 입니다. 복잡한 COM 기술을 몰라도, 클래스에서 제공하는 인터페이스를 사용하는 것 만으로 엑셀을 외부에서 제어할 수 있습니다.



다음과 같은 인터페이스를 제공합니다. 인터페이스는 각각 주석이 달려있는 대로 사용하면 됩니다. 인자중 X, Y는 엑셀 파일을 열었을 때 가장 상단이 왼쪽 첫번째 칼럼이 0, 0을 의미하고 그 오른쪽으로는 1,0 2,0 3,0 과 같은 방식으로 늘어납니다. 그 아래로는 1,1 1,2 1,3 과 같이 Y 영역이 늘어나게 됩니다.

    // 인스턴스 초기화
    BOOL    InitExcelLib(void);
    // 인스턴스를 초기화하고 엑셀 객체를 생성한다.
    BOOL    CreateExcel(void);
    // 인스턴스를 초기화하고 파일을 오픈한다.
    BOOL    OpenExcelFile(TCHAR *wsFileName);
    // 파일을 닫고 인스턴스를 종료한다.
    BOOL    CloseExcelFile(void);
    // 파일을 저장한다.
    BOOL    SaveExcelFile(void);
    BOOL    SaveAs(TCHAR *pwsFileName);

    // Excel 창을 띄운다.
    BOOL    SetVisible(BOOL fOn=TRUE);

    // Sheet 이름을 구한다.
    BOOL    GetSheetName(DWORD dwSheetNumber, TCHAR *pwsSheetName);
    // Sheet 이름을 변경한다.
    BOOL    ChangeSheetName(DWORD dwSheetNumber, TCHAR *pwsSheetName);
    // Sheet 갯수를 구한다.
    DWORD    GetSheetCount(void);
    // Sheet를 추가한다.
    BOOL    AddSheet(TCHAR *pwsSheetName);
    // Sheet을 선택한다.
    BOOL    SetActiveSheet(INT nSheetNum);

    // Data를 읽어온다.
    BOOL    GetData(DWORD dwX, DWORD dwY, TCHAR *pwsOut, DWORD dwBufferLen);
    BOOL    GetData(INT nSheetNum, DWORD dwX, DWORD dwY, TCHAR *pwsOut, DWORD dwBufferLen);
    // 다음칸의 데이터를 읽는다. 데이터가 비어있다면 FALSE 리턴
    // fDirection: UPPER, BOTTOM, LEFT, RIGHT 
    BOOL    GetNextData(INT fDirection, TCHAR *pwsOut, DWORD dwBufferSize);

    // Data를 쓴다.
    BOOL    SetData(DWORD dwX, DWORD dwY, TCHAR *pwsInput);
    BOOL    SetData(INT nSheetNum, DWORD dwX, DWORD dwY, TCHAR *pwsOut);
    // 다음칸에 데이터를 쓴다.
    // fDirection: UPPER, BOTTOM, LEFT, RIGHT
    BOOL    SetNextData(INT fDirection, TCHAR *pwsInput);

    // 검색    
    // pwsSeed        : 검색할 단어
    // pwsResult    : 검색된 문장
    // pdwX, pdwY    : 검색된 위치

    // Active page 전체를 검색
    BOOL    SearchAll(TCHAR *pwsSeed, TCHAR *pwsResult, DWORD &pdwX, DWORD &pdwY);
    // 지정된 dwX나 dwY 좌표를 검색
    BOOL    SearchX(DWORD dwX, TCHAR *pwsSeed, TCHAR *pwsResult, DWORD &pdwX, DWORD &pdwY);
    BOOL    SearchY(DWORD dwY, TCHAR *pwsSeed, TCHAR *pwsResult, DWORD &pdwX, DWORD &pdwY);
    // 다음 찾기
    BOOL    SearchNext(TCHAR *pwsResult, DWORD &pdwX, DWORD &pdwY);
    // Active range 구하기 
    BOOL    GetActiveRange(DWORD &pdwBX, DWORD &pdwBY, DWORD &pdwLX, DWORD &pdwLY);


다음은 본 라이브러리를 이용한 사용 예제 입니다. CExcelLib의 인스턴스를 생성한 후, 제공하는 인터페이스를 이용하기만 하면 됩니다. 다음 예제는 text.xls라는 엑셀 파일을 연 후, bcd라는 문자열이 있는 칼럼을 찾는 예제입니다.

CExcelLib clsExcel; 
WCHAR wsResult[MAX_STRING_BUFFER_SIZE]; 
DWORD dwBX, dwBY, dwLX, dwLY; 
BOOL bResult; 

// text.xls 파일을 오픈한다.
clsExcel.OpenExcelFile(L"c:\\test.xls", OPEN_EXCEL_FILE); 

// 첫번째 Sheet를 선택한다.
clsExcel.SetActiveSheet(1); 

// Active Range, 즉 현재 활성화 되어 있는 범위를 얻어온다.
clsExcel.GetActiveRange(dwBX, dwBY, dwLX, dwLY); 

// 활성화 영역 전체에서 bcd 문자열을 찾는다. 결과 위치는 dwBX, dwBY로 리턴된다.
clsExcel.SearchAll(L"bcd", wsResult, dwBX, dwBY); 
while(TRUE) 

     // 다음 아이템을 찾는다. 더이상 찾을 수 없다면 FALSE가 리턴된다.
     bResult = clsExcel.SearchNext(wsResult, dwBX, dwBY); 
     if(bResult == FALSE) 
     { 
          break; 
      } 


// 2번째 칸에서  bcd를 찾는다.
clsExcel.SearchX(2, L"bcd", wsResult, dwBX, dwBY); 

while(TRUE) 

bResult = clsExcel.SearchNext(wsResult, dwBX, dwBY); 
            if(bResult == FALSE) 

break; 



// 9번째 줄에서 bcd를 찾는다.
clsExcel.SearchY(9, L"bcd", wsResult, dwBX, dwBY); 

while(TRUE) 

bResult = clsExcel.SearchNext(wsResult, dwBX, dwBY); 
if(bResult == FALSE) 

break; 



// 엑셀 파일을 닫는다.
clsExcel.CloseExcelFile();


본 라이브러리에 라이센스는 특별히 없습니다만, 혹시 이 라이브러리를 업그레이드하거나, 잘못된점을 수정하신다면 그것을 이 블로그를 통해 다시 공유해주시기 바랍니다. 그것을 통해 더 많은 사람들이 편하게 프로그래밍 할 수 있게 될것입니다.



펌 : http://getroot.tistory.com/2


감사합니다 정말 ㅠㅠ


////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////


ExcelFormat Library 활용          

참고사이트 : http://myblue0324.tistory.com/6


라이브러리


ExcelFormat_bin.zip


ExcelFormat_src.zip