从Sqlserver导出数据到Excel(100分)

  • 主题发起人 主题发起人
  • 开始时间 开始时间

Unregistered / Unconfirmed
GUEST, unregistred user!
我的方法是:
利用Sqlserver的DTS包先实现导出数据到Excel,
然后把包保存成VB格式的文件,
再翻译成Delphi。
现在的问题是Excel表创建出来了,但是没有数据。
请大家帮帮忙。
 
没人知道吗
 
导出过程中,没有提示,详细点?
 
可以搜索以前的帖子,代码很多。
我有一个控件可以直接将数据转换成excel和html,感觉还比较好用,要不要
 
你是不是只用导出数据就可以了?
如果是这样的话,建议使用ExpressQuantumgrid Grid ,里面有这个功能,自己看一下例子
 
直接用DELPHI不行吗,先用QUERY取出数据然后用DELPHI控件导出到EXCEL中。
 
两个私有变量,四个过程
goPackageOld:Package;
goPackage:Package2;
procedure createpackage();
procedure task_Sub1(var goPackage:_Package2);
procedure oCustomTask1_Trans_Sub1(var oCustomTask1:DataPumpTask2);
procedure oCustomTask1_Trans_Sub2(var oCustomTask1:DataPumpTask2);
具体代码如下:(改写过的)
1、procedure TForm1.createpackage();
var oConnection:Connection2;
oStep:Step2;
begin
goPackageOld:=coPackage.Create;
goPackage := goPackageOld as _Package2;
goPackage.Name := 'tmp';
goPackage.WriteCompletionStatusToNTEventLog := False;
......
goPackage.PackageType := 0;

oConnection := goPackage.Connections.New('Microsoft.Jet.OLEDB.4.0') as connection2;

oConnection.ConnectionProperties.Item('User ID').Value := 'Admin';
oConnection.ConnectionProperties.Item('Data Source').value := 'E:/DTS/tmp.xls';
oConnection.ConnectionProperties.item('Extended Properties').value := 'Excel 8.0;HDR=YES;';
oConnection.Name := 'Microsoft Excel 97-2000';
oConnection.ID := 1;
oConnection.Reusable := True;
oConnection.ConnectImmediate := False;
oConnection.DataSource := 'E:/DTS/tmp.xls';
oConnection.UserID := 'Admin';
oConnection.ConnectionTimeout := 60;
oConnection.UseTrustedConnection := False;
oConnection.UseDSL := False;

goPackage.Connections.Add(oConnection as connection);
oConnection := Nil;
oConnection := goPackage.Connections.New('MSDASQL') as connection2;
oConnection.ConnectionProperties.Item('Persist Security Info').Value := True;
oConnection.ConnectionProperties.Item('User ID').Value := 'siuser';
oConnection.ConnectionProperties.Item('Password').Value := 'siuser';
oConnection.ConnectionProperties.Item('Data Source').Value := 'SIDB';

oConnection.Name := 'IBM DB2 ODBC DRIVER';
oConnection.ID := 2;
oConnection.Reusable := True;
oConnection.ConnectImmediate := False;
oConnection.DataSource := 'SIDB';
oConnection.UserID := 'siuser';
oConnection.Password := 'siuser';
oConnection.ConnectionTimeout := 60;
oConnection.UseTrustedConnection := False;
oConnection.UseDSL := False;

goPackage.Connections.Add(oConnection as connection);
oConnection := Nil;
oStep := goPackage.Steps.New as step2;

oStep.Name := 'DTSStep_DTSDataPumpTask_1';
oStep.Description := 'data out';
oStep.ExecutionStatus := 4;
oStep.TaskName := 'DTSTask_DTSDataPumpTask_1';
oStep.CommitSuccess := False;
oStep.RollbackFailure := False;
oStep.ScriptLanguage := 'VBScript';
oStep.AddGlobalVariables := True;
oStep.RelativePriority := 3;
oStep.CloseConnection := True;
oStep.ExecuteInMainThread := False;
oStep.IsPackageDSORowset := False;
oStep.JoinTransactionIfPresent := False;
oStep.DisableStep := False;
oStep.FailPackageOnError := False;
goPackage.Steps.Add(oStep);
oStep := nil;
Task_Sub1(goPackage);
goPackage.Execute;
goPackage.Uninitialize;
goPackage := Nil;
goPackageOld := Nil
End;
2、procedure tform1.task_Sub1(var goPackage:_Package2);
var oTask:Task;
oCustomTask1:DataPumpTask2;
begin
oTask := goPackage.Tasks.New('DTSDataPumpTask');
oCustomTask1 := oTask.CustomTask as datapumptask2;
oCustomTask1.Name := 'DTSTask_DTSDataPumpTask_1';
oCustomTask1.Description := 'data out';
oCustomTask1.SourceConnectionID := 2;
oCustomTask1.SourceObjectName := '"SIUSER"."CLASSAREAINFO"';
oCustomTask1.DestinationConnectionID := 1;
oCustomTask1.DestinationObjectName := 'CLASSAREAINFO';
oCustomTask1.ProgressRowCount := 1000;
oCustomTask1.MaximumErrorCount := 0;
oCustomTask1.FetchBufferSize := 1;
oCustomTask1.UseFastLoad := True;
oCustomTask1.InsertCommitSize := 0;
oCustomTask1.ExceptionFileColumnDelimiter := '|';
oCustomTask1.ExceptionFileRowDelimiter := #13#10;
oCustomTask1.AllowIdentityInserts := False;
oCustomTask1.FirstRow := '0';
oCustomTask1.LastRow := '0';
oCustomTask1.FastLoadOptions := 2;
oCustomTask1.ExceptionFileOptions := 1;
oCustomTask1.DataPumpOptions := 0;

