不得不问这个问题了: TExcelWorkBook.SaveAs 的问题(40分)

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

searoom

Unregistered / Unconfirmed
GUEST, unregistred user!
我使用 TExcelWorkBook 对象来讲我查询的数据导出到 excel 中

function DataSetToExcel(RecordSet:_RecordSet; bVisible:boolean;
filename:string; SheetName:string; bDBF:boolean):boolean;
var
FExcelBook: TExcelWorkBook;
FExcelSheet: TExcelWorkSheet;
FExcelApp: TExcelApplication;
begin
result:=true;

//建立对象
FExcelBook:=TExcelWorkBook.Create(nil);
FExcelSheet:=TExcelWorkSheet.Create(nil);
FExcelApp:=TExcelApplication.Create(nil);
try
FExcelApp.Visible[0] := bVisible;
try
FExcelBook.ConnectTo(FExcelApp.Workbooks.Add(EmptyParam, 0));
except
ErrMessage('连接到Excel文件出错,可能是没有安装Excel软件');
result:=false;
exit;
end;
//连接 ExceSheet 对象
if FExcelBook.Worksheets.Count<1 then
FExcelBook.WorkSheets.Add(EmptyParam, EmptyParam,EmptyParam, EmptyParam, 0);
FExcelSheet.ConnectTo(FExcelBook.Worksheets[1] as _WorkSheet);
//添加数据
with FExcelSheet.QueryTables.Add(Recordset, FExcelSheet.Range['A1', EmptyParam], EmptyParam) do
begin
FieldNames := true;
Refresh(False);
end;
//设置属性
with FExcelSheet do
begin
if SheetName<>'' then Name:=SheetName;
//Cells.Font.Size:=11;
end;
//保存文件
if not bVisible then
begin
FExcelBook.SaveCopyAs(filename);
FExcelBook.Close(False);
if bDBF then
begin
RenameFile(filename,filename+'._tmp_');
DeleteFile(filename);
ExcelToDBF(filename+'._tmp_',filename);
DeleteFile(filename+'._tmp_');
end;
end;
finally
FExcelSheet.Disconnect;
FExcelBook.Disconnect;
FExcelApp.Disconnect;
FExcelSheet.Free;
FExcelBook.Free;
FExcelApp.Free;
end;
end;

我想直接通过该 函数将查询到的结果保存为 dbf 文件,注意看下面的代码:
if not bVisible then
begin
FExcelBook.SaveCopyAs(filename);
FExcelBook.Close(False);
if bDBF then
begin
RenameFile(filename,filename+'._tmp_');
DeleteFile(filename);
ExcelToDBF(filename+'._tmp_',filename);
DeleteFile(filename+'._tmp_');
end;
end;
上面这段代码我使用变通的方法,是先将结果保存为 .xls 文件,然后再将 xls 文件转换为 dbf 文件,转换函数如下:
procedure ExcelToDBF(xlsFile:string; dbfFile:string);
var
ExcelApp: Variant;
begin
ExcelApp := CreateOleObject( 'Excel.Application' );
ExcelApp.visible:=false;
ExcelApp.workbooks.open(xlsFile);
ExcelApp.ActiveWorkbook.SaveAs (Filename:=dbfFile, FileFormat:=xlDBF4, CreateBackup:=False);
ExcelApp.ActiveWorkbook.Saved:=true;
ExcelApp.workbooks.Close;
ExcelApp.Quit;
ExcelApp:=unassigned;
end;
------------------------
所以,如果大家注意的话,我这样做确实是能够实现我的目的,
但也很明显的是多做了一步,浪费

现在有个矛盾的问题就是:
1. 我需要使用 TExcelWorkBook、TExcelWorkSheet 对象来快速的将 _RecordSet 的数据杜如到 ExcelWorkSheet 中,可是 TExcelWorkBook.SaveAs 的方法怎么使用都不对
2. 使用CreateOleObject('Excel.Application') 来建立的对象可以使用 SaveAs 方法,可是又不能使用 FExcelSheet.QueryTables.Add 方法来快速地导入数据

所以就像问问大家,有没有好一点的办法
 
哇,竟然没人理会哦
 
后退
顶部