unit QueryDerive;interfaceuses
Windows, Messages, SysUtils, Classes, forms, ComObj, dbgrids, Quickrpt, QRCtrls,
qrprntr, printers, DB, Graphics;procedure DeriveToExcel(Title: String; DBGrid: TDBGrid; Total: Boolean);
procedure DeriveToPrint(Title: String; DBGrid: TDBGrid; Total: Boolean);implementationprocedure DeriveToExcel(Title: String; DBGrid: TDBGrid; Total: Boolean);
var
ExcelApp, WorkBook: Variant;
i, j: Integer;
Row, Col: Integer;
FieldName: string;
DataSet: TDataSet;
S: String;
begin // 数据发送到 Excel
try
ExcelApp := CreateOleObject('Excel.Application');
WorkBook := CreateOleObject('Excel.Sheet');
except
Application.MessageBox('你的机器里未安装Microsoft Excel. ', '', 32);
Exit;
end; Application.ProcessMessages;
WorkBook := ExcelApp.WorkBooks.Add;
Col := 1;
ExcelApp.Cells(2, Col) := Title;
Row := 4;
DataSet := DBGrid.DataSource.DataSet;
for I := 0 to DBGrid.Columns.Count - 1 do
begin
if DBGrid.Columns[I].Visible then
begin
FieldName := DBGrid.Columns[I].Title.Caption;
ExcelApp.Cells(Row, Col) := FieldName;
Col := Col + 1;
end;
end; Row := Row + 1; DataSet.First;
while not DataSet.Eof do
begin
Col := 1;
for J := 0 to DBGrid.Columns.Count - 1 do
begin
FieldName := DBGrid.Columns[J].FieldName;
ExcelApp.Cells(Row, Col) := ' ' + DataSet.FieldByName(FieldName).AsString + ' ';
Col := Col + 1;
end;
Row := Row + 1;
DataSet.Next;
end; if Total then
begin
Col := 1;
for J := 0 to DBGrid.Columns.Count - 1 do
begin
S := Char(64 + ((J+1) mod 26));
if (J+1) > 26 then
begin
S := Char(65+(((J+1)-26) div 26)) + S;
end;
if J = 0 then
begin
ExcelApp.Cells(Row, Col) := '合计';
end
else if DBGrid.Columns[J].Field.DataType in [ftInteger, ftSmallint, ftFloat, ftBCD] then
begin
FieldName := DBGrid.Columns[J].FieldName;
ExcelApp.Cells(Row, Col) := '=SUM('+S+'4:'+S+IntToStr(Row-1)+')';
end;
Col := Col + 1;
end;
end;
ExcelApp.Visible := True;
// WorkBook.SaveAs(SaveDialog1.FileName);
// WorkBook.Close;
// ExcelApp.Quit;
// ExcelApp := Unassigned;
end;end.
我这个单元是导出execl的程序。那错了。请高手指点。并且。谁有现成的程序供我参考将有高分给予。这个程序怎么调用啊。
Windows, Messages, SysUtils, Classes, forms, ComObj, dbgrids, Quickrpt, QRCtrls,
qrprntr, printers, DB, Graphics;procedure DeriveToExcel(Title: String; DBGrid: TDBGrid; Total: Boolean);
procedure DeriveToPrint(Title: String; DBGrid: TDBGrid; Total: Boolean);implementationprocedure DeriveToExcel(Title: String; DBGrid: TDBGrid; Total: Boolean);
var
ExcelApp, WorkBook: Variant;
i, j: Integer;
Row, Col: Integer;
FieldName: string;
DataSet: TDataSet;
S: String;
begin // 数据发送到 Excel
try
ExcelApp := CreateOleObject('Excel.Application');
WorkBook := CreateOleObject('Excel.Sheet');
except
Application.MessageBox('你的机器里未安装Microsoft Excel. ', '', 32);
Exit;
end; Application.ProcessMessages;
WorkBook := ExcelApp.WorkBooks.Add;
Col := 1;
ExcelApp.Cells(2, Col) := Title;
Row := 4;
DataSet := DBGrid.DataSource.DataSet;
for I := 0 to DBGrid.Columns.Count - 1 do
begin
if DBGrid.Columns[I].Visible then
begin
FieldName := DBGrid.Columns[I].Title.Caption;
ExcelApp.Cells(Row, Col) := FieldName;
Col := Col + 1;
end;
end; Row := Row + 1; DataSet.First;
while not DataSet.Eof do
begin
Col := 1;
for J := 0 to DBGrid.Columns.Count - 1 do
begin
FieldName := DBGrid.Columns[J].FieldName;
ExcelApp.Cells(Row, Col) := ' ' + DataSet.FieldByName(FieldName).AsString + ' ';
Col := Col + 1;
end;
Row := Row + 1;
DataSet.Next;
end; if Total then
begin
Col := 1;
for J := 0 to DBGrid.Columns.Count - 1 do
begin
S := Char(64 + ((J+1) mod 26));
if (J+1) > 26 then
begin
S := Char(65+(((J+1)-26) div 26)) + S;
end;
if J = 0 then
begin
ExcelApp.Cells(Row, Col) := '合计';
end
else if DBGrid.Columns[J].Field.DataType in [ftInteger, ftSmallint, ftFloat, ftBCD] then
begin
FieldName := DBGrid.Columns[J].FieldName;
ExcelApp.Cells(Row, Col) := '=SUM('+S+'4:'+S+IntToStr(Row-1)+')';
end;
Col := Col + 1;
end;
end;
ExcelApp.Visible := True;
// WorkBook.SaveAs(SaveDialog1.FileName);
// WorkBook.Close;
// ExcelApp.Quit;
// ExcelApp := Unassigned;
end;end.
我这个单元是导出execl的程序。那错了。请高手指点。并且。谁有现成的程序供我参考将有高分给予。这个程序怎么调用啊。
//本程序的主要功能是将数据表DBGRID中的数据导出到EXCEL中
//本程序的的上一版本是comm_excel.pas
//本程序在上一版本的基础上作了更通用的扩展
//本程序支持将CARDID,等查询后作处理的数据,将表格中的数据导入到excel,
//避免了以前查询数据和显示数据不一致的问题。
//------------------------------------------------------------------------------
//------------------------------------------------------------------------------
//---------------------V1.0-----------------------------------------------------
//------------------------------------------------------------------------------
//------------------------------------------------------------------------------
unit gridtoexcel;
interfaceuses OleServer, Excel97,DBGrids,dbtables,Dialogs,Sysutils,db,windows,graphics,FileCtrl,classes;var
XLApp:TExcelApplication;
procedure CreateExcel(DBGrid:TDBGrid;Title:String);
procedure HandleData(Worksheet:_Worksheet;DBGrid:TDBGrid;Title:String);
function textformat(str:string;count:integer):string;
implementation
//nizhigang's gbgridtoexcel .
function textformat(str:string;count:integer):string;
var
mystr:string;
begin
mystr:=copy(' ',1,count-length(str));
mystr:=mystr+str;
result:=mystr;
end;procedure CreateExcel(DBGrid:TDBGrid;Title:String);
var
WorkBks:WorkBooks;
Workbk:_Workbook;
WorkSheets:Sheets;
Worksheet:_WorkSheet;
begin
try
XLApp:=TExcelApplication.Create(nil);
except
ShowMessage('打开EXCEL失败,请检查系统!');
exit;
end;
XLApp.Visible[0]:=True;
WorkBks:=XLApp.Workbooks as WorkBooks;
WorkBks.Add(XLWBatWorkSheet,0);
Workbk:=WorkBks.Item[1];
WorkSheets:=Workbk.Worksheets;
Worksheet:=Worksheets.Get_Item(1) as _WorkSheet;
WorkSheet.Name:=Title;
HandleData(Worksheet,DBGrid,Title);
xlapp.Free;
end;Procedure HandleData(Worksheet:_Worksheet;DBGrid:TDBGrid;Title:String);
var
i,j:integer;
ARange:Range;
max:integer;
begin
WorKSheet.Cells.Item[1,6]:=Title;
for i:=1 to DBGrid.Columns.Count do
WorkSheet.Cells.Item[3,i+1]:=DBGrid.Columns.Items[i-1].Title.caption;
dbgrid.DataSource.DataSet.First;
i:=0;
while not dbgrid.DataSource.DataSet.Eof do
begin
for j:=0 to DBGrid.Columns.Count-1 do
case dbgrid.Fields[j].DataType of
ftstring:
WorkSheet.Cells.Item[4+i,j+2]:=''''+dbgrid.Fields[j].Text;
ftBytes:
WorkSheet.Cells.Item[4+i,j+2]:=''''+dbgrid.Fields[j].Text;
else
WorkSheet.Cells.Item[4+i,j+2]:=dbgrid.Fields[j].Text;
end;
dbgrid.DataSource.DataSet.Next;
i:=i+1;
end;
max:=dbgrid.DataSource.DataSet.RecordCount;
ARange:=WorkSheet.Range[WorkSheet.Cells.Item[3,2],WorkSheet.Cells.Item[3,DBGrid.Columns.Count+1]];
ARange.Columns.Interior.ColorIndex:=24;
ARange:=WorkSheet.Range[WorkSheet.Cells.Item[3,2],WorkSheet.Cells.Item[3+Max,DBGrid.Columns.Count+1]];
ARange.Borders.LineStyle:=xlContinuous;
end;end.
Procedure DBGridToExcel(Grid:TDBGrid);
var
xlApp:Variant;//TexcelApplication;
XlWorkBook:Variant;//_workBook;
xlworkSheet:Variant;//_worksheet;
LCID,I,J:integer;
// SaveDialog:TSaveDialog;
FileName:String;
begin
xlapp:=CreateOleObject('Excel.application');
XlApp.Visible:=False;
//xlApp.Connect;
// LCID:=GetUserDefaultLCID(); xlWorkBook:=xlApp.Workbooks.Add(-4167);
xlWorkSheet:=xlapp.WorkBooks[1].Worksheets['sheet1'];// as _workSheet;
//xlWorkSheet.Activate(LCID);
//xlWorksheet.range['a1','ad100'].NumberFormatLocal := '@';
Grid.DataSource.DataSet.DisableControls;
I:=1;
For J:=0 to Grid.FieldCount-1 do
xlWorksheet.Cells[i,j+1]:=Grid.Columns[j].Title.Caption;
I:=2 ;
Grid.DataSource.DataSet.First;
while not Grid.DataSource.DataSet.eof do
begin
For J:=0 to Grid.FieldCount-1 do
xlworksheet.Cells[i,j+1]:=Grid.Fields[j].Value;
i:=I+1;
Grid.DataSource.DataSet.Next;
end;//while
Grid.DataSource.DataSet.EnableControls;
xlWorkSheet.Range[xlWorkSheet.cells[1,1],xlWorkSheet.Cells[I,Grid.FieldCount]].columns.AutoFit;
xlapp.visible:=True;end;
procedure TFrmMain.WriteExcel(AdsData: TADODataSet; sName, Title: string);
var
ExcelApplication1: TExcelApplication;
ExcelWorksheet1: TExcelWorksheet;
ExcelWorkbook1: TExcelWorkbook;
i, j: integer;
filename: string;
begin
filename := concat(extractfilepath(application.exename), sName, ’.xls’);
try
ExcelApplication1 := TExcelApplication.Create(Application);
ExcelWorksheet1 := TExcelWorksheet.Create(Application);
ExcelWorkbook1 := TExcelWorkbook.Create(Application);
ExcelApplication1.Connect;
except
Application.Messagebox(’Excel 没有安装!’, ’Hello’, MB_ICONERROR + mb_Ok);
Abort;
end;
try
ExcelApplication1.Workbooks.Add(EmptyParam, 0);
ExcelWorkbook1.ConnectTo(ExcelApplication1.Workbooks[1]);
ExcelWorksheet1.ConnectTo(ExcelWorkbook1.Worksheets[1] as _worksheet);
AdsData.First;
for j := 0 to AdsData.Fields.Count - 1 do
begin
ExcelWorksheet1.Cells.item[3, j + 1] := AdsData.Fields[j].DisplayLabel;
ExcelWorksheet1.Cells.item[3, j + 1].font.size := ’10’;
end;
for i := 4 to AdsData.RecordCount + 3 do
begin
for j := 0 to AdsData.Fields.Count - 1 do
begin
ExcelWorksheet1.Cells.item[i, j + 1] :=
AdsData.Fields[j].Asstring;
ExcelWorksheet1.Cells.item[i, j + 1].font.size := ’10’;
end;
AdsData.Next;
end;
ExcelWorksheet1.Columns.AutoFit;
ExcelWorksheet1.Cells.item[1, 2] := Title;
ExcelWorksheet1.Cells.Item[1, 2].font.size := ’14’;
ExcelWorksheet1.SaveAs(filename);
Application.Messagebox(pchar(’数据成功导出’ + filename), ’Hello’,
mb_Ok);
finally
ExcelApplication1.Disconnect;
ExcelApplication1.Quit;
ExcelApplication1.Free;
ExcelWorksheet1.Free;
ExcelWorkbook1.Free;
end;
end;