DBGRID导出到EXCEL的问题 (50分)

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

sing_cee

Unregistered / Unconfirmed
GUEST, unregistred user!
use excel97 (excel2000也不行),OleServer;
..
..
procedure TForm1.BitBtn6Click(Sender: TObject);
var
ModuleName:string; //Excel 模板文件名 *.Xlt
FileName: String ;
Col,Row : Integer;
ExlApp : TExcelApplication ;
ExlBook : TExcelWorkBook ;
ExlSheet : TExcelWorkSheet ;
i, j : Integer ;
temp1, temp2 : OleVariant ;
Begin
if ADOQuery1.Active and (ADOQuery1.RecordCount < 500) then //大于500不导出
begin
nocan:= savedialog1.Execute; //判断SAVEDIALOG是否为取消
if (saveDialog1.FileName <> '') and nocan then
begin
FileName:=saveDialog1.FileName;
row:=1;
col:=1;
ModuleName := extractfilepath(paramstr(0))+'/图书报表模板.xls';
If FileExists(ModuleName)= False Then // 判断指定的模板文件是否存在
begin
ShowMessage( 'EXCEL模板文件: '+ ModuleName + ' 不存在! 请重新安装程序!' ) ;
Exit ;
end ;
// 创建 Excel 服务器控件
ExlApp := TExcelApplication.Create(nil);
ExlBook := TExcelWorkBook.Create (nil);
ExlSheet := TExcelWorkSheet.Create (nil) ;

// 连接 Excel 服务器
Try
ExlApp.Connect ;
Except
ShowMessage ('连接失败,可能你没有安装Excle') ;
Abort ;
End ;

// 从指定的模板文件*.xlt 新建一 Excel 文档
temp1 := ModuleName ; temp2 := 1 ;
ExlApp.Workbooks.Add( temp1, temp2) ;
ExlBook.ConnectTo(ExlApp.Workbooks[1] );
ExlSheet.ConnectTo(ExlBook.Worksheets[1] As _WorkSheet ); // 把 TDBGrid 的数据导入 Excel 中
ADOQuery1.First;
i := Row ;
sb1.SimpleText :=' 信息: 正在把查询结果写入到EXCEL文件中,需要时间 请勿中断! 请稍侯...... ';
While Not(DBGrid1.DataSource.DataSet.Eof) Do
Begin
For j:=Col To DBGrid1.FieldCount+ Col-1 Do
ExlSheet.Cells.Item[i+1,j]:= DBGrid1.Fields[j-col].AsString ; //+1保留列标题
DBGrid1.DataSource.DataSet.Next ;
i := i+1 ;
End ;

// 保存到 指定的文件
FileName := Trim(FileName) ;
IF FileExists(FileName) Then
DeleteFile(FileName) ;
ExlSheet.SaveAs(FileName);

// 关闭 Excel 服务器
ExlApp.Disconnect ;
ExlApp.Quit ;
ExlApp.Free;
ExlBook.Free;
ExlSheet.Free;
sb1.SimpleText :=' 信息: 数据导入完毕! 保存在你的 '+FileName+'.xls 文件中,请查看! '
End;
end;
end;

这是把DBGRID的数据导出到按模板文件创建的EXCEL文件中,在装OFFICE2000/XP的机器上都能正常编译执行,但是在
安装OFFICE97的机器上执行或编译后执行时都报告‘格式太旧,或类型无效’ 换USE EXCEL97 加COMOBJ也一样。
出错在ExlApp.Workbooks.Add( temp1, temp2) ;
ExlBook.ConnectTo(ExlApp.Workbooks[1] );
这一处 WHY?
 
搞个dbf或txt做中间转换,就不用那么麻烦了
 
要保留模板文件的一些信息,这是最好的办法了,如果直接产生文件就用ADO了,
我想问题出在EXCEL97和 OLESERVER上了吧 那位高手请指点以下
 
你的办法太麻烦的,当然容易出错了
其实你可以手动地导出Excel文件,只要做到以下几点:
1. 每个记录单独占一行。
2. 每个记录中的数据项用双引号括起来,如果数据中带有双引号则在双引号前在加个双引号。
3. 各个数据项间用逗号分隔。
例如:
"221","162","日志1","1"
"222","184","日志2","1"

