请问如何实现数据表中的记录输出为Excel文件,急用,谢谢!
请问如何实现数据表中的记录输出为Excel文件,急用,谢谢! 问题点数:30、回复次数:7Top
1 楼suiyuxing(秋水)回复于 2004-08-01 17:29:27 得分 0
有一个控件的。好像是ExGrid中的吧,有一个控件可以的。上网找一找看,我忘了!!!Top
2 楼flayyao(姚俊)回复于 2004-08-01 18:54:49 得分 0
这是我自己一个控件中的源代码,你可以看看,主要是通过ole控制
procedure Tmydbgrid.chooseexcel(sender: tobject);
var
msexcel, sheet: OleVariant;
count, i: integer; //fieldnum,
Grid: twwdbgrid;
begin
grid := self;
if grid.DataSource.DataSet.Active = false then
begin
prompt(mtinformation, '数据为空!');
exit;
end;
try
msexcel := CreateOleObject('excel.Application');
msexcel.visible := true;
except
prompt(mtinformation, '不能启动Microsoft Excel,操作失败!');
exit;
end;
count := 2;
msexcel.Workbooks.Add(emptyparam);
msexcel.Workbooks[1].WorkSheets[1].Name := 'Excel';
sheet := msexcel.Workbooks[1].WorkSheets['Excel'];
for i := 1 to grid.FieldCount do
begin
if grid.UseTFields then
sheet.cells[1, i] := grid.datasource.dataset.fields[i - 1].DisplayLabel
else
sheet.cells[1, i] := grid.Columns[i - 1].DisplayLabel;
end;
try
grid.DataSource.DataSet.DisableControls;
grid.DataSource.DataSet.First;
while not grid.DataSource.DataSet.Eof do
begin
for i := 1 to grid.FieldCount do
sheet.cells[count, i] := grid.Fields[i - 1].asstring;
inc(count);
grid.DataSource.DataSet.Next;
end;
grid.DataSource.DataSet.First;
finally
grid.DataSource.DataSet.EnableControls;
end;
end;
Top
3 楼SuQingQuan(边城浪子)回复于 2004-08-01 21:39:46 得分 10
有可以实现合并单元格或是其他一系列Execl常规操作的吗?不然的话,也可以不用ole来做啊。Top
4 楼SuQingQuan(边城浪子)回复于 2004-08-01 21:41:31 得分 0
try
assignfile(F, SaveDialog1.FileName);
if FileExists(SaveDialog1.FileName) then
if application.MessageBox('文件已存在,是否重写?', '提示', MB_YESNO) = IDYES then
rewrite(F)
else
exit
else
rewrite(F);
//取标题
with DBGrid1 do
for i := 0 to Columns.Count - 1 do
if DBGrid1.Columns[i].Visible then
sLabel := sLabel + Columns[i].title.Caption+#9;
//写文件
write(F, #9#9);
write(F, sTitle + #13#10);
write(F, sLabel + #13#10);
// 取数据
with DBGrid1.DataSource.DataSet do begin
SavePlace := GetBookmark;
DisableControls;
try
First;
while not EOF do begin
{ Process each record here }
sData := '';
for i := 0 to DBGrid1.Columns.Count - 1 do begin
//如列不可见,不取
if DBGrid1.Columns[i].Visible then begin
if option=1 then
sData := sData + TField(DBGrid1.Columns[i].field).text+#9
else
sData := sData + TField(DBGrid1.Columns[i].field).AsString+#9;
end;
end;
//写文件
write(F, sData + #13#10);
Next;
end;
finally
EnableControls;
end;
GotoBookmark(SavePlace);
FreeBookmark(SavePlace);
end; //end of with
except
on EInOutError do
application.MessageBox('写文件错误', '错误提示', MB_OK);
end;
closefile(F);Top
5 楼SuQingQuan(边城浪子)回复于 2004-08-01 21:41:58 得分 0
奉上的是一个最土的办法,但也很快速。Top
6 楼woding(郭大路)回复于 2004-08-01 22:14:39 得分 0
收藏.........Top
7 楼netcrawller(放弃绑定-不用第三方控件)回复于 2004-08-02 09:29:47 得分 20
同意:SuQingQuan(边城浪子)
还有一个方法是先存成CSV(逗号分隔文本文件)这样也可以用Excel打开,不过后缀一定要是
CSV,如果非要存成XLS的话那就再转一下吧(CSV->XLS),给个我写的Function你.
function SaveCSV2XLS(const FileName: string): string;
var
app: OleVariant;
xlsFile: string;
begin
xlsFile := ChangeFileExt(FileName, '.xls');
app := CreateOleObject('Excel.Application');
if FileExists(xlsFile) then SysUtils.DeleteFile(xlsFile);
app.Workbooks.Open(FileName);
app.Workbooks[1].SaveAs(xlsFile, -4143, '', '', false, false);
app.Workbooks[1].Close;
app := Unassigned;
SysUtils.DeleteFile(FileName);
result := ChangeFileExt(FileName, '.xls');
end;Top




