C++Builder Programming Forum
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
C++빌더 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
컴포넌트/라이브러리
메신저 프로젝트
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
볼랜드포럼 광고 모집

C++빌더 Q&A
C++Builder Programming Q&A
[45012] Re:엑셀로 저장에 대한 질문입니다.(슬님 답변 좀 해주세요!)
슬  [mydog21] 2214 읽음    2006-05-24 13:14
백호 님이 쓰신 글 :
: 지난 번 슬님의 답변은 잘 보았습니다.
:
: 많은 도움이 되었지만 Excel Component에 대한 도움말이 없다보니
:
: 각 함수들의 사용법이나 파라미터들의 값을 알 수가 없어서
:
: 고생을 하고 있습니다.
:
: 혹시 관련된 메뉴얼이나 예제 아니면 함수들의 사용법과
:
: 역할에 대해서 아시는 것이 있다면 답변 좀 부탁드리겠습니다.
:
: 아무리 찾아봐도 관련자료가 너무 없어 이렇게 다시 글을 올립니다.
:
: 그럼 부탁드리겠습니다.

우선 하려고 하시는 작업이 무엇인지 순서대로 알려주시면

차근차근 일러드리겠습니다^^;

우선... 저도 Excel Component에 관련된 함수들에 대해 많이 알지 못합니다..

알수없는 파라미터값들이 워낙 많아서요^^;;;

어디까지 하셨는지 모르겠으나..

Excel Application ,
Excel Workbooks,
Excel Sheet

이 3가지를 적절히 활용하시면 엑셀에서 하는 모든 작업을 다루실수 있습니다.

순서대로 생각하시면 됩니다. 실제 엑셀 작업하시는것처럼요..

우리가 엑셀 작업할때에

가장 먼저 하는것은

엑셀을 실행시키는 것입니다.^^;; 너무 당연한가요?

그다음 새 파일을 만들어서 작업하거나,

기존의 작업된 파일을 열어서 작업을 하겠죠...

위의 두 과정은 다음과 같습니다.

ExcelWb->ConnectTo(ExcelApp->Workbooks->Add((TVariant) Excel_xp::xlWBATWorksheet , TDefLCID()));
// 새로운 파일을 추가 해서 ExcelApp를 실행한다음 Wb에서 해당 워크북에 연결합니다.

xlWBATWorksheet  새로운 워크시트의 템플릿을 지정해주시면 됩니다. 기본 템플릿입니다.

TDefLCID() 는 현재의 작업을 반환해주는 녀석정도로 생각하시면 될것 같습니다.

이제 새로운 파일을 열었군요..

자 그다음 엑셀에서 무엇을 하시나요?

Ws 워크시트를 선택합니다.

ExcelWs->ConnectTo(ExcelWb->Worksheets->get_Item((TVariant) SheetIndex));

다음과 같이 말이죠...

SheetIndex는 Ws 번호 입니다.

1번부터 시작해서 왼쪽부터 순서대로 입니다.

헌데 저는 워크시트의 "이름"으로 선택을 하고 싶네요...

이름으로 Ws 를 선택하는 방법 아직 모릅니다^^;;

그래서 약간 편법같은 방법을 사용하고 있습니다.

    int nCount=ExcelWb->Worksheets->get_Count();

    for( int i=1; i <= nCount; i++){
        ExcelWs->ConnectTo(ExcelWb->Worksheets->get_Item((TVariant) i));
        WideString SheetName=ExcelWs->get_Name();
    }

위의 결과는? 짐작 하시겠지만...
Sheet 들의 이름을(목록을) 모두 불러옵니다~
이걸가지고 map이나 dynamic array 같은곳 어디든지 저장하신다면
이름으로 가져올수도 있겠죠...



엑셀을 사용할때의 작업은 모두 "범위(Range)" 중심입니다.

하나의 셀을 선택하더라도

예를 들어 A1을 선택 하더라도 A1:A1과 같은 범위로 표현할수 있습니다.

이곳에 값을 넣을 수 도 있겠죠...

값을 넣을때에는 하나의 셀에 적용됩니다.

    ExcelWs->Cells->set_Item((TVariant) Y ,(TVariant) X ,Value);

위와 같죠...

set_item은 Y가 먼저입니다.

Value 는 (TVariant) 타입이구요...

Y는 정수형(1,2,3,4,,,,,)

X는 정수형 (1,2,3,4,,,,) 또는 알파벳(A,B,C,D,,,,,) 을 사용하실수 있습니다.



set_item 을 제외한 거의 모든 작업에 적용되는 함수들은
get_Range((TVariant)"A1",(TVariant)"C3") 같이 쓰입니다.

get_Range는 ExcelRange* 형을 리턴합니다.

예를 들어
get_Range((TVariant)"A1",(TVariant)"A2")->Borders->set_LineStyle((TVariant)xlLineDouble);
처럼 범위에 해당하는 셀에 Border 을 줄수 있습니다.

제가 get_Range를 사용할때 처음 닥쳤던 문제는... X,Y를 모두 숫자로 처리 해야한다는것입니다.
그래야 for나 While 반복문을 사용한 제어가 쉬워지고,, 모든 데이터의 위치 정보가 숫자로 처리된다는거죠...
그래서 저는 다음과같이 사용합니다.

    ExcelWs->get_Range(GetCellPos(X1,Y1), GetCellPos(X2,Y2))

GetCellPos(int X,int Y) 는
해당하는 셀의 좌표를 반환합니다.
재귀함수로 구현했습니다^^; 이유는 한번 생각해보시고..
필요하시면 직접 구현해보세요...

get_Range() 를 잘 사용하신다면... 엑셀의 모든 작업이 가능합니다...

물론 함수명을 찾기도 참 어렵습니다.
함수에 들어가는 값은 찾을길이 없어 보이죠...