希望上面的信息对你有所帮助
 
我做这个功能时是这样的,或许没有版本限制
var
XLApp: Variant;
Sheet: Variant;
begin
Screen.Cursor := crHourGlass;
if not VarIsEmpty(XLApp) then
begin
XLApp.DisplayAlerts := False;
XLApp.Quit;
VarClear(XLApp);
end;
{*********************创建OLE对象***************************}
try
XLApp := CreateOleObject('Excel.Application');
except
Screen.Cursor := crDefault;
Exit;
end;
XLApp.WorkBooks.Add;
//以下省略,你应该和你的类似
end;
 
谢谢!
//关键部分是,我认为这是最简单的方法
ExlApp.Workbooks.Add( temp1, temp2) ;
ExlBook.ConnectTo(ExlApp.Workbooks[1] );
ExlSheet.ConnectTo(ExlBook.Worksheets[1] As _WorkSheet ); // 把 TDBGrid 的数据导入 Excel 中
ADOQuery1.First;
i := Row ;
//下面是不会有错误的
While Not(DBGrid1.DataSource.DataSet.Eof) Do
Begin
For j:=Col To DBGrid1.FieldCount+ Col-1 Do
ExlSheet.Cells.Item[i+1,j]:= DBGrid1.Fields[j-col].AsString ; //+1保留列标题
DBGrid1.DataSource.DataSet.Next ;
i := i+1 ;
End ;
 
谢谢pandababy的意见,我已经将这个处理改写,现在不存在97和2000的问题了。
这是一个完全独立的把ADOQUERY为源DBGRID导出到固定模板EXCEL文件的程序。
procedure TForm1.BitBtn6Click(Sender: TObject);
var
ModuleName:string; //Excel 模板文件名 *.Xlt
FileName: String ;
Col,Row : Integer;
ExlApp : Variant;
i, j : Integer ;
Begin
if ADOQuery1.Active and (ADOQuery1.RecordCount < 500) then
begin
nocan:= savedialog1.Execute; //nocan是全局变量 记录保存对话返回结果 保持 T 取消 F
if (saveDialog1.FileName <> '') and nocan then
begin
FileName:=saveDialog1.FileName;
// 判断指定的模板文件是否存在
row:=1;
col:=1;
ModuleName := extractfilepath(paramstr(0))+'/图书报表模板.xls';
If FileExists(ModuleName)= False Then
begin
ShowMessage( 'EXCEL文件: '+ ModuleName + ' 不存在! 请重新安装程序!' ) ;
Exit ;
end ;
EXLApp := CreateOleObject('Excel.Application');

// 从指定的模板文件*.xlt 新建一 Excel 文档
ExlApp.WorkBooks.Open(ModuleName);
ExlAPP.WorkSheets[1].Activate;
// 把 TDBGrid 的数据导入 Excel 中
ADOQuery1.First;
i := Row ;
sb1.SimpleText :=' 信息: 正在把查询结果写入到EXCEL文件中,需要时间 请勿中断! 请稍侯...... ';
While Not(DBGrid1.DataSource.DataSet.Eof) Do
Begin
For j:=Col To DBGrid1.FieldCount+ Col-1 Do
ExlApp.Cells[i+1,j].Value := DBGrid1.Fields[j-col].AsString ; //i+1保留模板列标题
DBGrid1.DataSource.DataSet.Next ;
i := i+1 ;
End ;

// 保存到 指定的文件
FileName := Trim(FileName) ;
IF FileExists(FileName) Then
DeleteFile(FileName) ;
try //保存意外处理
ExlAPP.ActiveWorkBook.SaveAs(FileName);
// 关闭 Excel
ExlApp.WorkBooks.Close;
sb1.SimpleText :=' 信息: 数据导入完毕! 保存在你的 '+FileName+'.xls 文件中,请查看! '
except //取消覆盖处理
ExlApp.WorkBooks.Close;
sb1.SimpleText :=' 信息: 数据未保存!'
end;
ExlApp.Quit;
ExlApp:=Unassigned;
End;
end;
end;
 
谢谢!我正要试试!
 
后退
顶部