안녕하세요... 6108번의 질문을 올린 사람입니다... 그 문제는 해결했구요...
근데 문제가 발생했습니다.
1) 자료가 몇 십건 정도를 되는 걸 엑셀로 옮기면 별 문제가 없는데, 한 3000건 정도 되는 것을 옮겼더니 Invalid Variant Type Conversion이라는 에러가 발생하네요...
2) 그리구, 엑셀로 보여줄 때 내부적으로 엑셀을 완벽하게 만들어서 한꺼번에 보여지는 것 같아요. 저는 배치되는 순서대로 그냥 보여졌으면 좋겠는데... 그니까 에러가 나면 에러가 나는 곳까지는 보여졌으면 좋겠는데 한꺼번에 보여주는 체계이다 보니깐 중간에 에러가 나도 아예 하나도 볼 수 없는 거죠...
그럼, 소스를 올립니다... 부탁드립니다...
procedure ExcelExport(DBGrid: TDBGrid; strItemKindName: String);
var
XL, XArr, XTitle : Variant;
i, j, k: Integer;
Cnt : Integer;
strItemKind : String;
begin
Screen.Cursor := crHourGlass;
Cnt := 1;
XTitle := VarArrayCreate([1, DBGrid.FieldCount], VarVariant); //타이틀 처리변수
XArr := VarArrayCreate([1, DBGrid.FieldCount], VarVariant);
try
XL := CreateOLEObject('Excel.Application'); //엑셀을 실행
except
MessageDlg('Excel이 설치되어 있지 않습니다.', MtWarning, [mbok], 0);
Exit;
end;
XL.WorkBooks.Add; //새로운 페이지 생성
i := 1;
k := 1;
while i <= DBGrid.FieldCount do begin
XTitle[i] := DBGrid.Columns.Items[i-1].Title.Caption;
Inc(i);
end;
ShowMessage('aaa');
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;
ShowMessage('bbb');
DBGrid.DataSource.DataSet.First;
try
DBGrid.DataSource.DataSet.DisableControls;
for i := 0 to DBGrid.DataSource.DataSet.RecordCount - 1 do begin
for j := 0 to DBGrid.FieldCount - 1 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;
strItemKind := DBGrid.DataSource.DataSet.FieldByName(strItemKindName).AsString;
DBGrid.DataSource.DataSet.Next;
if strItemKind = '1' then
XL.Range['A' + IntToStr(k+1), CHR(64 + DBGrid.FieldCount) + IntToStr(k+1)].Font.Color := ClBlack
else if strItemKind = '2' then
XL.Range['A' + IntToStr(k+1), CHR(64 + DBGrid.FieldCount) + IntToStr(k+1)].Font.Color := ClRed
else if strItemKind = '3' then
XL.Range['A' + IntToStr(k+1), CHR(64 + DBGrid.FieldCount) + IntToStr(k+1)].Font.Color := ClBlue
else if strItemKind = '4' then
XL.Range['A' + IntToStr(k+1), CHR(64 + DBGrid.FieldCount) + IntToStr(k+1)].Font.Color := ClBlue
else
XL.Range['A' + IntToStr(k+1), CHR(64 + DBGrid.FieldCount) + IntToStr(k+1)].Font.Color := ClBlack;
Inc(Cnt);
Inc(k);
end;
finally
DBGrid.DataSource.DataSet.EnableControls;
end;
ShowMessage('ccc');
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;
3천건이라 해서 에러가 난건 아닌것 같습니다..
데이타 중에 어떤 값이 문제가 있는것 같습니다.
XArr[j+1] := '''' + DBGrid.Fields[j].AsVariant;
이곳에서 문제가 발생하지 않나 싶습니다...
저문장 전에 값을 넣어두고 어떤 레코드에서 에러가 나는지 확인을 하시면
될거 같구요..
두번째 질문은.... 글