下面是一段从dbgrid中倒出数据到excel的代码,请问一下我如何才能把在内存中生成的excel文件保存到硬盘上??谢谢~~~ 我不知道该怎么写procedure Tmainform.CopyDbDataToExcel(Target: Tiwdbgrid);
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;
//通过ole创建Excel对象
try
XLApp := CreateOleObject('Excel.Application');
exceptExit;
end;
XLApp.WorkBooks.Add[XLWBatWorksheet];
XLApp.WorkBooks[1].WorkSheets[1].Name := 'web';
Sheet := XLApp.Workbooks[1].WorkSheets['web'];if not Target.DataSource.DataSet.Active then
beginExit;
end;Target.datasource.DataSet.first;for iCount := 0 to Target.Columns.Count - 1 do
begin
Sheet.cells[1, iCount + 1] := Target.Columns.Items[icount].DisplayName;
end; //Target.Columns.Items[iCount].Title.Caption;
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.DataSource.DataSet.FieldByName(Target.Columns.Items[icount].DisplayName).AsString;
end; //Target.Columns.Items[iCount].Field.AsString
Inc(jCount);
Target.DataSource.DataSet.Next;
end;
XlApp.Visible := True;
end;
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;
//通过ole创建Excel对象
try
XLApp := CreateOleObject('Excel.Application');
exceptExit;
end;
XLApp.WorkBooks.Add[XLWBatWorksheet];
XLApp.WorkBooks[1].WorkSheets[1].Name := 'web';
Sheet := XLApp.Workbooks[1].WorkSheets['web'];if not Target.DataSource.DataSet.Active then
beginExit;
end;Target.datasource.DataSet.first;for iCount := 0 to Target.Columns.Count - 1 do
begin
Sheet.cells[1, iCount + 1] := Target.Columns.Items[icount].DisplayName;
end; //Target.Columns.Items[iCount].Title.Caption;
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.DataSource.DataSet.FieldByName(Target.Columns.Items[icount].DisplayName).AsString;
end; //Target.Columns.Items[iCount].Field.AsString
Inc(jCount);
Target.DataSource.DataSet.Next;
end;
XlApp.Visible := True;
end;
EXEC master..xp_cmdshell 'bcp SettleDB.dbo.shanghu out c:\temp1.xls -c -q -S"GNETDATA/GNETDATA" -U"sa" -P""'
function ExportToExcel(Header: String;
vDataSet: TDataSet): Boolean;
var
I,VL_I,j: integer;
S,SysPath: string;
MsExcel:Variant;
begin
Result:=true;
if Application.MessageBox('您确信将数据导入到Excel吗?','提示!',MB_OKCANCEL + MB_DEFBUTTON1) = IDOK then
begin
SysPath:=ExtractFilePath(application.exename);
with TStringList.Create do
try
vDataSet.First ;
S:=S+Header;
// system.Delete(s,1,1);
add(s);
s:='';
For I:=0 to vDataSet.fieldcount-1 do
begin
If vDataSet.fields[I].visible=true then
S:=S+#9+vDataSet.fields[I].displaylabel;
end;
system.Delete(s,1,1);
add(s);
while not vDataSet.Eof do
begin
S := '';
for I := 0 to vDataSet.FieldCount -1 do
begin
If vDataSet.fields[I].visible=true then
S := S + #9 + vDataSet.Fields[I].AsString;
end;
System.Delete(S, 1, 1);
Add(S);
vDataSet.Next;
end;
Try
SaveToFile(SysPath+'\Tem.xls');
Except
ShowMessage('写文件时发生保护性错误,Excel 如在运行,请先关闭!');
Result:=false;
exit;
end;
finally
Free;
end;
Try
MSExcel:=CreateOleObject('Excel.Application');
Except
ShowMessage('Excel 没有安装,请先安装!');
Result:=false;
exit;
end;
Try
MSExcel.workbooks.open(SysPath+'\Tem.xls');
Except
ShowMessage('打开临时文件时出错,请检查'+SysPath+'\Tem.xls');
Result:=false;
exit;
end;
MSExcel.visible:=True;
for VL_I :=1 to 4 do
MSExcel.Selection.Borders[VL_I].LineStyle := 0;
MSExcel.cells.select;
MSExcel.Selection.HorizontalAlignment :=3;
MSExcel.Selection.Borders[1].LineStyle := 0; MSExcel.Range['A1'].Select;
MSExcel.Selection.Font.Size :=24; J:=0 ;
for i:=0 to vdataset.fieldcount-1 do
if vDataSet.fields[I].visible then
J:=J+1; VL_I :=J;
MSExcel.Range['A1:'+F_ColumnName(VL_I)+'1'].Select;
MSExcel.Range['A1:'+F_ColumnName(VL_I)+'1'].Merge;
end
else
Result:=false;
end;
PROCEDURE TGCFP.KIT_DBGRID_TO_EXCEL(SRC_DBG:TDBGRID);
VAR
EXCEL:VARIANT;
EXCEL_WORKBOOK:VARIANT;
EXCEL_WORKSHEET:VARIANT;
OPENDIALOG1:TOPENDIALOG;
I,J:INTEGER;
CUR_DIR:STRING;
BEGIN
TRY
{ SRC_DBG;
SRC_DBG.DATASOURCE.DATASET;
}
WITH SRC_DBG.DATASOURCE.DATASET DO
IF (BOF AND EOF) THEN
EXIT;
IF (SRC_DBG.DATASOURCE.DATASET.STATE=DSEDIT) OR (SRC_DBG.DATASOURCE.DATASET.STATE=DSINSERT) THEN
BEGIN
SHOWMESSAGE('數據表格處於編輯或新增記錄狀態,請保存或取消修改後重試一次');
EXIT;
END;
TRY
EXCEL:= CREATEOLEOBJECT('EXCEL.APPLICATION');
EXCEPT
SHOWMESSAGE('EXCEL MAY NOT BE INSTALLED');
ABORT;
EXIT;
END; OPENDIALOG1:=TOPENDIALOG.CREATE(SELF);
OPENDIALOG1.DEFAULTEXT := 'XLS';
OPENDIALOG1.FILTER := '*.XLS';
GETDIR(0,CUR_DIR);
OPENDIALOG1.INITIALDIR := CUR_DIR; IF OPENDIALOG1.EXECUTE THEN
BEGIN
IF FILEEXISTS(OPENDIALOG1.FILENAME) THEN
BEGIN
IF MESSAGEDLG('本程序固定將表格內容寫入所選EXCEL文件的左上方,視表格內容定佔用篇幅,如果你的EXCEL文件該區已有內容,則會被覆寫,要繼續嗎?',MTCONFIRMATION, [ MBNO,MBYES], 0) = MRNO THEN
EXIT;
EXCEL.WORKBOOKS.OPEN(OPENDIALOG1.FILENAME);
END
ELSE
EXCEL.WORKBOOKS.ADD(1);
END
ELSE
BEGIN
SHOWMESSAGE('未指定要保存的文件名,退出....');
EXIT;
END;
EXCEL_WORKBOOK :=EXCEL.APPLICATION.WORKBOOKS[1];
EXCEL_WORKSHEET :=EXCEL_WORKBOOK.WORKSHEETS[1]; FOR I:=0 TO SRC_DBG.COLUMNS.COUNT-1 DO
BEGIN
EXCEL_WORKSHEET.CELLS.ITEM[1,I+1]:=SRC_DBG.COLUMNS[I].TITLE.CAPTION;
END;
J:=2;
WITH SRC_DBG.DATASOURCE.DATASET DO
BEGIN
DISABLECONTROLS;
FIRST;
WHILE NOT EOF DO
BEGIN
FOR I:=0 TO SRC_DBG.COLUMNS.COUNT-1 DO
BEGIN
EXCEL_WORKSHEET.CELLS.ITEM[J,I+1]:= TRIM(FIELDBYNAME(SRC_DBG.COLUMNS[I].FIELDNAME).ASSTRING);
END;
NEXT;
J:=J+1;
END;
ENABLECONTROLS;
END;
EXCEL_WORKBOOK.SAVEAS(OPENDIALOG1.FILENAME);
EXCEL.APPLICATION.QUIT;
SHOWMESSAGE('成功保存到文件 : '+ OPENDIALOG1.FILENAME );
OPENDIALOG1.FREE;
EXCEPT
OPENDIALOG1.FREE;
SRC_DBG.DATASOURCE.DATASET.ENABLECONTROLS;
EXCEL.APPLICATION.QUIT;
EXCEL_WORKSHEET.FREE;
EXCEL_WORKBOOK.FREE;
EXCEL.FREE;
SHOWMESSAGE('保存失敗,請確認該文件是否處於打開狀態!確認將其關閉後再試一次!');
END;
END;
unit ExcelInterface;interface
uses Windows, SysUtils, Dialogs, ComObj, StdCtrls, OleServer, Excel97,
Variants;type
TExcelInterface = class
private
Cell1, Cell2, Range1: Variant;
WorkBook, WorkSheet: Variant;
FSheetCount: Integer;
procedure SetSheetCount(const Value: Integer);
public
exlApp: Variant;
property SheetCount: Integer read FSheetCount write SetSheetCount;
function CreateExcel: Boolean;
procedure OpenExcel(AFileName: String);
procedure SaveExcel(AFileName: String);
procedure NewWorkBook();
procedure NewSheet(ASheetName: String);
procedure DeleteSheet(ASheetIndex: Integer);overload;
procedure DeleteSheet(ASheetName: String);overload;
procedure SetContent(ACol,ARow: Integer;AText: String);
procedure SetActiveSheet(ASheetName: String);
procedure MergeCells(FirstRow,LastRow,FirstCol,LastCol: Integer);overload;
procedure MergeCells(ARange: Variant);overload;
procedure MergeCells;overload;
procedure SetRange(FirstRow,LastRow,FirstCol,LastCol: Integer);
procedure SetRowHeight(ARow: Integer;AHeight: Real);
procedure SetAlignment(HAlignment,VAlignment: LongInt);
procedure SetFont(Style:String; Size: Integer; Color: COLORREF;Bold: Boolean);
procedure SetRangeFormat(WrapText,AddIndent,ShrinkToFit: Boolean;Orientation: Integer);
procedure Free;overload;
end;
implementation{ TExcelInterface }function TExcelInterface.CreateExcel: Boolean;
begin
try
exlApp := CreateOleObject('Excel.Application');
WorkBook := CreateOleObject('Excel.Sheet');
WorkSheet := CreateOleObject('Excel.Sheet');
except
ShowMessage('您没有安装Microsoft Excel');
Result := False;
Exit;
end;
Result := True;
end;procedure TExcelInterface.DeleteSheet(ASheetIndex: Integer);
begin
WorkBook.Sheets[ASheetIndex].Delete;
SetSheetCount(exlApp.Sheets.Count);
end;procedure TExcelInterface.DeleteSheet(ASheetName: String);
begin
WorkBook.WorkSheets('"'+ASheetName+'"').Delete;
SetSheetCount(exlApp.Sheets.Count);
end;procedure TExcelInterface.Free;
begin
exlApp.Quit;
inherited;
end;procedure TExcelInterface.MergeCells(FirstRow, LastRow, FirstCol,
LastCol: Integer);
begin
SetRange(FirstRow,LastRow,FirstCol,LastCol);
Range1.Select;
exlApp.Selection.MergeCells := True;
end;procedure TExcelInterface.MergeCells(ARange: Variant);
begin
ARange.Select;
exlApp.Selection.MergeCells := True;
end;procedure TExcelInterface.MergeCells;
begin
Range1.Select;
exlApp.Selection.MergeCells := True;
end;procedure TExcelInterface.NewSheet(ASheetName: String);
begin
WorkSheet := WorkBook.WorkSheets.Add;
WorkSheet.Name := ASheetName;
SetSheetCount(exlApp.Sheets.Count);
end;procedure TExcelInterface.NewWorkBook();
begin
WorkBook := exlApp.WorkBooks.Add;
SetSheetCount(exlApp.Sheets.Count);
exlApp.Visible := True;
end;procedure TExcelInterface.OpenExcel(AFileName: String);
begin
WorkBook := exlApp.WorkBooks.Open(AFileName);
end;procedure TExcelInterface.SaveExcel(AFileName: String);
begin
WorkBook.SaveAs(AFileName);
WorkBook.Saved := True;
end;procedure TExcelInterface.SetActiveSheet(ASheetName: String);
begin
WorkBook.WorkSheets[ASheetName].Select;
WorkSheet := WorkBook.WorkSheets[ASheetName];
end;procedure TExcelInterface.SetAlignment(HAlignment, VAlignment: LongInt);
begin
Range1.HorizontalAlignment := HAlignment;
Range1.VerticalAlignment := VAlignment;
end;procedure TExcelInterface.SetFont(Style:String; Size: Integer;
Color: COLORREF; Bold: Boolean);
begin
Range1.Font.FontStyle := Style;
Range1.Font.Size := Size;
Range1.Font.Color := Color;
Range1.Font.Bold := Bold;
end;procedure TExcelInterface.SetRange(FirstRow, LastRow, FirstCol,
LastCol: Integer);
begin
Cell1 := WorkSheet.Cells.Item[FirstRow,FirstCol];
Cell2 := WorkSheet.Cells.Item[LastRow,LastCol];
Range1 := WorkSheet.Range[Cell1,Cell2];
end;procedure TExcelInterface.SetRangeFormat(WrapText, AddIndent,
ShrinkToFit: Boolean; Orientation: Integer);
begin
Range1.Select;
exlApp.Selection.WrapText := WrapText;
exlApp.Selection.Orientation := Orientation;
exlApp.Selection.AddIndent := AddIndent;
exlApp.Selection.ShrinkToFit := ShrinkToFit;
end;procedure TExcelInterface.SetRowHeight(ARow: Integer; AHeight: Real);
begin
WorkSheet.Rows[IntToStr(ARow) + ':' + IntToStr(ARow)].RowHeight := AHeight;
end;procedure TExcelInterface.SetContent(ACol, ARow: Integer; AText: String);
begin
WorkSheet.Cells.Item[ACol,ARow] := AText;
end;procedure TExcelInterface.SetSheetCount(const Value: Integer);
begin
FSheetCount := Value;
end;end.