아래 두 군대에서 에러가 나네요
XL.Range['A1', CHR(64 + nFieldCnt) + '1'].Value := XTitle;
XL.Range['A' + IntToStr(k+1), CHR(64 + nFieldCnt) + IntToStr(k+1)].Value := XArr;
OLE 에러가요
이런 경우에 uses comobj를 추가하면 된다는 글이 있던데
추가했는데도 똑같은 OLE에러가 나는데
어떻게 해야하나요?
잘 되는 다른 것들 소스를 보면 똑같은데 왜 이것만 안되는지...
고수님들 능력을 보여주세요~~~
----------------
procedure TGroupRFrm.ExcelConv(cTitle:String);
var
XL, XArr, XTitle : Variant;
i,j, k : Integer;
title : string;
nFieldCnt : integer;
begin
// nFieldCnt := StringGrid1.ColCount;
nFieldCnt := StoreQuery.FieldCount ;
with DBGrid1 do begin
//타이틀 처리변수
XTitle := VarArrayCreate([1,nFieldCnt], VarVariant);
//데이타 처리변수
XArr := VarArrayCreate([1, nFieldCnt], VarVariant);
try
XL := GetActiveOLEObject('Excel.Application');
except
on E: EOleSysError do begin
try
XL := CreateOLEObject('Excel.Application'); //엑셀을 실행
except
MessageDlg('Excel이 설치되어 있지 않습니다.', MtWarning, [mbok], 0);
Exit;
end;
end;
end;
title := cTitle;
XL.WorkBooks.Add; //새로운 페이지 생성
XL.WorkSheets[1].Name := Title;
XL.Visible := False;
k := 1;
for i := 1 to nFieldCnt do begin
// XTitle[i] := Cells[i-1,0];
XTitle[i] := StoreQuery.Fields[i-1].FieldName;
end;
//타이틀처리
XL.Range['A1', CHR(64 + nFieldCnt) + '1'].Value := XTitle;
try
StoreQuery.First;
i := 0;
while i < StoreQuery.RecordCount do begin
j := 1;
while j <= nFieldCnt do begin
if StoreQuery.Fields[j-1].DataType = ftString then
XArr[j] := '''' + StoreQuery.Fields[j-1].Value
else
XArr[j] := StoreQuery.Fields[j-1].Value;
Inc(j);
end;
//셀에 값을 넣는다.
XL.Range['A' + IntToStr(k+1), CHR(64 + nFieldCnt) + IntToStr(k+1)].Value := XArr;
StoreQuery.Next;
Inc(k);
end;
//셀 크기 조정
XL.Range['A1', CHR(64 + nFieldCnt) + IntToStr(k)].Select;
XL.Selection.Columns.AutoFit;
XL.Range['A1', 'A1'].Select;
finally
XL.Visible := True;
XL := UnAssigned; // 엑셀 프로세스에서 할당 해제
end;
end;
end;
컬럼의 순서가 A,B,C...Z,AA,AB.. 이런식으로 되므로 필드의 갯수에 따라 만들어주셔야 합니다.
저는 이렇게 해결했습니다.
function IntToCellName(const Number:integer):string;
var
share,remainder:integer;
begin
if (Number<=0)or(Number>256) then begin
result:='';
MessageDlg('숫자가 범위를 초과하였습니다.'#13'범위는 0<숫자<=256 입니다.',mtError,[mbOK],0);
exit
end;
if Number<=26 then
Result:=chr(Number+64)
else begin
share:=Number div 26;
Remainder:=Number mod 26;
if Remainder=0 then
result:=chr(share+64-1)+'Z'
else
result:=chr(share+64)+chr(Remainder+64);
end;
end;