블로그 이미지
fiadot_old

칼퇴근을 위한 게임 서버 개발 방법론에 대한 심도있는 고찰 및 성찰을 위한 블로그!

Rss feed Tistory
마이크로소프트웨어 2007. 10. 9. 11:13

OLEDB를 이용한 MICROSOFT OFFICE EXCEL2007 데이터 읽기

[마소플러스]  2007년 12월 기고
분류 Windows Technic – OLEDB

OLEDB를 이용한 Microsoft Office Excel2007 데이터 읽기

서론

Excel의 데이터를 사용해야 할 경우 다양한 방법이 있다. 예를 들어, 텍스트파일이나 CSV로 추출해서 파싱해서 사용하는 방법, 스키마 맵핑을 통해 XML로 추출하는 방법, 직접 접근하는 방법등을 들 수 있다.

OLEDB ATL을 이용하여 보다 빠르고 쉽게 자신의 프로그램에 Excel의 데이터를 사용하는 방법에 대해서 알아보자.

 

Excel 2007을 위한 Provider의 등장

과거 바이너리 파일 포맷이던 Microsoft Office Excel의 데이터 파일 포맷은 Microsoft Jet OLE DB Provider를 이용해서 접근이 가능했다. 하지만 Microsoft Office 2007이 출시되면서 Open Office XML(OOXML)이라는 XML기반 포맷으로 변경되었다. 이에 새로운 Provider를 제공하는데

Microsoft Office 12.0 Access Database Engine OLE DB Provider이다.

<.xls에 접근하는 Connection String>

Provider=Microsoft.Jet.OLEDB.4.0; Data Source=excelfilename.xls;

Mode=Read;Extended Properties=”Excel 8.0;HDR=YES”; Persist Security Info=False

 

<.xlsx에 접근하는 Connection String>

Provider=Microsoft.ACE.OLEDB.12.0; Data Source=excelfilename.xls;

Mode=Read;Extended Properties=”Excel 12.0;HDR=YES”; Persist Security Info=False

* HDR=YES 일때 첫번째 열이 컬럼 이름이 된다.

 

<샘플 엑셀 데이터>

 

 

샘플 프로젝트

Visual Studio 2005를 기준으로 설명하도록 한다.

1.     프로젝트를 생성한 뒤 클래스 추가-ATL-ATL OLEDB 소비자 를 선택한다

2.     데이터 소스를 선택하여 공급자 탭에서 Microsoft Office 12.0 Access Database Engine OLE DB Provider를 선택한다.

                     <그림 1>

3.     연결탭에서 데이터 원본에 xlsx파일 경로를 지정해준다.

4.     고급탭에서 엑세스권한을 ReadWrite를 체크한한다.

5.     모두탭에서 Extended Properties의 속성 값을 Excel 12.0;HDR=YES 를 입력한다

6.     연결탭으로 돌아와 연결 테스트를 해본다. “연결 테스트를 성공했습니다.” 가 나오면 정상적으로 접근이 가능한 상태이다. (에러가 발생한다면 엑세스권한과 파일경로를 확인해보면 된다.)

7.     확인을 누르면 테이블에 Work Sheet가 쭉 나열되는데 샘플로 제작했던 NameCard$를 선택한 후 확인을 누른다.

          <그림 2>

Wizard를 통해 생성된 NameCard WorkSheet에 해당하는 Accessor의 코드가 생성되어

NameCard.h 의 소스가 보일 것이다.

Connection String에 비밀번호가 있을 수도 있기 때문에 컴파일시에 확인하라는 의미로 #error가 되어있는데 이 부분을 주석 처리한다.

// #error Security Issue: The connection string may contain a password

 

그럼 Excel2007의 데이터를 읽어보도록 한다.

 

#include <iostream>

#include "NameCard.h"

using namespace std;

 

int _tmain(int argc, _TCHAR* argv[])

{

        setlocale(LC_ALL, ".949"); // 한글 코드페이지

        CoInitialize(NULL);    // OLE DB 를 위한 COM초기화

 

        CNameCard rs; 

        rs.OpenAll();

 

        HRESULT hr;

        while ( SUCCEEDED(hr = rs.MoveNext()) )

        {

               if ( DB_S_ENDOFROWSET == hr ) // 레코드셋 끝일 때

                       break;

 

               wprintf(L"Age=%f Name=%s \n",  rs.m_Age, rs.m_Name);

        }

        rs.CloseAll();

 

        CoUninitialize();

        return 0;

}

 

 

이제 자동 생성된 코드에서 중요한 부분은 ATL Consumer 코드부분을 살펴보도록 하겠다.

class CNameCard : public CCommand<CAccessor<CNameCardAccessor> >

여기서  CAccessor는 데이터 베이스의 구조를 알고 있는 경우 결과 데이터셋에 대한 바인딩 방식을 지정하는 방법중의 하나이다. 동적여부와 매개변수등에 대한 정보에 따라서 사용해야 할 Accessor의 종류가 다르다.

우리는 age name이라는 2개의 필드 구조라는 것을 알고 있으므로 CAccessor를 사용한다.

그리고 CCommand부분은 명령(SQL)를 통해서 rowset에 접근할 수 있음을 의미하는데,

자동 생성된 코드에서 이 부분이 기본 명령에 해당한다.

DEFINE_COMMAND_EX(CNameCardAccessor, L" \

        SELECT \

               Age, \

               Name \

               FROM `NameCard$`")

 

 

결론

OLEDB Consumer Wizard를 통해 Excel데이터에 맞게 Accessor Command의 코드를 생성해줌으로 개발자의 편의를 도모할수 있다. 또한 그림2의 지원부분 변경,삽입,삭제에 체크를 하고, 쿼리를 수정하면, 단순히 데이터를 읽어오는 것 뿐만 아니라 Insert, Update, Delete등의 모든 기능을 사용할수 있다.

 

참고자료

OLE DB Connection Manager

http://technet.microsoft.com/en-us/library/ms141013.aspx

 

How to: Loop through Excel Files and Tables

http://technet.microsoft.com/en-us/library/ms345182.aspx [E]

http://technet.microsoft.com/ko-kr/library/ms189667.aspx [K]

 

데이터 연결 마법사를 사용하여 Office Publisher, Visio 또는 Word로 데이터 가져오기

http://office.microsoft.com/ko-kr/word/HA102090051042.aspx

 

데이터 액세스 기술

http://msdn.microsoft.com/library/kor/default.asp?url=/library/KOR/vsent7/html/dvconChoosingRightDataAccessTechnology.asp

 

OLE DB 프로그래밍

http://msdn.microsoft.com/library/kor/default.asp?url=/library/KOR/vccore/html/vcconOLEDBProgramming.asp




 

Word File Download


,
TOTAL TODAY