Q&A

  • excel로 저장시 셀 형식 지정 ?
스트링그리드의 내용을 excel로 저장할 때 셀형식을 지정하는 방법을 알고 싶습니다..

procedure TMainFrm.Button1Click(Sender: TObject);
var
   ltExcelApp: Variant;
   ltExcelBook: Variant;
   ltExcelSheet: Variant;
   i: Integer;
begin
     try
        ltExcelApp := CreateOLEObject('excel.application');
     except
        ShowMessage('EXCEL이 설치되어 있지 않습니다 !!!');
        Exit;
     end;

     try
        ltExcelApp.Visible := False;
        ltExcelApp.DisplayAlerts := False;

        ltExcelBook := ltExcelApp.WorkBooks.Open(gtExcelFileName);
        ltExcelBook := ltExcelApp.WorkBooks.item[1];

        ltExcelSheet := ltExcelBook.Worksheets.Item[1];

        for i := 1 to ltExcelSheet.UsedRange.Rows.Count do
        begin
             ltExcelSheet.Cells[i,4] := StringGrid1.Cells[1,i];
             ltExcelSheet.Cells[i,5] := StringGrid1.Cells[2,i];
             ltExcelSheet.Cells[i,6] := StringGrid1.Cells[3,i];
             ltExcelSheet.Cells[i,7] := StringGrid1.Cells[7,i];
        end;

        ltExcelApp.WorkBooks[1].Save;
        ltExcelApp.WorkBooks.Close;
        ltExcelApp.Quit;
        ltExcelApp := Unassigned;
     except
        on e:Exception do
        begin
             ltExcelApp.WorkBooks.Close;
             ltExcelApp.Quit;
             ltExcelApp := Unassigned;
             ShowMessage('데이터 저장 오류 !!! - ' + e.message);
        end;
    end;
end;

