网上有很多DBGridToExcel代码都是数据表转EXCEL,连DBGrid的标题栏都没保存进去
这段代码是摘自优快云大神(zpc198600)代码的修改版,增加了序号(字段不在数据表里)显示
procedure DBGridToExcel(dbGrid: TDBGrid); // 这才是正确的DBGrid转EXCEL方式,而不是数据表转Excel
var
excelapp: Variant;
page: Variant;
i, j: Integer;
savedialog: TSaveDialog;
BM: TBookmark;
strsavefile: string;
begin
if dbGrid.DataSource.DataSet.IsEmpty then //判断TDBGRID是否有数据
begin
MessageBox(Application.Handle, '数据为空不能进行保存', '警告', MB_OK);
Abort;
Exit;
end;
savedialog := TSaveDialog.Create(nil); // 创建一个保存对话框
savedialog.Filter:= 'Microsoft Excel 2007(*.xlsx)|*.xlsx|Microsoft Excel 97-2003(*.xls)|*.xls'; //设置保存文件的扩展名
savedialog.DefaultExt := '.xlsx';
savedialog.Execute; //打开保存对话框
strsavefile := savedialog.FileName; //保存文件的目录
if Length(strsavefile) = 0 then
Exit; //目录为空则退出程序
try
// Screen.Cursor:=crhourglass; //屏幕指针形状
try
excelapp := CreateOleObject('excel.application');
excelapp.workbooks.add(-4167); //设置添加数据的大小
excelapp.workbooks[1].worksheets[1].name := '数据库数据'; //标签页名称
page := excelapp.workbooks[1].worksheets['数据库数据']; //指定标签页
j := 1;
except
MessageBox(GetActiveWindow, '请确认是否安装了EXCEL', '提示', MB_OK + MB_ICONINFORMATION);
Exit;
end;
with dbGrid.DataSource.DataSet do
begin
BM := GetBookmark;
DisableControls;
//将DBGRID中的标题插入到EXCEL表中首行
for i := 0 to dbGrid.Columns.Count - 1 do
begin
if dbGrid.Columns[1].Visible = False then
Continue;
page.cells[j, i + 1] := dbGrid.Columns[i].Title.Caption;
page.cells[j, i + 1].font.bold := True;
end;
Inc(j); //ECXEL表中的下一行
First;
while not Eof do
begin
page.cells[j, 1] := inttostr(j - 1); // 自己增加的序号
for i := 1 to dbGrid.Columns.Count - 1 do // 循环从0改成1开始,跳过序号列(第一列是序号)
begin
if dbGrid.Columns[i].Visible = False then
Continue;
//将指定行添加到EXCEL表中
page.cells[j, i + 1] := Trim(dbGrid.DataSource.DataSet.fieldbyname(dbGrid.Columns[i].FieldName).AsString);
end;
Inc(j); //EXCEL表中下一行
Next; //TDBGrid表中下一行
end;
GotoBookmark(BM);
FreeBookmark(BM);
EnableControls;
end;
excelapp.activeworkbook.saveas(strsavefile); //将EXCEL表保存到指定目录下
Application.ProcessMessages;
excelapp.application.quit;
finally
savedialog.Free;
Screen.Cursor := crDefault;
end;
end;