아래와 같이 코딩을 해서 Query값을 엑셀파일로 전환하려고 하는데요..
XL.Range['A' + IntToStr(k+1), CHR(64 + FieldCount) + IntToStr(k+1)].Value := XArr;
이 부분에서 OLE error 800A03EC라는 에러 메세지가 떠요.. 왜 그런건지.. 답변좀 부탁합니다..
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls,
Forms, Dialogs, Grids, DBGrids, Db, DBTables, StdCtrls,
ComObj;
type
TForm1 = class(TForm)
Button1: TButton;
DataSource1: TDataSource;
Query1: TQuery;
DBGrid1: TDBGrid;
Button2: TButton;
Button3: TButton;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure FormShow(Sender: TObject);
procedure Button3Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
procedure excelConv(AQuery: TQuery);//엑셀변환 프로시져
implementation
{$R *.DFM}
procedure TForm1.Button1Click(Sender: TObject);
begin
with Query1 do begin
DatabaseName := 'DBDEMOS';
Close;
SQL.Clear;
SQL.Add('select * from Customer');
SQL.Add('order by CustNo');
Open; //엑셀로 변환할 데이타 오픈
end;
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
DataSource1.Enabled := False;
excelConv(Query1); //엑셀변환 프로시져 호출
DataSource1.Enabled := True;
end;
procedure TForm1.Button3Click(Sender: TObject);
begin
Close;
end;
procedure TForm1.FormShow(Sender: TObject);
begin
DataSource1.DataSet := Query1;
DBGrid1.DataSource := DataSource1;
end;
procedure excelConv(AQuery: TQuery);
var
XL, XArr, XTitle: Variant;
i, j, k: Integer;
begin
with AQuery do begin
//타이틀 처리변수
XTitle := VarArrayCreate([1, FieldCount], VarVariant);
//데이타 처리변수
XArr := VarArrayCreate([1, FieldCount], VarVariant);
try
//엑셀을 실행
XL := CreateOLEObject('excel.Application');
except
MessageDlg('excel이 설치되어 있지 않습니다.',
MtWarning, [mbok], 0);
Exit;
end;
XL.WorkBooks.Add; //새로운 페이지 생성
XL.Visible := True;
i := 1;
k := 1;
while i <= FieldCount do begin
XTitle[i] := Fields[i-1].FieldName;
Inc(i);
end;
//타이틀처리
XL.Range['A1', CHR(64 + FieldCount) + '1'].Value := XTitle;
First;
while Not EOF do begin
j := 1;
while j <= FieldCount do begin
if Fields[j-1].DataType = ftString then
XArr[j] := '''' + Fields[j-1].Value
else
XArr[j] := Fields[j-1].Value;
Inc(j);
end;
//셀에 값을 넣는다.
XL.Range['A' + IntToStr(k+1),
CHR(64 + FieldCount) + IntToStr(k+1)].Value := XArr;
Next;
Inc(k);
end;
//셀 크기 조정
XL.Range['A1', CHR(64 + FieldCount) + IntToStr(k)].Select;
XL.Selection.Columns.AutoFit;
XL.Range['A1', 'A1'].Select;
First;
end;
end;
이 소스에서는 엑셀의 영역을 잡고, 값을 대입하는군요.
저는 엑셀의 좌표에 바로 값을 대입하는데요 이렇게 해보셈.
ex) v.Cells[i+1,j].Value :=DBGrid1.Fields[j-1].DisplayText;