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
[51985] Re:클립보드 질문드려요.
장성호 [nasilso] 2559 읽음    2008-01-21 15:20
음....
클립보드는 윈도우에 공유메모리라고 보면됩니다.

클립보드를 이용할땐
어떤 application에서 복사(copy)해서 아무 프로그램에서 붙여넣기(paste)하면 되잖아요?

마찬가지로 Excel의 Data를 읽어올때 클립보드를 이용한다는것은?

엑셀에서 copy를 해서 클립보드로 복사를 해 놓아야
내가 프로그램에서 클립보드의 데이타를 읽어올수 있겠죠?

클립보드의 data를 가져오는것은?
AnsiString str =  Clipboard()->AsText;
이런식으로 하면됩니다.


그런데 클립보드에서 가져오기전에 excel에서 데이타를 클립보드로 복사하는 과정이 빠져있네요
문론 그과정은 ole를 통해서 excel을 제어해야 합니다.

컴포넌트 office 탭에 있는
TExcelApplication
TExcelWorksheet 등도 결국은 ole를 이용합니다.
껍데기만 조금 씌워 놓은것 뿐이죠

아래 샘플을 참조하세요
void __fastcall TForm1::Button1Click(TObject *Sender)
{
   // Variant V;
    Variant excel_app;
    Variant excel_book;
    Variant excel_sheet;
    Variant cells;

    AnsiString str1,str2;

    if(!OpenDialog1->Execute())return;

    //엑셀 실행----------------------------------
    excel_app=Variant::CreateObject("excel.application");
    excel_app.OlePropertySet("Visible", (Variant)false);

    //엑셀 파일열기------------------------------
    String asFileName=OpenDialog1->FileName;
    excel_app.OlePropertyGet("WorkBooks").OleProcedure("Open",asFileName.c_str());
    excel_book=excel_app.OlePropertyGet("ActiveWorkbook");
    excel_sheet=excel_book.OlePropertyGet("ActiveSheet");

    //엑셀 쉬트에서 원하는 컬럼 선택해서 클립보드로 copy
    cells=excel_sheet.OlePropertyGet("Columns",3);
    cells.OleFunction("Select");
    cells.OleFunction("Copy");

    //클립보드에서 text 읽어오기
    str1=Clipboard()->AsText;

    cells=excel_sheet.OlePropertyGet("Columns",4);
    cells.OleFunction("Select");
    cells.OleFunction("Copy");
    str2=Clipboard()->AsText;

    //엑셀 종료
    excel_app.OlePropertySet("DisplayAlerts", (Variant)false); //프로그램 중료시 수정한것 저장할까요?라는 메세지 뜨지 않게..
    excel_app.OleFunction("Quit");
    excel_app = Unassigned;

    TStringList *lst1=new TStringList;
    TStringList *lst2=new TStringList;

    lst1->Text=str1;
    lst2->Text=str2;
    int iVal;
    Memo1->Lines->Clear();
    Memo2->Lines->Clear();
    for(int i=0;i<lst1->Count;i++)
    {
        if(TryStrToInt(lst1->Strings[i],iVal))
        {
            Memo1->Lines->Add("Column3 Line="+IntToStr(i+1)+" OK  "+lst1->Strings[i]);
        }
        else
        {
            Memo1->Lines->Add("Column3 Line="+IntToStr(i+1)+" Error "+lst1->Strings[i]);
        }
    }

    for(int i=0;i<lst2->Count;i++)
    {
        if(TryStrToInt(lst2->Strings[i],iVal))
        {
            Memo2->Lines->Add("Column4 Line="+IntToStr(i+1)+" OK  "+lst2->Strings[i]);
        }
        else
        {
            Memo2->Lines->Add("Column4 Line="+IntToStr(i+1)+" Error "+lst2->Strings[i]);
        }
    }

    delete lst1;
    delete lst2;

}
//---------------------------------------------------------------------------




네버 님이 쓰신 글 :
: 엑셀에 데이타가 너무 많아서 검색하는데 속도르가 느려지네요.
:
: 그래서 클립보드를 이용해서 엑셀에 있는 데이타를 클립보드로 카피를 하고.
:
: 클립보드에 있는 데이타를 검색해서 처리를 하려고 하는데요.
: ================================================================
: data : ver 1                       
: S/N      : 111                       
: Date     : 08/01/21                       
: hh:mm:ss    data1    data2    data3   
: 11:32:33    0    0    100       
: 11:32:33    0    0    100       
: 11:32:43    0    0    100       
: 11:32:45    0    0    100       
: 11:32:47    0    0    100       
: 11:32:49    0    0    100       
: 11:32:51    0    0    100       
: 11:32:53    0    0    100       
: 11:32:55    0    0    100       
: 11:32:57    0    0    100       
: 11:32:59    0    0    100       
: 11:33:01    0    0    100       
: 11:33:03    0    0    100   
: ==============================================================
: 이런식으로 데이타가 저장된 엑셀 파일이 있습니다.
:
: 여기서 data1 , data2, data3 값이 숫자로 입력되어있는데 혹 깨진 문자가 없는지. 아니면 max값을
: 초과하는건 없는지 확인하려고 합니다.
:
: 그런데 데이타가 천개가 넘게 있다보니까 속도가 느려지는거구요 .
:
: 이곳에서 클립보드로 검색을 해서 찾아봣는데
:
: 1.   Form3->Memo1->PasteFromClipboard();
:
:  2. AnsiString cont =  Clipboard()->AsText;
: 이런걸 사용하라고 되어있는데.
:
: 굳이 memo 컴포넌트를 써서 화면에 보여줄 필요는 없거든요.
:
: 아니 솔직히 말해서 클립보드라는걸 자체를 어떻게 접근해야 할지를 모르겠습니다.
:
: 클립보드라는 컴포넌트가 따로 있는건지.
:
: 복사를 할 경우 Form3->Memo1->PasteFromClipboard();  이걸 사용하면 자동적으로 엑셀에 있는
:
: 데이타가 클립보드로 복사가 되는건지..
:
: 복사가 되었다면 클립보드에 있는 데이타를 어떻게 다뤄야 하는건지.. 답변좀 부탁드립니다^^;;

+ -

관련 글 리스트
51981 클립보드 질문드려요. 네버 1263 2008/01/21
51985     Re:클립보드 질문드려요. 장성호 2559 2008/01/21
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.