function DBTypeToADOType(AValue: TFieldType): Integer;
begin
case AValue of
ftSmallint,
ftWord,
ftLargeint,
ftInteger: result := adInteger;
ftBoolean: result := adBoolean;
ftFloat: result := adSingle;
ftCurrency: result := adCurrency;
else
result := adVarWChar;
end;
end;
function GetTempFileName: string;
begin
Result := GetApplicationPath + TEMP_DB_FILE;
if FileExists(Result) then
DeleteFile(Result);
end;
constructor TDataSetToExcel.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
Initialize;
end;
destructor TDataSetToExcel.Destroy;
begin
Finalize;
inherited;
end;
FADOQuery.Connection := FADOConnect;
FADOTable.Connection := FADOConnect;
CoInitialize(nil);
end;
procedure TDataSetToExcel.Finalize;
begin
if Assigned(FADOQuery) then
FADOQuery.Free;
if Assigned(FADOTable) then
FADOTable.Free;
if Assigned(FADOConnect) then
FADOConnect.Free;
CoUninitialize;
GetTempFileName;
end;
procedure TDataSetToExcel.SaveExcelToFile(AFileName: string; ASheetName: string = 'Sheet1');
const
S_CONNECT_ACCESS = 'Provider=Microsoft.Jet.OLEDB.4.0;Data Source="%s"'; //Data Source中要有空格,""不能丢
S_CONNECT_EXCEL = 'Select * Into %s IN "%s" "Excel 8.0;" From t_temp';
var
LCatalog,LTable:OleVariant;
LConnStr:WideString;
i,ARecCount: integer;
LFileName: string;
begin
if (FDataSet = nil) or (FDataSet.FieldCount < 1) then
Exit;
ARecCount := FDataSet.FieldCount - 1;
if ARecCount <= 0 then
Exit;
LCatalog.Create(LConnStr);
LTable.Name := TEMP_TABLE_NAME;
try
for i := 0 to ARecCount do
LTable.Columns.Append(FDataSet.FieldDefList.FieldDefs[i].Name,
DBTypeToADOType(FDataSet.FieldDefList.FieldDefs[i].DataType));
LCatalog.Tables.Append(LTable);
FADOTable.TableName := TEMP_TABLE_NAME;
FADOTable.Open;
FDataSet.First;
FADOTable.First;
repeat
FADOTable.Insert;
for i := 0 to ARecCount do
FADOTable.Fields[i].AsString := VarToStrDef(FDataSet.Fields[i].Value, '');
FDataSet.Next;
until FDataSet.Eof;
procedure TDataSetToExcel.FSetDataSet(AValue: TDataSet);
begin
FDataSet := AValue;
if FDataSet <> nil then
FDataSet.FreeNotification(self);
end;
procedure TDataSetToExcel.Notification(AComponent: TComponent;Operation: TOperation);
begin
if (Operation = opRemove) and (AComponent = DataSet) then
DataSet := nil;
end;