안년하십니까 고수님들 ....
아래 소스는 김영대님의 excelexport 컴포넌트의 소스인데요..
많은양의 data를 export 하면 down되는데 원인을 알수가 없군요...
os 문제인지 메모리 할당문제인지.....(windows 2000에서는 잘되구요)
해결방법좀 알려 주세요..(원인파악2주째 입니다)ㅠㅠㅠ
고수님들 부탁드립니다..
unit GridXLS;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs ,
DBTables, DBGrids, Gauges, Db {$ifdef VER90} ,OLEAuto {$else} , ComObj, OleCtrls {$endif};
type
TGridXLS = class(TComponent)
private
ExcelIns: Variant;
FDBGrid: TDBGrid; {XLS파일로 출력할 DBGrid}
FFileName: string; {XLS 파일명}
FAddTitle: Boolean; {XLS 파일에 필드의 Title을 넣을건지 ?}
FExcelCreated: Boolean; {Excel instance 의 생성 여부}
FGauge: TGauge; {XLS 파일로 만드는 동안 Guage로 진행을 보여줄때 사용}
procedure CreateExcelInstance;
procedure QuitExcelInstance;
protected
public
constructor Create (AOwner: TComponent); override;
destructor Destroy; override;
procedure ExportToExcel;
published
property DBGrid: TDBGrid read FDBGrid write FDBGrid;
property FileName: String read FFileName write FFileName;
property AddTitle: Boolean read FAddTitle write FAddTitle;
property Gauge: TGauge read FGauge write FGauge;
end;
procedure Register;
implementation
constructor TGridXLS.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
FDBGrid := nil;
FFileName := 'exportXLS.xls'; {초기: 파일명}
FAddTitle := True; {초기: XLS 파일에 필드의 Title을 넣음}
FExcelCreated := False;
FGauge := nil; {초기: Gauge 사용안함}
end;
destructor TGridXLS.Destroy;
begin
inherited Destroy;
end;
{Excel instance 생성}
procedure TGridXLS.CreateExcelInstance;
begin
FExcelCreated := False;
try
ExcelIns := CreateOLEObject('Excel.Application'); FExcelCreated := True;
except
FExcelCreated := False; {생성여부는 IsCreated 함수로 알 수 있다}
end;
if FExcelCreated = True then
begin
ExcelIns.WorkBooks.Add;
ExcelIns.DisplayAlerts := False;
end;
end;
procedure TGridXLS.ExportToExcel;
var
Cnt, CurLine, CurColumn: Integer;
CurMark: TBookmark;
FieldValue: Variant; {cell = field}
begin
if not Assigned(FDBGrid) then
begin
MessageDlg('DBGrid 프로퍼티가 설정되어 있지 않습니다.', mtError, [mbOk], 0);
Exit;
end;
if FDBGrid.DataSource.DataSet.Active = False then
begin
MessageDlg('DBGrid의 DataSet이 Open되어 있지 않습니다.', mtError, [mbOk], 0);
Exit;
end;
{Excel instance 생성}
CreateExcelInstance;
if FExcelCreated = False then
begin
MessageDlg('현재 PC는 Excel을 사용할 수 없는 상태입니다.', mtError, [mbOk], 0);
Exit;
end;
Cnt := 0;
CurLine := 0;
try
if FAddTitle then {XLS 파일에 필드의 Title을 넣는다}
begin
with FDBGrid.Columns do
for CurColumn := 0 to Count-1 do
ExcelIns.ActiveSheet.Cells[1, CurColumn+1].Value :=
Items[CurColumn].Title.Caption;
CurLine := 2; // Title은 첫번째 행에 자료는 2번째 행부터 출력
end
else
begin
CurLine := 1;
end;
with FDBGrid.DataSource.DataSet do
begin
DisableControls; {data-aware 컴포넌트들의 화면출력을 disable시킨다}
CurMark := GetBookmark; {현재 레코드 포인터 저장}
First;
while not EOF do
begin
for CurColumn := 0 to FDBGrid.Columns.Count-1 do
begin
FieldValue := FDBGrid.Columns[CurColumn].Field.Value; {필드값}
ExcelIns.ActiveSheet.Cells[CurLine, CurColumn+1].Value := FieldValue;
end;
Next;
Inc(CurLine);
Inc(Cnt);
if Assigned(FGauge) then {Guage를 사용할 때}
FGauge.Progress := (Cnt * 100) div FDBGrid.DataSource.DataSet.RecordCount;
Application.ProcessMessages;
end;
GotoBookmark(CurMark);
EnableControls;
end;
ExcelIns.ActiveWorkBook.SaveAs(FFileName); {파일로 저장}
finally
QuitExcelInstance; {Excel instance 해제}
end;
end;
procedure TGridXLS.QuitExcelInstance;
begin
if not FExcelCreated then
exit;
if not VarIsEmpty(ExcelIns) then
ExcelIns.Quit;
end;
procedure Register;
begin
RegisterComponents('Samples', [TGridXLS]);
end;
end.
고수님들의 의견이라도...