Q&A

  • 엑셀에서 이미 생성된 WorkBook저장할려면.....
먼저 똑같은 질문을 두번 올리게 된점 모든 델피언께 깊이 사과드립니다.

답변은 없고 너무 급해서 이렇게 또올립니다.

이번달 말까지 해결해야 하는데... 다른건 다했는데 여기서 그만 막혀서 진도가 안나가네요..

귀찮으시드라도 아시는분 있으시면 답변을 부탁드립니다.



안녕하세요.

항상 이곳에서 도움을 많이 받고 있는 초보 델퐁입니다.

이번엔 DB에서 엑셀로 데이터를 보내야 하는데..

그냥 새로운 WorkBook을 생성하고 WorkSheet를 생성해서 대이터를 보내고 종료하는 것은 여기에 올라온 내용들을 보고 하니까 잘되는데요..

문제는 미리 만들어진 WorkSheet의 폼안에 데이터를 삽입해야한다는겁니다. 데이터를 보낼때 항상 새로운 workbook을 생성해서 사용하는게 아니라 한개의 workbook안에 하루에 한개씩 한달동안 30개의 worksheet를 생성해야 하거든요.

그렇게 할려면 기존에 생성된 workbook을 열어서 worksheet만 한개 추가 생성해서 데이터를 보내야 하는데... 어떻게 구현해야 하는지....쩝

미리 workSheet를 30개를 만들어놓고 원하는 workSheet를 열어서 데이터를 삽입해도 되걸랑요. 그러면 원하는 workSheet를 열수만 있어도 될것같은데..

참 저장할때도 무조건 SaveAs를 써야하나요. Save는 에러가 나던데...

여기에 있는 Q&A를 다뒤져 봤는데 전 제가원하던걸 찾지 못했습니다. 고수님들의 조언을

다시한번 부탁드립니다.

간단한 예제라도 올려주시면 정말 감사히! 요긴하게! 사용하겠습니다.

참고로 제가 지금까지 구현했던 소스를 올립니다.





//테이블 열기

procedure TForm1.Button1Click(Sender: TObject);

begin

Table1.Open;

end;





//엑셀 생성

procedure TForm1.Button2Click(Sender: TObject);

begin

Try

ExcelApplication1.Connect;

except

MessageDlg('엑셀과 연결되지 않았습니다',mtError,[mbOk],0);

Abort;

end;



Try

ExcelApplication1.Visible[0] := True;

ExcelApplication1.Caption := '델파이에서 엑셀 테스트';



//WorkBook을 추가하는 걸루 아는데 요걸 Open으로 하면 희한할텐데....

ExcelApplication1.Workbooks.Add(xlWbatworksheet,0);

ExcelWorkbook1.ConnectTo(ExcelApplication1.Workbooks.Item[1]);

ExcelWorkSheet1.ConnectTo(ExcelWorkBook1.Sheets[1] as _WorkSheet);

except

on E: Exception do

begin

Showmessage(E.Message);

ExcelApplication1.Disconnect;

end;

end;

end;





//DB에서 엑셀로 보내기

procedure TForm1.Button3Click(Sender: TObject);

var

i,J: Integer;

MyRange: Range;

begin

Try

With ExcelWorkSheet1 do

begin

for i := 1 to Table1.FieldCount do

Cells.Item[4,i] := Table1.Fields[i-1].FullName;

Range[Cells.Item[1,1],Cells.Item[2,1]].Font.Bold := True;



Table1.First;



for i := 5 to Table1.RecordCount do

begin

for J := 1 to Table1.FieldCount do

begin

Cells.Item[i,j] := Table1.Fields[j-1].AsString;

end;

Table1.Next;

end;





//저장하기전에 자동셀 크기조정인걸로 아는데 에러가 납니다....

//이걸 주석처리하면 동작이 잘되구요

MyRange.Columns.AutoFit;



//요놈을 SaveAs말구 Save로 했슴 얼마나 조을까....

SaveAs('D:델파이5연습테스트1.Xls');



end;

except

on E: Exception do

begin

Showmessage(E.Message);

ExcelApplication1.Disconnect;

end;

end;



end;



procedure TForm1.Button4Click(Sender: TObject);

begin

