안녕하세요...
DB 그리드의 결과를 Excel로 보려고 하는데 자꾸만 에러가 납니다...
Variant array index out of bounds에러가 나는데 왜 나는지를 모르겠어요...
소스는 다음과 같습니다... 좀 봐주세요... 에러가 나는 걸루 추정되는 부분은 소스 중간에 주석으로 표시해 놓았습니다. 그럼, 즐거운 하루 보내시구요...
멋진 해결책을 기다리겠습니다...
procedure ExcelExport(DBGrid: TDBGrid);
var
XL, XArr, XTitle : Variant;
i, j, k: Integer;
Cnt : Integer;
iFieldCount : Integer;
begin
Screen.Cursor := crHourGlass;
Cnt := 1;
XTitle := VarArrayCreate([1, DBGrid.FieldCount], VarVariant); //타이틀 처리변수
XArr := VarArrayCreate([1, DBGrid.DataSource.DataSet.RecordCount], VarVariant); //데이타 처리변수
try
XL := CreateOLEObject('Excel.Application'); //엑셀을 실행
except
MessageDlg('Excel이 설치되어 있지 않습니다.', MtWarning, [mbok], 0);
Exit;
end;
XL.WorkBooks.Add; //새로운 페이지 생성
i := 1;
k := 1;
iFieldCount := DBGrid.FieldCount;
while i <= iFieldCount do begin
XTitle[i] := DBGrid.Columns.Items[i-1].Title.Caption;
Inc(i);
end;
XL.Range['A1', CHR(64 + DBGrid.FieldCount) + '1'].Value := XTitle; //타이틀처리
XL.Range['A1', CHR(64 + DBGrid.FieldCount) + '1'].Font.Bold := True;
XL.Range['A1', CHR(64 + DBGrid.FieldCount) + '1'].Interior.Color := ClYellow;
XL.Range['A1', CHR(64 + DBGrid.FieldCount) + '1'].Borders.Color := ClBlack;
DBGrid.DataSource.DataSet.First;
Try
DBGrid.DataSource.DataSet.DisableControls;
for i := 0 to DBGrid.DataSource.DataSet.RecordCount - 1 do begin
//바로 이 for문에서 에러가 나는 것 같습니다...
for j := 1 to iFieldCount do begin
if DBGrid.Fields[j].DataType = ftString then begin
XArr[j+1] := '''' + DBGrid.Fields[j].AsVariant;
end
else if DBGrid.Fields[j].DataType = ftFloat then begin
XArr[j+1] := FormatFloat('#,##0', DBGrid.Fields[j].AsVariant);
end
else begin
XArr[j+1] := DBGrid.Fields[j].AsVariant;
end;
end;
XL.Range['A' + IntToStr(k+1), CHR(64 + DBGrid.FieldCount) + IntToStr(k+1)].Value := XArr;
DBGrid.DataSource.DataSet.Next;
Inc(Cnt);
Inc(k);
end;
Finally
DBGrid.DataSource.DataSet.EnableControls;
end;
DBGrid.DataSource.DataSet.First;
//셀 크기 조정
XL.Range['A1', CHR(64 + DBGrid.FieldCount) + IntToStr(k)].Font.Size := 9;
XL.Range['A1', CHR(64 + DBGrid.FieldCount) + IntToStr(k)].Font.Name := 'Times New Roman';
XL.Range['A1', CHR(64 + DBGrid.FieldCount) + IntToStr(k)].Borders.Color := ClBlack;
XL.Range['A1', CHR(64 + DBGrid.FieldCount) + IntToStr(k)].Select;
XL.Selection.Columns.AutoFit;
Screen.Cursor := crDefault;
XL.Visible := true ;
XL.DisplayAlerts := true ;
XL.Range['A1', 'A1'].Select;
end;