unit Main;interfaceuses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, ExtCtrls, Buttons, Grids, DBGrids, DB, ADODB, StdCtrls, ComCtrls,Comobj, Vcl.XPMan;type TFrmMain = class(TForm) Panel1: TPanel; Panel2: TPanel; SpeedButton1: TSpeedButton; DBGrid1: TDBGrid; ADODataSet1: TADODataSet; ADOConnection1: TADOConnection; DataSource1: TDataSource; Label1: TLabel; DateTimePicker1: TDateTimePicker; Label2: TLabel; DateTimePicker2: TDateTimePicker; Edit1: TEdit; Label3: TLabel; SpeedButton2: TSpeedButton; SpeedButton3: TSpeedButton; Button1: TButton; XPManifest1: TXPManifest; FontDialog1: TFontDialog; procedure SpeedButton1Click(Sender: TObject); procedure FormCreate(Sender: TObject); procedure SpeedButton2Click(Sender: TObject); procedure SpeedButton3Click(Sender: TObject); procedure Button1Click(Sender: TObject); private procedure DBGridSaveXLS(aDBGrid:TDBGrid;sFileName:string); { Private declarations } public { Public declarations } end;var FrmMain: TFrmMain;implementation{$R *.dfm} procedure TFrmMain.DBGridSaveXLS(aDBGrid:TDBGrid;sFileName:string);function LineFeedsToXLS(s:string):string; var Res:string; i:Integer; begin Res:=''; for i:=1 to Length(s) do if s[i] <>#13 then Res:=Res+s[i]; Result:=res; end; var FExcel:Variant; FWorkbook:Variant; FWorksheet:Variant; FArray:Variant; s,z:Integer; RangeStr,sTitle:string; aBookMark:TBookMark; StrtCol,StrtRow,RowCount,ColCount:Integer; begin Screen.Cursor:=crHourGlass; try FExcel:=CreateOleObject('excel.application'); except Screen.cursor:=crDefault; MessageDlg('Could?not?start?Microsoft?Excel!',mtError,[mbCancel],0); Exit; end; aBookMark:=aDBGrid.DataSource.DataSet.GetBookMark; aDBGrid.DataSource.DataSet.DisableControls; try StrtCol:=0; StrtRow:=0; FWorkBook:=FExcel.WorkBooks.Add; //FWorkSheet?:=?FWorkBook.WorkSheets.Add; FWorkSheet:=FExcel.WorkBooks[1].WorkSheets[1]; RowCount:=aDBGrid.DataSource.DataSet.RecordCount+1;//加上標題行 ColCount:=aDBGrid.Columns.Count; FArray:=VarArrayCreate([0,RowCount-1-StrtRow,0,ColCount-1-StrtCol],VarVariant);//Title for z:=StrtCol to ColCount - 1 do begin sTitle:=aDBGrid.Columns[z].Title.Caption; if sTitle=''then sTitle:=aDBGrid.Columns[z].FieldName; FArray[0,z - StrtCol]:=LineFeedsToXLS(sTitle); end; //data {for s := StrtRow to RowCount - 1 do for z := StrtCol to ColCount - 1 do FArray[s - StrtRow, z - StrtCol] := LineFeedsToXLS();}s:=1;//s := StrtRow; aDBGrid.DataSource.DataSet.First; while not aDBGrid.DataSource.DataSet.Eof do begin for z:=StrtCol to ColCount - 1 do FArray[s-StrtRow, z-StrtCol]:=LineFeedsToXLS(aDBGrid.Columns[z].Field.DisplayText); Inc(s); aDBGrid.DataSource.DataSet.Next; end; RangeStr:='A1:'; if (ColCount-StrtCol) > 26 then begin if (ColCount-StrtCol) mod 26 = 0 then begin RangeStr:=RangeStr+Chr(Ord('A')- 2 + ((ColCount - StrtCol) div 26)); RangeStr:=RangeStr + 'Z'; end else begin RangeStr:=RangeStr + Chr(Ord('A') - 1 + ((ColCount - StrtCol) div 26)); RangeStr:=RangeStr + Chr(Ord('A') - 1 + ((ColCount - StrtCol) mod 26)); end; end else RangeStr:=RangeStr + Chr(Ord('A') - 1 + (ColCount - StrtCol)); RangeStr:=RangeStr + IntToStr(RowCount - StrtRow); FWorkSheet.Range[RangeStr].Value:=FArray; if sFileName <> '' then begin FWorkbook.SaveAs(sFileName); FExcel.Quit; FExcel:=unAssigned end else FExcel.Visible:=True; finally aDBGrid.DataSource.DataSet.GotoBookMark(aBookMark); aDBGrid.DataSource.DataSet.EnableControls; aDBGrid.DataSource.DataSet.FreeBookMark(aBookMark); Screen.Cursor:=crDefault;end; end;procedure TFrmMain.SpeedButton1Click(Sender: TObject); var StartDate, EndDate:string; SQLStr:string; begin StartDate := DateToStr(DateTimePicker1.Date)+' 00:00:00'; EndDate := DateToStr(DateTimePicker2.Date)+' 23:59:59'; SQLStr :='SELECT CONVERT(VARCHAR(30), VPE.DATUMUHRZEIT,111) AS DATE, LP_TYPE.TYP_DESC,AVG(LP_DATA.lichtstrom) AS AVG_LUMEN '+ ' FROM LP_DATA INNER JOIN VPE ON LP_DATA.ID_VPE=VPE.ID_VPE '+ ' INNER JOIN LP_TYPE ON LP_DATA.ID_TYP=LP_TYPE.ID_TYP '+ ' WHERE VPE.DATUMUHRZEIT BETWEEN '+QuotedStr(StartDate)+ ' and '+ QuotedStr(EndDate) +' GROUP BY LP_TYPE.TYP_DESC, '+ ' CONVERT(VARCHAR(30),VPE.DATUMUHRZEIT,111)'; ADODataSet1.Active := False; ADODataSet1.CommandText := SQLStr; ADODataSet1.Active := True; end;procedure TFrmMain.Button1Click(Sender: TObject); begin with TopenDialog.Create(nil) do begin DBGRIDSAVEXLS(dbgRID1,' '); end; end; procedure TFrmMain.FormCreate(Sender: TObject); begin ADOConnection1.Connected := False; ADOConnection1.Connected := True; ADODataSet1.Active := False; ADODataSet1.Active := True; end;
procedure TFrmMain.Button1Click(Sender: TObject); begin with TopenDialog.Create(nil) do begin DBGRIDSAVEXLS(dbgRID1,' '); end; endButton1的点击事件修改成这样试下: procedure TFrmMain.Button1Click(Sender: TObject); begin DBGRIDSAVEXLS(dbgRID1,' '); end
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls, Buttons, Grids, DBGrids, DB, ADODB, StdCtrls, ComCtrls,Comobj,
Vcl.XPMan;type
TFrmMain = class(TForm)
Panel1: TPanel;
Panel2: TPanel;
SpeedButton1: TSpeedButton;
DBGrid1: TDBGrid;
ADODataSet1: TADODataSet;
ADOConnection1: TADOConnection;
DataSource1: TDataSource;
Label1: TLabel;
DateTimePicker1: TDateTimePicker;
Label2: TLabel;
DateTimePicker2: TDateTimePicker;
Edit1: TEdit;
Label3: TLabel;
SpeedButton2: TSpeedButton;
SpeedButton3: TSpeedButton;
Button1: TButton;
XPManifest1: TXPManifest;
FontDialog1: TFontDialog;
procedure SpeedButton1Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure SpeedButton2Click(Sender: TObject);
procedure SpeedButton3Click(Sender: TObject);
procedure Button1Click(Sender: TObject);
private
procedure DBGridSaveXLS(aDBGrid:TDBGrid;sFileName:string);
{ Private declarations }
public
{ Public declarations }
end;var
FrmMain: TFrmMain;implementation{$R *.dfm}
procedure TFrmMain.DBGridSaveXLS(aDBGrid:TDBGrid;sFileName:string);function LineFeedsToXLS(s:string):string;
var
Res:string;
i:Integer;
begin
Res:='';
for i:=1 to Length(s) do
if s[i] <>#13 then
Res:=Res+s[i];
Result:=res;
end;
var
FExcel:Variant;
FWorkbook:Variant;
FWorksheet:Variant;
FArray:Variant;
s,z:Integer;
RangeStr,sTitle:string;
aBookMark:TBookMark;
StrtCol,StrtRow,RowCount,ColCount:Integer;
begin
Screen.Cursor:=crHourGlass;
try
FExcel:=CreateOleObject('excel.application');
except
Screen.cursor:=crDefault;
MessageDlg('Could?not?start?Microsoft?Excel!',mtError,[mbCancel],0);
Exit;
end;
aBookMark:=aDBGrid.DataSource.DataSet.GetBookMark;
aDBGrid.DataSource.DataSet.DisableControls;
try
StrtCol:=0;
StrtRow:=0;
FWorkBook:=FExcel.WorkBooks.Add;
//FWorkSheet?:=?FWorkBook.WorkSheets.Add;
FWorkSheet:=FExcel.WorkBooks[1].WorkSheets[1];
RowCount:=aDBGrid.DataSource.DataSet.RecordCount+1;//加上標題行
ColCount:=aDBGrid.Columns.Count;
FArray:=VarArrayCreate([0,RowCount-1-StrtRow,0,ColCount-1-StrtCol],VarVariant);//Title
for z:=StrtCol to ColCount - 1 do
begin
sTitle:=aDBGrid.Columns[z].Title.Caption;
if sTitle=''then
sTitle:=aDBGrid.Columns[z].FieldName;
FArray[0,z - StrtCol]:=LineFeedsToXLS(sTitle);
end;
//data
{for s := StrtRow to RowCount - 1 do
for z := StrtCol to ColCount - 1 do
FArray[s - StrtRow, z - StrtCol] := LineFeedsToXLS();}s:=1;//s := StrtRow;
aDBGrid.DataSource.DataSet.First;
while not aDBGrid.DataSource.DataSet.Eof do
begin
for z:=StrtCol to ColCount - 1 do
FArray[s-StrtRow, z-StrtCol]:=LineFeedsToXLS(aDBGrid.Columns[z].Field.DisplayText);
Inc(s);
aDBGrid.DataSource.DataSet.Next;
end;
RangeStr:='A1:';
if (ColCount-StrtCol) > 26 then
begin
if (ColCount-StrtCol) mod 26 = 0 then
begin
RangeStr:=RangeStr+Chr(Ord('A')- 2 + ((ColCount - StrtCol) div 26));
RangeStr:=RangeStr + 'Z';
end
else
begin
RangeStr:=RangeStr + Chr(Ord('A') - 1 + ((ColCount - StrtCol) div 26));
RangeStr:=RangeStr + Chr(Ord('A') - 1 + ((ColCount - StrtCol) mod 26));
end;
end
else
RangeStr:=RangeStr + Chr(Ord('A') - 1 + (ColCount - StrtCol));
RangeStr:=RangeStr + IntToStr(RowCount - StrtRow);
FWorkSheet.Range[RangeStr].Value:=FArray;
if sFileName <> '' then
begin
FWorkbook.SaveAs(sFileName);
FExcel.Quit;
FExcel:=unAssigned
end
else
FExcel.Visible:=True;
finally
aDBGrid.DataSource.DataSet.GotoBookMark(aBookMark);
aDBGrid.DataSource.DataSet.EnableControls;
aDBGrid.DataSource.DataSet.FreeBookMark(aBookMark);
Screen.Cursor:=crDefault;end;
end;procedure TFrmMain.SpeedButton1Click(Sender: TObject);
var
StartDate,
EndDate:string;
SQLStr:string;
begin
StartDate := DateToStr(DateTimePicker1.Date)+' 00:00:00';
EndDate := DateToStr(DateTimePicker2.Date)+' 23:59:59';
SQLStr :='SELECT CONVERT(VARCHAR(30), VPE.DATUMUHRZEIT,111) AS DATE, LP_TYPE.TYP_DESC,AVG(LP_DATA.lichtstrom) AS AVG_LUMEN '+
' FROM LP_DATA INNER JOIN VPE ON LP_DATA.ID_VPE=VPE.ID_VPE '+
' INNER JOIN LP_TYPE ON LP_DATA.ID_TYP=LP_TYPE.ID_TYP '+
' WHERE VPE.DATUMUHRZEIT BETWEEN '+QuotedStr(StartDate)+
' and '+ QuotedStr(EndDate) +' GROUP BY LP_TYPE.TYP_DESC, '+
' CONVERT(VARCHAR(30),VPE.DATUMUHRZEIT,111)'; ADODataSet1.Active := False;
ADODataSet1.CommandText := SQLStr;
ADODataSet1.Active := True;
end;procedure TFrmMain.Button1Click(Sender: TObject);
begin
with TopenDialog.Create(nil) do
begin
DBGRIDSAVEXLS(dbgRID1,' ');
end;
end;
procedure TFrmMain.FormCreate(Sender: TObject);
begin
ADOConnection1.Connected := False;
ADOConnection1.Connected := True;
ADODataSet1.Active := False;
ADODataSet1.Active := True;
end;
begin
with TopenDialog.Create(nil) do
begin
DBGRIDSAVEXLS(dbgRID1,' ');
end;
endButton1的点击事件修改成这样试下:
procedure TFrmMain.Button1Click(Sender: TObject);
begin
DBGRIDSAVEXLS(dbgRID1,' ');
end