oCustomTask1_Trans_Sub1( oCustomTask1 );
oCustomTask1_Trans_Sub2( oCustomTask1 );
goPackage.Tasks.Add(oTask);
oCustomTask1 := Nil;
oTask := Nil
End;
3、procedure tform1.oCustomTask1_Trans_Sub1(var oCustomTask1:DataPumpTask2);
var oTransformation:Transformation2;
oTransProps:Properties;
oColumn:Column;
begin
oTransformation := oCustomTask1.Transformations.New('DTS.DataPumpTransformCopy') as transformation2;
oTransformation.Name := 'DTSTransformation__1';
oTransformation.TransformFlags := 63;
oTransformation.ForceSourceBlobsBuffered := 0;
oTransformation.ForceBlobsInMemory := False;
oTransformation.InMemoryBlobSize := 1048576;
oTransformation.TransformPhases := 4;

oColumn := oTransformation.SourceColumns.New('AREACODE' , 1);
oColumn.Name := 'AREACODE';
oColumn.Ordinal := 1;
.....
oColumn.Nullable := False;

oTransformation.SourceColumns.Add(oColumn);
oColumn := Nil;
oColumn := oTransformation.DestinationColumns.New('AREACODE' , 1);
oColumn.Name := 'AREACODE';
oColumn.Ordinal := 1;
oColumn.Flags := 102;
oColumn.Size := 255;
oColumn.DataType := 130;
oColumn.Precision := 0;
oColumn.NumericScale := 0;
oColumn.Nullable := True;
oTransformation.DestinationColumns.Add(oColumn);
oColumn := Nil;
oTransProps := oTransformation.TransformServerProperties;
oTransProps := Nil;
oCustomTask1.Transformations.Add(oTransformation);
oTransformation := Nil;
End;
4、procedure tform1.oCustomTask1_Trans_Sub2(var oCustomTask1:DataPumpTask2);
var oTransformation:Transformation2;
oTransProps:Properties;
oColumn:Column;
begin
oTransformation := oCustomTask1.Transformations.New('DTS.DataPumpTransformCopy') as Transformation2;
oTransformation.Name := 'DTSTransformation__2';
oTransformation.TransformFlags := 63;
oTransformation.ForceSourceBlobsBuffered := 0;
oTransformation.ForceBlobsInMemory := False;
oTransformation.InMemoryBlobSize := 1048576;
oTransformation.TransformPhases := 4;

oColumn := oTransformation.SourceColumns.New('AREANAME' , 1);
oColumn.Name := 'AREANAME';
oColumn.Ordinal := 1;
oColumn.Flags := 8;
oColumn.Size := 40;
oColumn.DataType := 129;
oColumn.Precision := 0;
oColumn.NumericScale := 0;
oColumn.Nullable := False;

oTransformation.SourceColumns.Add(oColumn);
oColumn := nil;

oColumn := oTransformation.DestinationColumns.New('AREANAME' , 1);
oColumn.Name := 'AREANAME';
......
oColumn.Nullable := True;

oTransformation.DestinationColumns.Add(oColumn);
oColumn := nil;
oTransProps := oTransformation.TransformServerProperties;
oTransProps := nil;
oCustomTask1.Transformations.Add(oTransformation);
oTransformation := nil;
End;
 
我的数据量很大,又要考虑到机子的性能,所以想来想去就用这个办法了。
 
你直接用sql的导入导出工具不就可以了?
 
uses comobj;

过程
var exc:variant;
i,j:integer;
begin
exc:=CreateOleObject('Excel.Application');
exc.Visible:=True;
exc.WorkBooks.Add;
exc.WorkSheets[1].Activate;
exc.Cells[1,4].Value:='导出的数据';
for j:=1 to Table1.FieldCount do
begin
exc.Cells[2,j]:=Table1.Fields[j-1].FieldName;
end;
i:=3;
while not Table1.Eof do
begin
for j:=1 to Table1.FieldCount do
exc.Cells[i,j]:=Table1.Fields[j-1].AsString;
i:=i+1;
Table1.Next;
end;
end;
这是我导出数据到Excel时的代码、
 
这么费力干什么啊。用EXCEL的功能就能实现的:
1、创建ODBC数据源,指向你的SQL SERVER数据库。
2、打开EXCEL,选择“数据->获取外部数据->新建数据库查询”,找到你的ODBC数据源,
然后再导入你要导出的表就行了。
 
这要交给用户的,你不可能让用户来操作数据库吧
 
未何不用第三方的导出控件,速度很快!!![8D]
 
方案1:第三方控件(aExcel,ExpressQuantumgrid Grid)
方案2: 采用模拟键盘输入的办法,在后台进行
 
方法1可能速度有问题。
方法2我不明白
 
关键是记录很多,用DTS方法可以提高速度。睛的方法是好的。
用OLE方式的速度成问题。

你把包保存为VB格式的文件,那么那个VB格式的程序是否可以正常运行?
如果可以正常的话,你有一条最后的退路:在DELPHI程序中调动外部程序(那个VB的)
有了最后的退路,再把那个VB的代码和你翻译的DELPHI代码贴出来让大家看看。
如果能找出错误,就OK啦

如果那个VB的程序也无法正常的话。。。那岂不是。。。。呵呵。你怎么不上QQ啊?
 
其实如果对格式要求不多就直接写到一个文本文件中, 后坠名存成excel的就可以了
 
我已经解决了,谢谢大家
 
后退
顶部