有一个控件能半你,如果要的话我可以发给你的,该控件功能强大,几乎可以导出任何类型的Desktop类型数据库
解决方案 »
- TStringGrid 与TDrawGrid有什么分别,地图编辑的用哪个
- mapx中的的Symbol问题
- c/s 数据库远程传输显示数据问题
- Oracle数据库的问题,是否和SQL Server2000一样啊?怎么操作表啊?(在线,)
- 关于事务处理,请看看这段代码是否正确。100分
- 当鼠标的中键滚动时,如何是dbgrid中的记录指针也同时移动?
- 感谢CSDN,感谢各位兄弟的帮助。晚上5点结。
- sql表数据怎样以DBGRID在ado 控件中体现
- 三层系统的数据库连接问题
- 请问如何取得dbgrid的一个单元格的数据?
- 特急:请问一个关于数据库的问题!(大师请进)
- MainMenu组件在Menuitem后面自己加上了(f)
E-MAIL:[email protected]
uses excel97,comobj;
....procedure tmainform.useexcel(frm:tform;rdt:tdataset);
var
xlsapp,xlssheet:variant;
i,j:integer;
begin
try
if varisempty(xlsapp) then
xlsapp:=createoleobject('excel.application');
xlsapp.workbooks.add;
xlssheet:=xlsapp.worksheets['sheet1'];
except
application.MessageBox('不能打EXCEL',pchar('警告'),mb_ok);
abort;
end;
for j:=0 to rdt.FieldCount-1 do
begin
xlssheet.cells[2,j+1]:=rdt.Fields[j].FieldName;
end;
with rdt do
begin
first;
for i:=0 to recordcount-1 do
begin
for j:=0 to fieldcount-1 do
begin
xlssheet.cells[i+3,j+1]:=fields[j].AsString;
end;
next;
end;
end;
xlsapp.visible:=true;
end;
把数据集保存为Excel格式的一个实现经常看到有人问如何把Delphi中的数据集导入Excel中,这里提供了一个实现。
在做项目时,很多情况下,客户需要对程序中数据集再加工,再利用,如报表。
这时,就需要把DataSet导入到一个客户比较熟悉的格式中去。Excel是首选了。该程序在Delphi4,5下编译通过,已被用在多个项目中。还被集成在笔者所写的一个小组件TDBNavigateButton中
}
{-------------------------------------------------------------------------------------------------
单元:uExcelTools
作者: Bear
功能:保存数据集,如TTable,TQuery,TClientDataSet等为Excel文件,
包含标题,可以只将一部分字段导出
这一点通过设置DataSet中要不导出字段的Tag值大于某一个值来处理
原理:调用 Microsoft Excel Ole对象
调用方式:
Function DataSetToExcel(
DataSet:TDataSet;FieldTagMax:Integer;
Visible:Boolean;ExcelFileName:String=''): Boolean;
--------------------------------------------------------------------------------------------------}unit UExcelTools;interfaceuses
classes, comctrls, stdctrls, windows, Dialogs, controls, SysUtils,
Db,forms,DBClient,ComObj;//把数据集导入ExcelSheet的核心函数
function DataSetToExcelSheet
(
DataSet :TDataSet;
FieldTagMax :Integer; // 字段的Tag值如果大于这个值,就不导出到Excel
Sheet :OleVariant
): Boolean;//实际使用的函数,内部调用了DataSetToExcelSheet,在外面加入UI接口和错误处理
function DataSetToExcel
(
DataSet :TDataSet; // 要转换的数据集
FieldTagMax :Integer; // 字段的Tag值如果大于这个值,就不导出到Excel
Visible :Boolean; // 是否让做转换工作的Excel可见
ExcelFileName:String='' // Excel文件名,*.xls
): Boolean;implementationFunction DataSetToExcelSheet(DataSet:TDataSet;FieldTagMax:Integer;Sheet:OleVariant): Boolean;
var
Row,Col,FieldIndex :Integer;
BK:TBookMark;
begin
Result := False;
if not Dataset.Active then exit;
BK:=DataSet.GetBookMark;
DataSet.DisableControls; Sheet.Activate;
try // 列标题
Row:=1;
Col:=1;
for FieldIndex:=0 to DataSet.FieldCount-1 do
begin
if DataSet.Fields[FieldIndex].Tag <= FieldTagMax then
begin
Sheet.Cells(Row,Col) :=DataSet.Fields[FieldIndex].DisplayLabel;
Inc(Col);
end;
end;
// 表内容
DataSet.First;
while Not DataSet.Eof do
begin
Row:=Row+1;
Col:=1;
for FieldIndex:=0 to DataSet.FieldCount-1 do
begin
if DataSet.Fields[FieldIndex].Tag <= FieldTagMax then
begin
Sheet.Cells(Row,Col):=DataSet.Fields[FieldIndex].AsString;
Inc(Col);
end;
end;
DataSet.Next;
end; Result := True;
finally
DataSet.GotoBookMark(BK);
DataSet.EnableControls;
end;
end;
Function DataSetToExcel(
DataSet:TDataSet;FieldTagMax:Integer;
Visible:Boolean;ExcelFileName:String=''): Boolean;
var
ExcelObj, Excel, WorkBook, Sheet: OleVariant;
OldCursor:TCursor;
SaveDialog:TSaveDialog;
begin
Result := False;
if not Dataset.Active then exit; OldCursor:=Screen.Cursor;
Screen.Cursor:=crHourGlass; try
ExcelObj := CreateOleObject('Excel.Sheet');
Excel := ExcelObj.Application;
Excel.Visible := Visible ;
WorkBook := Excel.Workbooks.Add ;
Sheet:= WorkBook.Sheets[1];
except
MessageBox(GetActiveWindow,'无法调用Mircorsoft Excel! '+chr(13)+chr(10)+
'请检查是否安装了Mircorsoft Excel。','提示',MB_OK+MB_ICONINFORMATION);
Screen.Cursor:=OldCursor;
Exit;
end; Result:=DataSetToExcelSheet(DataSet,FieldTagMax,Sheet) ;
if Result then
if Not Visible then
begin
if ExcelFileName<>''
then WorkBook.SaveAs(FileName:=ExcelFileName)
else begin
SaveDialog:=TSaveDialog.Create(Nil);
SaveDialog.Filter := 'Microsoft Excel 文件|*.xls';
Result:=SaveDialog.Execute;
UpdateWindow(GetActiveWindow);
if Result then
WorkBook.SaveAs(FileName:=SaveDialog.FileName);
SaveDialog.Free;
end;
Excel.Quit;
end;
Screen.Cursor:=OldCursor;
end; end.
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,execl97,oleserver,comobj;//加上comobj
.
.略
.
public procedure DBtoexcel(tb:tdataset);//加上
{$R *.DFM}
procedure Form1.DBtoexel(tb:tdataset);
var
i,j,f:integer;
v,st:variant;
begin
if tb.active=false then
begin
showmessage(tb.name+'表没有打开!');
exit;
end;
v:=createoleobject('excel.application');
v.visible:=true;
v.workbooks.add('c:\temp\share.xls');//当()为空时新建文件
st:=v.workbooks[1].worksheets[1];
i:=2;j:=0;f:=1;
//读字段名
for j:=0 to tb.fieldcount-1 do
begin
if tb.fields[j].visible=true then
begin
st.cells[i,f]:=tb.fields[j].displaylabel;
f:=f+1;
end;
end;
//读记录
i:=i+1;
tb.first;
while not tb.eof do
begin
f:=1;
for j:=0 to tb.fieldcount-1 do
begin
if tb.fields[j].visible=true then
begin
st.cells[i,f]:=tb.fields[j].text;
f:=f+1;
end;
end;
i:=i+1;
tb.next;
end;
end;
然后在按钮下的单击事件中加入:
dbtoexcel(table1);
var
m:integer;
n:integer;
temp_worksheet:_worksheet;
begin
if not query1.Active then
showmessage('没有数据')
elsebegin
form1.OpenDialog1.Execute;
form1.ExcelApplication1.Connect;
form1.ExcelApplication1.Visible[0]:=true;
excelworkbook1.ConnectTo(excelapplication1.workbooks.add(emptyparam,0));
temp_worksheet:=excelworkbook1.Worksheets.add(emptyparam,emptyparam,emptyparam,emptyparam,0) as _worksheet;
excelworksheet1.ConnectTo(temp_worksheet);begin
query1.First;
n:=1;
while not query1.Eof do
begin
for m:=1 to form1.DBGrid1.Columns.Count
do
begin
form1.ExcelWorksheet1.Cells.Item[n+1,m]:=form1.DBGrid1.DataSource.DataSet.Fields[m-1].AsString;
end;
n:=n+1;
query1.Next;
end;
end;
form1.ExcelWorkbook1.Disconnect;
//showmessage('完毕);
//form1.SaveDialog1.Free;
form1.DBGrid1.Free;end;
end;
谢谢大家,我已经解决问题了,但是---
为什么我用这上面的程序会让EXECL死掉???(我自己写的)
高手指教!