예를들어 위의 범위로 라인을 그리는 함수에서
xlLineDouble 는 어떤 값을 가지는지 우리는 알지 못합니다.

하지만? 알수 있습니다^^;

xlLineDouble는 제가 직접 define 한 상수 입니다.

#define xlLineDouble -4119
와 같은 값을 가지고 있지요...

Excel에서는 쉬운 엑셀 작업을위해

"매크로" 라는 기능을 제공합니다.

이 "매크로" 는 비주얼베이직 스크립트 형태로 작성되죠..

비주얼베이직은 프로그래밍 언어입니다. 물론.. 디버깅 모드의 컴파일에서는 인터프리터 모드로 작동을 하긴 하지만요...

직접 엑셀을 실행시켜서 함수와 변수명들을 얻을수 있습니다.

도구->매크로->새 매크로 기록 을 누르시면

새로운 매크로를 작성합니다.

매크로를 켜두셨다면...

이제 A1 부터 C3까지의 범위를 선택해서

셀서식의 테두리에 가서 윤곽선만 그리도록 하겠습니다.

다시

도구->매크로->Visual Basic Editor (단축키 Alt + F11)을 누르시면...

모듈 부분에 우리가 했던 윤곽선 작업이 스크립트로 작성되어있습니다~

얼마나 고맙습니까?

저는 이걸 알았을때 눈물을 흘릴뻔^^;;; 했습니다...


    Selection.Borders(xlDiagonalDown).LineStyle = xlNone

라인에  F9를 눌러서 중단점을 거신후

F5를 눌러 실행을 해봅시다...

xlNone 에마우스를 가져가시면?

값이 보이죠~ xlNone의 값은 -4142군요^^

이와 같이... 필요한 값들을 하나하나 찾을수 있습니다.




처음에 제가 설명을 시작하면서 새로운 파일을 생성하는것만 보여드렸죠...

이것은... 이미 작업된(생성된)파일을 열어서 작업하는 겁니다. 물론 다른프로그램에서 읽고있다거나 하면 에러납니다
(엑셀은 에러가 굉장히 무섭게 생겼습니다 ㄷㄷㄷ;);

ExcelWb->ConnectTo( ExcelApp->Workbooks->Open( FileName.operator wchar_t *(),
    TNoParam(), TNoParam(), TNoParam(), TNoParam(), TNoParam(), TNoParam(),
    TNoParam(), TNoParam(), TNoParam(), TNoParam(), TNoParam(), TNoParam(),
    TNoParam(), TNoParam(), 0));

FileName 도 TVariant 입니다. 하지만 파라메터는 wchar_t *형으로 넣어주셔야 합니다.

그 다음이 문제입니다....

Open함수는 다음과 같이 막막하게 생겼습니다....
Open(BSTR Filename/*[in]*/, VARIANT UpdateLinks/*[in,opt]*/,
                                         VARIANT ReadOnly/*[in,opt]*/, VARIANT Format/*[in,opt]*/,
                                         VARIANT Password/*[in,opt]*/,
                                         VARIANT WriteResPassword/*[in,opt]*/,
                                         VARIANT IgnoreReadOnlyRecommended/*[in,opt]*/,
                                         VARIANT Origin/*[in,opt]*/, VARIANT Delimiter/*[in,opt]*/,
                                         VARIANT Editable/*[in,opt]*/, VARIANT Notify/*[in,opt]*/,
                                         VARIANT Converter/*[in,opt]*/, VARIANT AddToMru/*[in,opt]*/,
                                         VARIANT Local/*[in,opt]*/, VARIANT CorruptLoad/*[in,opt]*/,
                                         long lcid/*[in]*/,
                                         Excel_xp::ExcelWorkbook** RHS/*[out,retval]*/) = 0; // [1923]
...

저는 뭐가 뭔지 하나도 모르겠습니다^^;;

그래서 전부 ...TNoParam()으로 채웠죠...
TNoParam()은 엑셀에서 기본으로 지원해주는 함수 입니다.

파라미터에 해당하는 값을 알맞게 채워주는 똑똑한 녀석입니다.. 훗;

Default값들을 채워주죠...



자... 마지막으로...

저장을 합니다.

저장은 다음과같이...하시면 만사 오케이...

새로 생성을 하셨든 이미 있는 파일을 여셨든...

SaveAs로 저장하시면 됩니다.

다음과 같이말입니다.^^;;;

    ExcelWb->SaveAs(FileName,
            TNoParam(),
            TNoParam(),
            TNoParam(),
            TNoParam(),
            TNoParam(),
            (Excel_xp::XlSaveAsAccessMode) 3/*[in,def,opt]*/,
            TNoParam(),
            TNoParam(),
            TNoParam(),
            TNoParam(),
            TNoParam(),
            TDefLCID());
다 TNoParam()이죠?;; ㅎㅎ


저도 아직 모르는게 많이 있습니다;;

도움이 되었으면 하네요^^;;;

그럼 즐거운 프로그래밍 되시구요^^

모르시는거 있으시면 또 글 남겨주세요~

+ -

관련 글 리스트
45004 엑셀로 저장에 대한 질문입니다.(슬님 답변 좀 해주세요!) 백호 1013 2006/05/24
45012     Re:엑셀로 저장에 대한 질문입니다.(슬님 답변 좀 해주세요!) 슬  2214 2006/05/24
45007         답변 내용이 안 보여요!!! 백호 1022 2006/05/24
45009             Re:답변 내용이 안 보여요!!! 슬  981 2006/05/24
45013                 답변 감사합니다. 그리고 몇 가지만 더..... 백호 921 2006/05/24
45014                     Re:답변 감사합니다. 그리고 몇 가지만 더..... 슬  1642 2006/05/24
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.