ExcelApplication1.Disconnect;

ExcelApplication1.Quit;

end;



1  COMMENTS
  • Profile
    이재식 2000.06.27 11:10
    이재식 Wrote :

    안녕하세요?



    제가 엑셀과의 연동에대한 많은것을 이야기할수는 없고요,

    님께서 말씀하신 내용에 대해서만 언급을 하겠습니다.



    먼저 autofit말씀입니다.

    ExcelHandle := CreateOleObject ('Excel.Application') ;

    ExcelHandle.WorkBooks.Add ;



    ExcelHandle.Cells[1, 1] := 'hoho' ;



    for i := 1 to Table1.RecordCount do

    begin

    for j := 1 to DBGrid1.FieldCount do

    begin

    ExcelHandle.Cells[i+1, j].Value := Table1.Fields[j-1].asString ;

    end ;

    Table1.Next ;

    end ;

    ExcelHandle.Columns.AutoFit ;

    ExcelHandle.Visible := true ;



    참고로 코딩은 엑셀를 생성하고 테이블테이터을 엑셀에 뿌려줍니다.

    다만, 위에 autofit가 있는데요, 이것은 visible이 true이전에 설정이

    되어야합니다. 그런데, 님의 코딩은 로직상 true가 먼저되고 autofit가 나중이 됩니다.

    그러면 에러의 소지가 있죠.

    제가 보니까, 님의 코딩에 button2~3에서요,

    이름 및 그에대한 선언이 명확히 명시되지 않아서 제가 님의 의도를 잘 파악이

    안되는 관계로 위처럼 코딩을 잠시 해보았습니다.

    autofit는 저렇게 하시면 됩니다.



    그리고, save건입니다.

    이것은 이렇게 하시면 됩니다.

    save는 처음실행하는 엑셀에대해서는 마치 saveas처럼 화면이 뜨고요,

    기존에 어떤 엑셀workbook를 열었다면 응당 기존에 열었던 이름으로 저장이

    되겠죠. 아래에선 동시에 두가지를 설명하겠습니다.

    ExcelHandle := CreateOleObject ('Excel.Application') ;

    ExcelHandle.WorkBooks.open('c:testExcel.xls') ;

    ExcelHandle.Sheets['sheet2'].Select ;

    ExcelHandle.Cells[1, 1] := 'hoho' ;

    ExcelHandle.visible := true ;

    ExcelHandle.DisplayAlerts := true ;

    ExcelHandle.Save ;



    위 구문은 님의 요구처럼 해당 workbook(엑셀파일)를 열고

    동시에 원하는 시트이름을 선택하는 것입니다.



    ExcelHandle := CreateOleObject ('Excel.Application') ;

    ExcelHandle.WorkBooks.open('c:testExcel.xls') ;

    ExcelHandle.Sheets['sheet2'].Select ;

    위 세줄이 엑셀을 열준비하고, 해당 workbook를 선택하고

    그안에서 해당 시트이름(여기서는 sheet2를 선택)를 선택했습니다.

    응당 위에서

    ExcelHandle.Cells[1, 1] := 'hoho' ; 이 코딩은 당연히 sheet2에 기록이 되겠죠.

    그럼다음

    ExcelHandle.DisplayAlerts := true ;

    ExcelHandle.Save ;

    위 두줄이 같은 이름으로 저장을 하기위한 코딩입니다.

    그런데, 만약 해당 workbook에서 새로운 worksheet를 추가하고싶다면

    아래처럼 하시면 됩니다.

    ExcelHandle.Sheets.Add;

    ExcelHandle.ActiveSheet.Name := '새로운시트이름'

    이렇게 하시면 '새로운시트이름'를 갖는 시트가 하나 생기겠죠.



    ExcelHandle.Sheets[SheetName].Select;

    위 코딩은 특정시트를 선택하기 위한 명령입니다.

    sheetName에 원하시는 시트이름을 선택하시면 되겠죠.



    이상 두서없이 썼고요,

    나름대로 도움이 되었으면 합니다.



    혹, 위 글중 잘안되는 것이 있으면 제가 공부한 내용을

    옮겨적을때 실수를 한것이니, 지적해 주세요.

    다시 확인해서 설명을 드리겠습니다.

    그럼....