위의 소스에서 셀 6,7을 텍스트 형식으로 지정을 하고 싶습니다..
3  COMMENTS
  • Profile
    뚜까 2004.11.12 01:41


    예전에 받아논건데 적당한거 골라서 쓰세요....

    엑셀 사용시 셀들을 복잡하게 제어해야할 때 필요한 여러 포르시져
    필요한 부분 복사해서 쓰면 됩니다.(참고로 델파이6 기준으로 TexcelApplication,
    TExcelWorkbook, TExcelWorksheet, TexcelChart 올려놓고 실행하면 됩니다.

    uses절에 Activex 추가하시고 다음과 같이 코딩하면 됩니다.

    unit Unit1;

    interface

    uses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls, excel2000, OleServer, Activex;

    type
      TForm1 = class(TForm)
        Button1: TButton;
        ExcelApplication1: TexcelApplication;
        ExcelWorkbook1: TexcelWorkbook;
        ExcelWorksheet1: TexcelWorksheet;
        ExcelChart1: TexcelChart;
        procedure Button1Click(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
      end;

    var
      Form1: TForm1;

    implementation

    {$R *.dfm}

    procedure TForm1.Button1Click(Sender: TObject);
    var
      LCID,i : Integer;
      Sheet, Selection : Variant;
      Format : OleVariant;
      //차트용
      ChObj: ChartObject;
      SheetType: OleVariant;
      Rnge, ChType: OleVariant;
      Ax: Axis;
    begin
      excelApplication1.Connect; //엑셀을 가동한다.(InVisible 상태)
      ExcelWorkbook1.connectto(excelApplication1.workbooks.add(TOleEnum(xlWBATWorksheet), LCID));
      ExcelWorksheet1.connectto(excelWorkbook1.worksheets.item['Sheet1'] as _worksheet );

      //워크시트 이름 변경
      excelWorksheet1.Name := '날 죽여라';


      excelApplication1.DisplayAlerts[LCID] := False;
      excelApplication1.Visible[LCID] := true;

      Sheet := ExcelApplication1.WorkBooks[ExcelApplication1.Workbooks.Count].WorkSheets[excelWorkbook1.Worksheets.Count];

      Sheet.Cells[1,1] := '엑셀서식';

      excelApplication1.Range['A1','A1'].borders.lineStyle := 1;
      excelApplication1.Range['A1','A1'].borders.Color := clNavy;
      excelApplication1.Range['A1','A1'].Interior.Color := clYellow;
      //폰트변경
      excelApplication1.Range[Sheet.Cells[1,1],Sheet.Cells[1,1]].font.bold := true;
      excelApplication1.Range[Sheet.Cells[1,1],Sheet.Cells[1,1]].font.Size := 20;
      excelApplication1.Range[Sheet.Cells[1,1],Sheet.Cells[1,1]].font.Name := '±A¼­';

      //우측정렬(가로정렬)
      excelApplication1.Range[Sheet.Cells[1,1],Sheet.Cells[1,1]].HorizontalAlignment := xlHAlignRight;
      //가운데정렬(세로정렬)
      excelApplication1.Range['B1','B1'].VerticalAlignment := xlHAlignCenter;

      //범위로 찍을 경우
      excelApplication1.Range['B1','C2'].Value := '123456789';

      //숫자형 포맷
      Format := '_-* #,##0.0_-;-* #,##0.0_-;_-* "-"???_-;_-@_-';
      excelApplication1.Range['B1','B1'].NumberFormatLocal := Format;

      Sheet.Range['B2', 'C2'].Interior.Color := RGB(223, 123, 123);
      excelApplication1.Range['B4', 'C4'].Interior.Color := clSilver;

      //날짜 찍기
      Sheet.Cells[5,1] := '2002/5/6';
      Sheet.Cells[5,2] := '2002/5/6';

      //숫자형
      Sheet.Cells[5,3] := '12345';
      Sheet.Cells[5,4] := '12345';

      //날짜포맷
      Format := 'yyyy-mm-dd';
      excelWorksheet1.Range[Sheet.Cells[5,1], Sheet.Cells[5,1]].NumberFormat := Format;

      Format := 'mmmm d, yyyy';
      excelWorksheet1.Range[Sheet.Cells[5,2], Sheet.Cells[5,2]].NumberFormat := Format;

      Format := '@';
      excelWorksheet1.Range[Sheet.Cells[5,3], Sheet.Cells[5,3]].NumberFormat := Format;

      excelWorksheet1.Range['B11','B11'].VerticalAlignment := xlHAlignCenter;
      excelWorksheet1.Range['B11','B11'].HorizontalAlignment := xlHAlignRight;
      excelWorksheet1.Range['B11','B11'].Value := '셀병합후 가운데(세로) 정렬';
      excelWorksheet1.Range['B11','B13'].MergeCells := true;
      excelWorksheet1.Range['B11','B13'].borders.LineStyle := 2;

      excelWorksheet1.Range['B15','B15'].borders.lineStyle := 0;
      excelWorksheet1.Range['B15','B15'].HorizontalAlignment := xlHAlignRight;
      excelWorksheet1.Range['B15','B15'].Value := '셀병합후 우측(가로) 정렬';
      excelWorksheet1.Range['B15','D15'].MergeCells := true;
      excelWorksheet1.Range['B15','D15'].borders.LineStyle := 1;

      excelWorksheet1.Range['F15','G20'].MergeCells := true;
      excelWorksheet1.Range['F15','F15'].Value := '다중셀병합';
      excelWorksheet1.Range['F15','G20'].MergeCells := true;
      excelWorksheet1.Range['F15','F15'].HorizontalAlignment := xlHAlignCenter;
      excelWorksheet1.Range['F15','F15'].VerticalAlignment   := xlHAlignCenter;
      excelWorksheet1.Range['F15','G20'].borders.Weight := 4;

      //라인 스타일
      for i := 0 to 13 do
      begin
        excelWorksheet1.Range['B'+inttostr((2*i)+16),'B'+inttostr((2*i)+16)].borders.lineStyle := i;
        excelWorksheet1.Range['B'+inttostr((2*i)+16),'B'+inttostr((2*i)+16)].Value := 'borders.lineStyle := '+inttostr(i);
      end;

      //border Weight
      for i := 1 to 4 do
      begin
        excelWorksheet1.Range['B'+inttostr((2*i)+42),'B'+inttostr((2*i)+42)].borders.lineStyle := 1;
        excelWorksheet1.Range['B'+inttostr((2*i)+42),'B'+inttostr((2*i)+42)].borders.Weight := 1;
        excelWorksheet1.Range['B'+inttostr((2*i)+42),'B'+inttostr((2*i)+42)].Value := 'borders.Weight := '+inttostr(i);
      end;

      //라인 위치
      excelWorksheet1.Range['D18','D18'].borders.Item[1].LineStyle := 1;
      excelWorksheet1.Range['D18','D18'].Value := 'borders.Item[1].LineStyle := 1';
      excelWorksheet1.Range['D20','D20'].borders.Item[2].LineStyle := 1;
      excelWorksheet1.Range['D20','D20'].Value := 'borders.Item[2].LineStyle := 1';
      excelWorksheet1.Range['D22','D22'].borders.Item[3].LineStyle := 1;
      excelWorksheet1.Range['D22','D22'].Value := 'borders.Item[3].LineStyle := 1';
      excelWorksheet1.Range['D24','D24'].borders.Item[4].LineStyle := 1;
      excelWorksheet1.Range['D24','D24'].Value := 'borders.Item[4].LineStyle := 1';

      //패턴 변경
      for i := 1 to 18 do
      begin
        excelWorksheet1.Range['D'+inttostr(i+24),'D'+inttostr(i+24)].Interior.Pattern := i;
        excelWorksheet1.Range['E'+inttostr(i+24),'E'+inttostr(i+24)].Value := 'Interior.Pattern := '+inttostr(i);
      end;

    { 이미지를 삽입할 경우 실제파일을 기록해야 되기 때문에 주석처리
      실제 파일과 경로명 기록하고 주석푸시고 싱행해보세요
      //백그라운드 이미지
      //excelWorksheet1.SetBackgroundPicture('C:\My Documents\My Pictures\couplevssolo(6).jpg');
      //이미지 입력
      Selection := Sheet.Pictures.Insert('C:\My Documents\My Pictures\302492_2.jpg');
      //이미지 위치 조절
      Selection.ShapeRange.IncrementLeft(243);
      Selection.ShapeRange.IncrementTop(605);
    }

      //수식 입력
      Format := '#,##0.00_ ;-#,##0.00;_-* "-"???_-;_-@_-';
      excelApplication1.Range['F3','H8'].NumberFormatLocal := Format;

      excelWorksheet1.Range['F3', 'H8'].Formula := '=RAND()*10';
      excelWorksheet1.Range['F9', 'F9'].Formula := '=SUM(F3:F8)';
      excelWorksheet1.Range['G9', 'G9'].Formula := '=SUM(G3:G8)';
      excelWorksheet1.Range['H9', 'H9'].Formula := '=SUM(H3:H8)';
      excelWorksheet1.Range['I9', 'I9'].Formula := '=SUM(F9:H9)';


      excelWorksheet1.Range['F2', 'F2'].Value := '1학년';
      excelWorksheet1.Range['G2', 'G2'].Value := '2학년';
      excelWorksheet1.Range['H2', 'H2'].Value := '3학년';

      excelWorksheet1.Range['E3', 'E3'].Value := '1년';
      excelWorksheet1.Range['E4', 'E4'].Value := '2년';
      excelWorksheet1.Range['E5', 'E5'].Value := '3년';
      excelWorksheet1.Range['E6', 'E6'].Value := '4년';
      excelWorksheet1.Range['E7', 'E7'].Value := '5년';
      excelWorksheet1.Range['E8', 'E8'].Value := '6년';
      excelWorksheet1.Range['E3', 'E8'].HorizontalAlignment := xlHAlignRight;

      //차트용 오브젝트 생성
      ChObj := (excelWorksheet1.ChartObjects(EmptyParam, lcid) as ChartObjects).Add(600, 10, 400, 250);
      excelChart1.ConnectTo(ChObj.Chart as _Chart);
      //데이터 범위(데이터뿐만 아니라 가로축 세로축에 찍힐 주석값까지 포함)
      Rnge := excelWorksheet1.Range['E2','H8']; // the data range, including titles
      //차트타입
      ChType := TOleEnum(xl3DColumn);
      excelChart1.ChartWizard(Rnge, ChType, EmptyParam, xlColumns, 1, 1, True,
                              excelWorksheet1.Range['A1', 'A1'].Text, // The chart title
                              '번호', '점수', EmptyParam, lcid);
      Ax := excelChart1.Axes(xlValue, xlPrimary, lcid) as Axis;
      Ax.AxisTitle.Font.FontStyle := '굴림체';

      //자동 컬럼 폭 맞춤
      excelWorksheet1.Columns.AutoFit;
    end;

    end.

  • Profile
    강신구 2004.11.12 02:06
    답변에 감사드립니다..

    그런데.. 셀형식을 텍스트로 지정하는 방법에 대해서는 없군요..
    아쉽습니다..
  • Profile
    작은호롱 2004.11.12 02:26
    소스중에서 다음부분이 텍스트형식으로 지정하는
    부분합니다.

    ===> Format := '@';

    즐프하세요.


    • 배정은
    • 2004.11.13 04:52
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 착한천사
      2004.11.25 02:05
      착한천사 김경록입니다.. 흠.. 일단 질문 내용을 보면, 빠져 있는게 있어서.. 그 내용이 궁금하군요... ...
    • 노명환
    • 2004.11.13 03:06
    • 0 COMMENTS
    • /
    • 0 LIKES
    • 나그네
      2004.11.13 20:10
      이거 선언해 주시고요 type   TCustomDBGridCracker = class(TCustomDBGrid); DBGrid1DrawC...
    • 모영철
      2004.11.15 18:29
    • 석주현
      2004.11.13 02:24
      근데 전 맨날 좀 의야한게 포커스란게 Grid에서 보면 셀렉트 된거랑 같잖아요.. ^^ 그래서 그냥 if (...
    • 모영철
      2004.11.13 03:33
    • 델피언
    • 2004.11.13 00:19
    • 2 COMMENTS
    • /
    • 0 LIKES
    • 석주현
      2004.11.13 02:37
      음 버젼이 틀려서 좀 그런데요.. PrepareReport 를 해주고 프린트 해야지 되는걸로 알고 있습니다. ^^
    • 델피언
      2004.11.13 17:51
      frxreport1.preparereport(true); frxreport1.print; 하니 되네요 감사합니다.
    • 석주현
      2004.11.13 03:01
      이렇게 해보니 잘되네요.. ^^ ////////////////////////////// procedure TForm1.QRPreview1MouseWheel...
    • 서기원
      2004.11.12 23:40
      퀵리포트 컴포넌트 중에 QRPreview라고 있던데 그거 사용하시면 되지 않을까요? 즐푸하세요~
    • 노명환
      2004.11.12 23:50
      당연히 프리뷰컴퍼넌트를 사용해서 했습니다. 그런데 제가 하니까 Priview폼이 떠 버려서 그런건데요.. ...
    • 정정봉
      2004.11.12 23:32
      DBGridEh 컴포넌트를 쓰시면 해결될것 같네요. 예전에 자료실에서 다운받았는데 지금도 있는지는....
    • 김준연
    • 2004.11.12 22:37
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 오병주
      2004.11.12 23:34
      그러면 레코드를 이용하세요... TYPE   TTag= Record     id &nb...
    • 박찬
    • 2004.11.12 18:46
    • 6 COMMENTS
    • /
    • 0 LIKES
    • 손광현
      2004.11.12 19:13
    • 박찬
      2004.11.12 19:22
    • 손광현
      2004.11.12 19:44
    • 박찬
      2004.11.12 19:49
    • 손광현
      2004.11.12 19:51
    • 박찬
      2004.11.12 21:34
    • 황하성
    • 2004.11.12 18:41
    • 3 COMMENTS
    • /
    • 0 LIKES
    • 석주현
      2004.11.12 19:13
      뭐 이런 식으로하면 됩니다.. ^^ ///////////// procedure TForm2.Button1Click(Sender: TObject); ...
    • ㉳㉥ㅗ㉣ㅐ㉧ㅛ
      2004.11.12 18:54
      작성 하신 대로 해서 버그를 잡으면요 for i := MIN to MAX - 1  do .... 하면 ...
    • 황하성
      2004.11.12 19:00
      while not Table.Eof도 써봤는데... ^^; 그것도 무한루프로 빠지는지 동작을 안하더라구요.
    • 박원용
    • 2004.11.12 17:43
    • 3 COMMENTS
    • /
    • 0 LIKES
    • 오익환
      2004.11.12 19:07
      TObjectPrinter설치에 무슨 문제가 있는지 알려주시면 도와드릴 수 있을 것 같은데요.
    • 박원용
      2004.11.12 19:34
      objectprinterv7.pas 파일이 없다면서 에러가 납니다. ----------------
    • 오익환
      2004.11.12 22:24
      Component는 File속에 있는 RegOPrinter.exe로 설치 하여야 합니다. 설치후 TObjectPrinter자료실에 ...
    • 장영진
    • 2004.11.12 09:41
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 모영철
      2004.11.12 19:50
      네 할수 있습니다. 포인터를 쓰시는것도 괜찮을거 같은데요.. 전에 작업하다 이리저리 걸리는게 많아...
    • yskwon
    • 2004.11.12 02:32
    • 0 COMMENTS
    • /
    • 0 LIKES
    • 하얀까마귀
      2004.11.12 02:36
      안녕하세요 하얀까마귀입니다. 어찌 답변을 하라시는건지. ㅠㅠ 난감하군요. ^^ 일단 안되니까. 그...
    • ㉳㉥ㅗ㉣ㅐ㉧ㅛ
      2004.11.15 20:03
      코딩에 이상이 없습니다...로직상으로는 근데 QuickReport 자체가 생성이 안되여... 왜 그런지... ...
    • 하얀까마귀
      2004.11.17 11:07
      안녕하세요 하얀까마귀 입니다. ㅠㅠ  그냥 퀵이 생성이 안되다고만 하시면 원인을 알수가 없...
    • 석주현
      2004.11.17 17:45
      퀵리포트는 다른 폼처럼 보여지는게 아니라 디자인 타임에는 보이다가 런타임시에는 프린트나 아니면 ...
    • 강신구
    • 2004.11.12 01:14
    • 3 COMMENTS
    • /
    • 0 LIKES
    • 뚜까
      2004.11.12 01:41
      예전에 받아논건데 적당한거 골라서 쓰세요.... 엑셀 사용시 셀들을 복잡하게 제어해야할 때 필요한...
    • 강신구
      2004.11.12 02:06
      답변에 감사드립니다.. 그런데.. 셀형식을 텍스트로 지정하는 방법에 대해서는 없군요.. 아쉽습니다..
    • 작은호롱
      2004.11.12 02:26
      소스중에서 다음부분이 텍스트형식으로 지정하는 부분합니다. ===> Format := '@'; 즐프하세요...
    • 김성현
    • 2004.11.11 22:44
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 송기원
      2004.11.11 23:34
      ISAPI로 제작하시면 가능하고도 남습니다. DB연결은 ADO로 처리하시면 별도의 세션문제걱정은 안 하셔도 ...
    • 김종곤
    • 2004.11.11 22:30
    • 0 COMMENTS
    • /
    • 0 LIKES