导出Excel1 - 项目分解篇
我们在全部的MIS系统(信息管理系统)中都能见到他。所以我们把这个通用功能提出来。
项目名称:车辆信息管理系统(中石化石炼)
项目负责人:xiaobin
项目时间:2006.12 - 2007.2
Excel功能模块:
单击事件(Event):
procedure EXCELE1Click(Sender: TObject);
procedure TfrmMain.EXCELE1Click(Sender: TObject); var colnum,slnum,i:integer; headstr:string; begin if DataSource_carNum.DataSet.RecordCount=0 then Exit; // DataModule_ado.ADODataSet_Excel.Close; DataModule_ado.ADODataSet_Excel.Open; // TreeView1.Items.Clear; Memo2.Lines.Clear ; colnum:=DataModule_ado.ADODataSet_Excel.FieldDefList.Count; Maxnum :=1; //slnum:=0; for i:=1 to colnum do begin slnum:=1; headstr:=DataModule_ado.ADODataSet_Excel.FieldDefList[i-1].Name; while Pos('|',headstr) > 0 do begin Delete(headstr, 1, Pos('|', headstr)); slnum:=slnum+1; end; if slNum>Maxnum then Maxnum:=slNum; end; treeADO(DataModule_ado.ADODataSet_Excel,TreeView1); try myexcel := createoleobject('excel.application'); myexcel.application.workbooks.add; myexcel.caption:=pnlLog.Caption; myexcel.application.visible:=true; workbook:=myexcel.application.workbooks[1]; worksheet:=workbook.worksheets.item[1]; except application.MessageBox('没有发现Excel,请安装office!','提示信息', MB_OK + MB_ICONINFORMATION); exit; end; WriteheaderADO(DataModule_ado.ADODataSet_Excel,pnlLog.Caption,9,TreeView1); WriteExcelData(DataModule_ado.ADODataSet_Excel); //页脚设置 myexcel.activesheet.pagesetup.centerfooter:='第&P页'; // worksheet.saveAs(excelDir+'\'+dateTimeStrFull+'lcbzsx.xls'); //workbook.close; //myexcel.quit; //add logmemo frame1.addMemoLog(EXCELE1.Caption); end;
代码凝视:
第6行:假设DataSource(Delphi控件)当前无数据,则退出此事件。
第8行:DataModule_ado为DataModule(Delphi控件 - 数据容器)
第13行:依据ADODataSet_Excel(Delphi控件 - ADODataSet)字段列表。得到Excel列数。
第20-24行:多表头层数计算。
大部分我们用:父表头|子表头|孙表头,来表示一个多表头数据。
第27行:运行treeADO子过程,把表头的层次关系用TreeView(Delphi控件)表示出来。
第28-39行:初始化Excel对象。
myExcel:variant; //电子表格对象
workbook:olevariant; //电子表格部分
worksheet:olevariant; //电子表格工作簿
第40行:运行WriteheaderADO子过程。写Excel表头。
第41行:运行WriteExcelData子过程, 写Excel数据。