//cxGrid导出到Excel:通过数据集的方式导出------>数据量大时,还待继续优化,尽量加快导出Excel速度
//需要应用单元ComObj
function TWorkWindowForm.DataSetToExcel(cds_Temp: TClientDataSet; AcxGridDBTableView: TcxGridDBTableView; ToSavePath:string; var sMsg: string): Boolean;
var
XLS,WorkBook,WorkSheet: variant;
i,m,Row,Col,RecNums: integer;
sFieldName,
SheetName,
tmpSheetName: string;
nSheetNums,nLoopCount,nMaxRows: Integer;
cds_DataSet: TClientDataSet;
begin
Result := False;
//检查数据完整性
sMsg := '没有导出的数据或导出路径为空!';
if not cds_Temp.Active then exit;
if cds_Temp.RecordCount<=0 then exit;
if AcxGridDBTableView.DataController.RecordCount<=0 then Exit;
if ToSavePath = '' then Exit;
if FileExists(ToSavePath) then
begin
CopyFile(PChar(ToSavePath),PChar('C:\temp.xls'),True);
DeleteFile(ToSavePath);
end;
try
RecNums := 0;
nMaxRows := 65536; //Excel2003最大行数
nLoopCount := 1; //循环次数----->针对循环sheet页
Row := 2; //从第2行开始写内容
try
XLS := createoleobject('Excel.Application'); //创建Excel工程
WorkBook := XLS.WorkBooks.Add; //新增一个工作簿
WorkSheet := XLS.WorkSheets.Add; //新建一个Sheet
XLS.Visible := False;
SheetName := '数据目录1'; //第1个Sheet
WorkSheet.Name := SheetName; //Sheet名称
XLS.WorkSheets[SheetName].Activate;
XLS.WorkSheets['Sheet1'].Activate; //设置一个活动的Sheet
XLS.WorkSheets['Sheet1'].Delete; //删除
XLS.WorkSheets['Sheet2'].Activate;
XLS.WorkSheets['Sheet2'].Delete;
XLS.WorkSheets['Sheet3'].Activate;
XLS.WorkSheets['Sheet3'].Delete;
except
CopyFile(PChar('C:\temp.xls'),PChar(ToSavePath),True);
if FileExists('C:\temp.xls') then DeleteFile('C:\temp.xls');
sMsg := '创建Excel失败,请确认安装Excel2003或以上版本!';
end;
try
//写入表头
m := AcxGridDBTableView.ItemCount; //cxGrid列总数
for i:=0 to m-1 do
begin
XLS.cells[1,i+1]:=AcxGridDBTableView.Columns[i].Caption; //左上角第一个方格是[1,1]
end;
cds_DataSet := TClientDataSet.Create(nil);
cds_DataSet.Data := cds_Temp.Data;
RecNums := cds_DataSet.RecordCount;
try//写入Excel数据
cds_DataSet.DisableControls;
cds_DataSet.First;
while not cds_DataSet.Eof do
begin
for Col := 1 to m do
begin
sFieldName := AcxGridDBTableView.Columns[Col-1].DataBinding.FieldName;
XLS.cells[Row,Col] := cds_DataSet.FieldByName(sFieldName).AsString;
end;
Inc(Row);
if Row > nMaxRows then
begin
Inc(nLoopCount); //循环次数
//建立第下一个Sheet页,继续写数据
SheetName := '数据目录'+inttostr(nLoopCount); //第i个Sheet
WorkSheet := XLS.WorkSheets.Add; //新建一个Sheet
XLS.Visible := False;
WorkSheet.Name := SheetName; //Sheet名称
XLS.WorkSheets[SheetName].Activate;
//写入表头
m := AcxGridDBTableView.ItemCount; //cxGrid列总数
for i:=0 to m-1 do
begin
XLS.cells[1,i+1]:=AcxGridDBTableView.Columns[i].Caption; //左上角第一个方格是[1,1]
end;
Row := 2; //从第i个Sheet,第2行开始写内容
end;
cds_DataSet.Next;
end;
finally
cds_DataSet.EnableControls;
FreeAndNil(cds_DataSet);
end;
Except
CopyFile(PChar('C:\temp.xls'),PChar(ToSavePath),True);
if FileExists('C:\temp.xls') then DeleteFile('C:\temp.xls');
sMsg := '写入Excel内容失败!';
end;
XLS.WorkBooks[1].SaveAs(ToSavePath, 56); //fileformat:=56 -- Office Excel 97-2003 format
finally
XLS.WorkBooks.Close; //关闭工作簿
if not VarIsEmpty(XLS) then
XLS.Quit;
XLS := Unassigned;
if FileExists('C:\temp.xls') then DeleteFile('C:\temp.xls');
end;
Result := True;
Application.MessageBox(PChar('数据导出完毕,共计'+ inttostr(RecNums) + '条!'),'提示',MB_ICONINFORMATION + MB_OK);
end;