Q&A

  • excel 문서 작성 관련...


Page 설정에 대해서 알고 싶습니다.(가로 인쇄, 세로 인쇄)



office 관련 객체에 관한 Help file 같은 걸 구할 수 있는데는 없나요?



일일이 짐작으로 실행해 보려니까 너무 답답하네요.



좋은 답변 부탁드립니다.



2  COMMENTS
  • Profile
    공군병장 2001.03.26 23:01
    궁금이 wrote:

    >

    > Page 설정에 대해서 알고 싶습니다.(가로 인쇄, 세로 인쇄)

    >

    > office 관련 객체에 관한 Help file 같은 걸 구할 수 있는데는 없나요?

    >

    > 일일이 짐작으로 실행해 보려니까 너무 답답하네요.

    >

    > 좋은 답변 부탁드립니다.

    >



    휴가 나온 공군 병장입니다. 이 비슷한 글을 Delphi Korea에도 쓴 거 같은데. 아직

    못 보셨나 보군요.. 좀 자세히 써 드릴께요.. 군에서 지금 제가 하고 있는 프로젝

    트도 Office 연동을 많이 쓰는데.. 정말 좋은 걸 하나 발견해서.. ^^;; 이미 있던

    방법일지도 모르지만..



    흠.. 우선.. Page 설정 뿐이 아니라 Office 연동 전반에 관해서 말씀 드리죠.. 엑셀

    뿐이 아니라 PowerPoint나 Word까지도.. 포함해서..

    일단 가장 큰 문제는 Office 객체에 대한 Help file이 없다는 거죠.. 님이 말씀하신

    것처럼... 그게 Automation을 이용하는 거라서 그렇죠. ^^;; 그 문제에 대해서 고민

    하다가 알게 된 건데..



    일단 엑셀을 실행시킵니다.. 그 후에 엑셀의 도구메뉴에서 새 매크로 기록을 클릭합

    니다. 그러면. 매크로 기록이 시작되죠.. 그럼 그 이후에 엑셀에서 구현하고 싶은 기

    능을 차례로 구현해 봅니다. 그러면 그 기능들이 매크로에 다 기록이 되겠죠?? 그 이후

    에 매크로 기록을 끝내고 Visual Basic 편집기 화면으로 들어갑니다..

    그러면 Module을 볼 수 있을텐데.. 그 곳을 클릭하면.. 지금껏 기록한 매크로의 코드를

    몽땅 다 볼 수가 있습니다. ^^;; 바로 이거죠.. 이 코드들.. 델파이에서도 이용 가능한

    것들입니다.. 델파이의 Code Complete 기능을 좀 잘 이용해 보신다면 비슷한 메소드를

    찾을 수 있을 거에요.. VB Script와 델파이 코드를 잘 비교해 보시면.. 필요한 메소드

    모두 찾을 수 있을 겁니다.. 일종의 역추적이죠.. 델파이에서 엑셀을 이용해 구현하고

    싶은 기능을 엑셀의 Script로 찾은 후 다시 델파이에서 그 코드를 이용하여 엑셀에 기록

    하는.. 델파이의 코드가 엑셀의 메크로 기능을 한다고 생각하시면 쉽게 이해하실 듯

    하네요.. 또 Office 관련 팁을 하나 덧붙이자면..

    Main 프로젝트 하나에 여러개의 폼이 있고.. 각각의 폼을 엑셀로 뽑아내야 할때.. 자칫

    잘못하면.. 백그라운드에 여러개의 Excel Application이 떠 있을 수 있게 되죠..

    ExcelApp의 Visible을 True로 하는 건 좀 위험하죠.. 사용자가 어떻게 이벤트를 진행할

    지도 알 수 없는 노릇이고..

    이것을 막는 방법인데.. 첫번째는 윈도우즈 API 함수를 이용하는 방법이 있죠..

    Excel의 ClassName은 'XLMAIN'이죠.. 이걸 이용해서 FINDWINDOW 함수를 이용해서 엑셀

    App의 핸들을 찾아 SendMessage로 WM_CLOSE를 날리는 겁니다. ClassName은 WinSight32

    를 이용하여 찾을 수 있습니다..

    또 한 방법은 일단 코드를 적어보죠..

    unit ExportToExcel;

    .

    .

    .

    type TExcelForm = class(TForm)

    .

    .

    . ( 여기엔 Servers component에서 기본적으로 연동할 컴포넌트를 붙입니다.)

    private

    procedure ConnectToExcel;

    procedure ExportToExcel(title:string; Grid:TStringGrid);

    procedure DisconnecFromExcel;



    implementation

    .

    .

    .



    procedure TExcelForm.ConnectToExcel;

    begin

    { 엑셀 커넥트 하는 부분을 기술합니다.. 전 개인적으로 엑셀의 Visible은 켜두지

    않습니다. }

    end;



    procedure TExcelForm.ExportToExcel(Title:string;Grid:TStringGrid);

    begin

    { 이것은 스트링 그리드를 하나 참조하여 그 내용을 엑셀로 Export하는

    제가 즐겨 쓰던 프로시져인데.. 지금 휴가나와서 코드가 제게 없는 바람에

    그냥 기억으로 이렇게 하고 있으니.. 죄송. ^^;; Title은 그리드의 제목쯤되는..

    이 부분에 Grid내용을 엑셀로 익스포트하는 부분을 씁니다. 아까 앞에서 말씀드렸

    던 방법으로 말이죠.. 역추적.. 예를 들자면..(이건 방금 엑셀로 아무거나 해본건데..)

    범위의 선택은 Range의 Select...

    그 후 선택한 범위의 셀 형식을 Text로 하는 메소드는 NumberFormatLocal = '@'

    선택한 범위의 수평,수직 맞춤을 가운데로 하는 메소드는

    HorizontalAlignment = xlCenter

    VerticalAlignment = xlCenter

    아참 참고로 xlCenter같은 엑셀 상수는 Variant변수를 하나 선언한 후에 거기에

    집어넣으시는게 좋습니다. 그 후에 그 상수를 대입하는 식으로..

    그리고.. 선택한 영역의 외곽선 그리기는 매크로에 보니..

    " Selection.Borders(xlDiagonalDown).LineStyle = xlNone

    Selection.Borders(xlDiagonalUp).LineStyle = xlNone

    With Selection.Borders(xlEdgeLeft)

    .LineStyle = xlContinuous

    .Weight = xlThin

    .ColorIndex = xlAutomatic

    End With

    With Selection.Borders(xlEdgeTop)

    .LineStyle = xlContinuous

    .Weight = xlThin

    .ColorIndex = xlAutomatic

    End With

    With Selection.Borders(xlEdgeBottom)

    .LineStyle = xlContinuous

    .Weight = xlThin

    .ColorIndex = xlAutomatic

    End With

    With Selection.Borders(xlEdgeRight)

    .LineStyle = xlContinuous

    .Weight = xlThin

    .ColorIndex = xlAutomatic

    End With

    Selection.Borders(xlInsideVertical).LineStyle = xlNone

    Selection.Borders(xlInsideHorizontal).LineStyle = xlNone "

    이렇게 나와있군요.. 이것은 VB Code이고 이것을 델파이에 맞게 약간 수정하세요.

    Code complete의 도움을 받으면 쉽겠죠.. 너무 길어 델파이로 바꾸진 않았습니다.^^}



    end;



    procedure TExcelForm.DisconnectFromExcel;

    begin

    { 연결을 했으니 해제해야겠죠?? }

    end;



    procedure TExcelForm.OnDestroy(....);

    begin

    DisconnectFromExcel;

    end;

    .

    . (나머지 필요한 코딩들을 쓰세요. ^^;)

    .



    이렇게 유닛을 하나 작성해 두면 나중에 필요할때마다 유용하게 써 먹을수 있죠..

    그리고.. 제가 하고 싶었던 말.. ^^;;

    이 유닛을.. 만약에 어떤 폼에서 button1을 누르면 그리드를 엑셀로 뽑고 싶다면..





    uses ExportToExcel; (위에서 작성한 그 유닛!!)

    .

    .

    procedure TForm1.Button1Click(Sender:TObject);

    var

    tmpxls : TExcelForm;

    begin

    tmpxls := TExcelForm.Create(Self);

    tmpxls.ExportToExcel('엑셀로갈꺼야!',mygrid);

    tmpxls.free; // 이 시점에서 OnDestroy가 호출되면서 Excel도 깨끗이 사라짐..

    end;



    이렇게 코딩하면 되죠.. ^^;; 제가 할 말은 다했고 도움이 되었길 빕니다.

    지금 델파이가 옆에 없이 기억에만 의존하여 코딩을 해서 틀린 부분이 있을지 모르겠

    네요.. 알아서 고쳐주시고.^^;; 제가 낼 들어가는 관계로 이 글에관한 질문이 올라

    와도 답변을 할수가 없네요.. (6주 후에 나 답변이.. ^^;;)

    그래서 쓸데없이 자세했구요.. 지루하셨다면 죄송.. 도움이 되시길.. 그럼..





  • Profile
    최용일 2001.03.26 22:57
    안녕하세요. 최용일입니다.



    MSDN(http://msdn.microsoft.com)에서 찾아보세요. 모두다 나와 있습니다.



    정확한 주소는 잊어버렸네요.. ㅠ'ㅠ



    ^^ 항상 즐코하세요...



    궁금이 wrote:

    >

    > Page 설정에 대해서 알고 싶습니다.(가로 인쇄, 세로 인쇄)

    >

    > office 관련 객체에 관한 Help file 같은 걸 구할 수 있는데는 없나요?

    >

    > 일일이 짐작으로 실행해 보려니까 너무 답답하네요.

    >

    > 좋은 답변 부탁드립니다.

    >