我想把dbgrid中的数据转化成excel的形式,可是我发现一旦我数据库中的一条记录如(012345)的第一位是0,则转化后excel表格中出现的是数据的第一位莫名其妙的少掉了,结果转化后的数据是(12345),请问这是怎么回事,我把源码贴出来,请高手帮我改一下.
unit studentinfosearch;interfaceuses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, DB, ADODB, Grids, DBGrids, StdCtrls, Mask, DBCtrls,
TFlatEditUnit, TFlatButtonUnit, TFlatComboBoxUnit, OleServer, Excel2000;type
TForm2 = class(TForm)
DBGrid1: TDBGrid;
Label1: TLabel;
Label2: TLabel;
Label3: TLabel;
Label4: TLabel;
Label5: TLabel;
FlatEdit1: TFlatEdit;
FlatEdit2: TFlatEdit;
DataSource1: TDataSource;
Cmdpolity: TFlatComboBox;
Cmdmajor: TFlatComboBox;
Btquery: TFlatButton;
Btclose: TFlatButton;
FlatEdit3: TFlatEdit;
FlatButton1: TFlatButton;
SaveDialog1: TSaveDialog;
ADOQuery1: TADOQuery;
ADOQuery2: TADOQuery;
ExcelWorksheet1: TExcelWorksheet;
procedure BtqueryClick(Sender: TObject);
procedure BtcloseClick(Sender: TObject);
procedure initialize();
procedure FormCreate(Sender: TObject);
procedure FlatEdit1KeyPress(Sender: TObject; var Key: Char);
function FindVarData(const V: Variant): PVarData;
function VarIsEmpty(const V: Variant): Boolean;
procedure CopyToExcel(Target: TDbgrid);
procedure FlatButton1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;var
Form2: TForm2;implementation{$R *.dfm}
uses searchstudentinfo, ComObj;
procedure TForm2.CopyToExcel(Target: TDbgrid);
var
iCount, jCount: Integer;
XLApp: Variant;
Sheet: Variant;
begin
Screen.Cursor := crHourGlass;
if not VarIsEmpty(XLApp) then
begin
XLApp.DisplayAlerts := False;
XLApp.Quit;
VarClear(XLApp);
end;
try
XLApp := CreateOleObject('Excel.Application');
except
Screen.Cursor := crDefault;
Exit;
end;
XLApp.WorkBooks.Add[XLWBatWorksheet];
XLApp.WorkBooks[1].WorkSheets[1].Name := '数据导出';
Sheet := XLApp.Workbooks[1].WorkSheets['数据导出'];if not Target.DataSource.DataSet.Active then
begin
Screen.Cursor := crDefault;
Exit;
end;
Target.DataSource.DataSet.first;
for iCount := 0 to Target.Columns.Count - 1 do
begin
Sheet.cells[1, iCount + 1] := Target.Columns.Items[iCount].Title.Caption;
end;
jCount := 1;
while not Target.DataSource.DataSet.Eof do
begin
for iCount := 0 to Target.Columns.Count - 1 do
begin
Sheet.cells[jCount + 1, iCount + 1] := Target.Columns.Items[iCount].Field.AsString;
end;
Inc(jCount);
Target.DataSource.DataSet.Next;
end;
XlApp.Visible := True;
Screen.Cursor := crDefault;
//xlApp.ActiveSheet.PageSetup.PrintGridLines := false;
end;function TForm2.VarIsEmpty(const V: Variant): Boolean;
begin
Result := FindVarData(V)^.VType = varEmpty;
end;
function TForm2.FindVarData(const V: Variant): PVarData;
begin
Result := @TVarData(V);
while Result.VType = varByRef or varVariant do
Result := PVarData(Result.VPointer);
end;
procedure TForm2.initialize();
begin
with ADOQuery2 do
begin
close;
sql.Clear;
sql.Add('select distinct polity,major from students ');
open;
while not ADOQuery2.Eof do
begin
Cmdpolity.Items.Add(Fields[0].value);
Cmdmajor.Items.Add(Fields[1].value);
ADOQuery2.Next;
end;
end;
end;
procedure TForm2.BtqueryClick(Sender: TObject);
var sqlstr:string;
begin
with ADOQuery1 do
begin
close;
SQL.Clear;
sqlstr:='select * from students where';
if FlatEdit1.Text<>'' then
sqlstr:=sqlstr+' studentsid='+QuotedStr(flatedit1.Text)+' and ';
if FlatEdit2.Text<>'' then
sqlstr:=sqlstr+' name='+QuotedStr(flatedit2.Text)+' and ';
if Cmdmajor.ItemIndex<>-1 then
sqlstr:=sqlstr+' major='+QuotedStr(Cmdmajor.Text)+' and ' ;
if FlatEdit3.Text<>'' then
sqlstr:=sqlstr+' class='+QuotedStr(flatedit3.Text)+' and ';
if Cmdpolity.ItemIndex<>-1 then
sqlstr:=sqlstr+' polity='+QuotedStr(Cmdpolity.Text)+' and ';
sqlstr:=copy(sqlstr,0,length(sqlstr)-5);
sql.Add(sqlstr);
open;
end;end;procedure TForm2.BtcloseClick(Sender: TObject);
begin
close;
end;
procedure TForm2.FormCreate(Sender: TObject);
begin
initialize();
end;
procedure TForm2.FlatEdit1KeyPress(Sender: TObject; var Key: Char);
begin
if key=#13 then
begin
perform(cm_dialogkey,vk_tab,0); //焦点按照Taborder的顺序下移
exit;
end;
end;
procedure TForm2.FlatButton1Click(Sender: TObject);
begin
CopyToExcel(DBGrid1);
end;end.
unit studentinfosearch;interfaceuses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, DB, ADODB, Grids, DBGrids, StdCtrls, Mask, DBCtrls,
TFlatEditUnit, TFlatButtonUnit, TFlatComboBoxUnit, OleServer, Excel2000;type
TForm2 = class(TForm)
DBGrid1: TDBGrid;
Label1: TLabel;
Label2: TLabel;
Label3: TLabel;
Label4: TLabel;
Label5: TLabel;
FlatEdit1: TFlatEdit;
FlatEdit2: TFlatEdit;
DataSource1: TDataSource;
Cmdpolity: TFlatComboBox;
Cmdmajor: TFlatComboBox;
Btquery: TFlatButton;
Btclose: TFlatButton;
FlatEdit3: TFlatEdit;
FlatButton1: TFlatButton;
SaveDialog1: TSaveDialog;
ADOQuery1: TADOQuery;
ADOQuery2: TADOQuery;
ExcelWorksheet1: TExcelWorksheet;
procedure BtqueryClick(Sender: TObject);
procedure BtcloseClick(Sender: TObject);
procedure initialize();
procedure FormCreate(Sender: TObject);
procedure FlatEdit1KeyPress(Sender: TObject; var Key: Char);
function FindVarData(const V: Variant): PVarData;
function VarIsEmpty(const V: Variant): Boolean;
procedure CopyToExcel(Target: TDbgrid);
procedure FlatButton1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;var
Form2: TForm2;implementation{$R *.dfm}
uses searchstudentinfo, ComObj;
procedure TForm2.CopyToExcel(Target: TDbgrid);
var
iCount, jCount: Integer;
XLApp: Variant;
Sheet: Variant;
begin
Screen.Cursor := crHourGlass;
if not VarIsEmpty(XLApp) then
begin
XLApp.DisplayAlerts := False;
XLApp.Quit;
VarClear(XLApp);
end;
try
XLApp := CreateOleObject('Excel.Application');
except
Screen.Cursor := crDefault;
Exit;
end;
XLApp.WorkBooks.Add[XLWBatWorksheet];
XLApp.WorkBooks[1].WorkSheets[1].Name := '数据导出';
Sheet := XLApp.Workbooks[1].WorkSheets['数据导出'];if not Target.DataSource.DataSet.Active then
begin
Screen.Cursor := crDefault;
Exit;
end;
Target.DataSource.DataSet.first;
for iCount := 0 to Target.Columns.Count - 1 do
begin
Sheet.cells[1, iCount + 1] := Target.Columns.Items[iCount].Title.Caption;
end;
jCount := 1;
while not Target.DataSource.DataSet.Eof do
begin
for iCount := 0 to Target.Columns.Count - 1 do
begin
Sheet.cells[jCount + 1, iCount + 1] := Target.Columns.Items[iCount].Field.AsString;
end;
Inc(jCount);
Target.DataSource.DataSet.Next;
end;
XlApp.Visible := True;
Screen.Cursor := crDefault;
//xlApp.ActiveSheet.PageSetup.PrintGridLines := false;
end;function TForm2.VarIsEmpty(const V: Variant): Boolean;
begin
Result := FindVarData(V)^.VType = varEmpty;
end;
function TForm2.FindVarData(const V: Variant): PVarData;
begin
Result := @TVarData(V);
while Result.VType = varByRef or varVariant do
Result := PVarData(Result.VPointer);
end;
procedure TForm2.initialize();
begin
with ADOQuery2 do
begin
close;
sql.Clear;
sql.Add('select distinct polity,major from students ');
open;
while not ADOQuery2.Eof do
begin
Cmdpolity.Items.Add(Fields[0].value);
Cmdmajor.Items.Add(Fields[1].value);
ADOQuery2.Next;
end;
end;
end;
procedure TForm2.BtqueryClick(Sender: TObject);
var sqlstr:string;
begin
with ADOQuery1 do
begin
close;
SQL.Clear;
sqlstr:='select * from students where';
if FlatEdit1.Text<>'' then
sqlstr:=sqlstr+' studentsid='+QuotedStr(flatedit1.Text)+' and ';
if FlatEdit2.Text<>'' then
sqlstr:=sqlstr+' name='+QuotedStr(flatedit2.Text)+' and ';
if Cmdmajor.ItemIndex<>-1 then
sqlstr:=sqlstr+' major='+QuotedStr(Cmdmajor.Text)+' and ' ;
if FlatEdit3.Text<>'' then
sqlstr:=sqlstr+' class='+QuotedStr(flatedit3.Text)+' and ';
if Cmdpolity.ItemIndex<>-1 then
sqlstr:=sqlstr+' polity='+QuotedStr(Cmdpolity.Text)+' and ';
sqlstr:=copy(sqlstr,0,length(sqlstr)-5);
sql.Add(sqlstr);
open;
end;end;procedure TForm2.BtcloseClick(Sender: TObject);
begin
close;
end;
procedure TForm2.FormCreate(Sender: TObject);
begin
initialize();
end;
procedure TForm2.FlatEdit1KeyPress(Sender: TObject; var Key: Char);
begin
if key=#13 then
begin
perform(cm_dialogkey,vk_tab,0); //焦点按照Taborder的顺序下移
exit;
end;
end;
procedure TForm2.FlatButton1Click(Sender: TObject);
begin
CopyToExcel(DBGrid1);
end;end.
↑参考