delphi用文件流从SQL导入数据到excel,请高手帮忙分析下代码
我用delphi7,用了两个数据库组件:adoconnection和adotable已连好数据库和表,请大大们帮们分析下。我已经分析好几天都没怎么有头绪。运行是可以的。但已点击按钮就报错。也没有生成我要的ECCEL表,刚接触文件流。
unit Unit1;interfaceuses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, DB, ADODB,comobj, StdCtrls, Grids, DBGrids;type TForm1 = class(TForm) Button1: TButton; Label1: TLabel; DBGrid1: TDBGrid; ADOConnection1: TADOConnection; ADOTable1: TADOTable; DataSource1: TDataSource; procedure Button1Click(Sender: TObject); private { Private declarations } public { Public declarations } end;var Form1: TForm1; arXlsBegin : array[0..5] of Word = ($809,8,0,$10,0,0); arXlsEnd : array[0..1] of Word = ($0A,00); arXlsString : array[0..5] of Word = ($204,0,0,0,0,0); arXlsNumber : array[0..4] of Word = ($203,14,0,0,0); arXlsInteger : array[0..4] of Word = ($27E,10,0,0,0); arXlsBlank : array[0..4] of Word = ($201,6,0,0,$17); Procedure ExportExcelFile(FileName : string;bWriteTitle : Boolean);implementation{$R *.dfm}//ㄏノゅン瑈Procedure ExportExcelFile(FileName : string;bWriteTitle : Boolean);var i,j :integer; Col,Row : word; ABookMark :TBookMark; aFileStream :TFileStream; procedure IncColRow;//糤︽咥 begin if Col = form1.ADOTable1.FieldCount -1 then begin Inc(Row); Col := 0; end else begin Inc(Col); end; end; procedure WriteStringCell(AValue : string); //嚴才﹃囒誹 var L: Word; begin L := Length(AValue); arXlsString[1] := 8 + L; arXlsString[2] := Row; arXlsString[3] := Col; arXlsString[5] := L; aFileStream.WriteBuffer(arXlsString,Sizeof(arXlsString)); aFileStream.WriteBuffer(Pointer(AValue)^,L); IncColRow; end; procedure WriteIntegerCell(AValue : integer);//嚴俱囒 var V: Integer; begin arXlsString[2] := Row; arXlsString[3] := Col; aFileStream.WriteBuffer(arXlsInteger,Sizeof(arXlsInteger)); V := (AValue shl 2) or 2; aFileStream.WriteBuffer(V,4); IncColRow; end; procedure WriteFloatCell(AValue : double);//嚴疊娀囒 begin arXlsString[2] := Row; arXlsString[3] := Col; aFileStream.WriteBuffer(arXlsNumber,Sizeof(arXlsNumber)); aFileStream.WriteBuffer(AValue,8); IncColRow; end; begin if FileExists(FileName) then begin aFileStream := TFileStream.Create(FileName,fmCreate); end; try //嚴ゅン壋 aFileStream.WriteBuffer(arXlsBegin,SizeOf(arXlsBegin));//嚴壋 Col := 0; Row := 0; if bWriteTitle then begin for i:= 0 to form1.ADOTable1.FieldCount-1 do begin WriteStringCell(form1.ADOTable1.Fields[i].FieldName); //嚴囒誹栋い囒誹 end; end; form1.ADOTable1.DisableControls; ABookMark := form1.ADOTable1.GetBookmark; form1.ADOTable1.First; while not form1.ADOTable1.Eof do begin for i:= 0 to form1.ADOTable1.FieldCount-1 do begin case form1.ADOTable1.Fields[i].DataType of ftSmallint,ftInteger,ftWord,ftAutoInc,ftBytes : WriteIntegerCell(form1.ADOTable1.Fields[i].AsInteger); ftFloat,ftCurrency,ftBCD : WriteFloatCell(form1.ADOTable1.Fields[i].AsFloat) else WriteStringCell(form1.ADOTable1.Fields[i].AsString); end; end; form1.ADOTable1.Next; //application.ProcessMessages; end; //嚴ゅンЮ aFileStream.WriteBuffer(arXlsEnd,SizeOf(arXlsEnd)); if form1.ADOTable1.BookmarkValid(ABookMark) then begin form1.ADOTable1.GotoBookmark(ABookMark); end; Finally aFileStream.Free; form1.ADOTable1.EnableControls; end;end;procedure TForm1.Button1Click(Sender: TObject);var t1,t2 : Int64;begin label1.Caption := '0'; t1 := GetTickCount; adotable1.Open; ExportExcelFile('d:\jiaban.xls',true); adotable1.EnableControls; t2 := GetTickCount; label1.Caption := IntToStr(t2-t1);end;end.
PCCU_CHAN_T pstChan = 441;PRS485_BOARD_T pstNode = 441;CHECK;443, &361, &ucAddr);444; 445;444;
/* 如果节点为空,直接返回,此处不该为空 */
CHECK;if (CCU_RESID == ulResId){*p431 = CCU_485_CCU_TYPE_CE;221; }
/* 如果注册消息长度为0,直接返回,此处不该为0 */CHECK_PARA_RTN_VALUE(pstNode->ulRegLen, 0, 11);
/* 部件类型存储在第一个字节 */442 = pstNode->ucRegInfo[0];
/* 校验部件类型的合法性 */if ( (CCU_485_PMU_TYPE_C9 != 442) &&(CCU_485_TCU_TYPE_CC != 442)
&&(CCU_485_FMU_TYPE_CA != 442)&&(CCU_485_EMU_TYPE_CF != 442)&&(CCU_485_EFUSE_TYPE_CB != 442)
&&(CCU_485_GATM_TYPE_B1 != 442)&&(CCU_485_ELOCK_TYPE_CD != 442)&&(CCU_485_CCU_TYPE_CE != 442))
{*p431 = CCU_485_INVALID_TYPE;return 11;}else{*p431 = (BOARD_TYPE)442;221;}}
45 执行485完整协议命令的API同步接口 FreeToPnPSynTxCB(ucIndex) 451 return ulRet 452
UINT32 Exec485ProtolCmd(UINT32 ulResId, UINT8 ucCmd, UINT8 *pucData, UINT32 ulLen)
{UINT8 ucIndex = 332;
UINT16 uwCmd = 323;UINT8 361 = 332;UINT8 ucAddr = 332;UINT32 ulRet = 352;
UINT32 ucCompleteCode = 352; PCCU_CHAN_T pstChan = 441;PRS485_BOARD_T pstNode = 441;
UINT8 aucBuf[MAX_485_DATA_LEN] = {0};UINT32 ulTempLen = MAX_485_DATA_LEN;
CHECK;443, &361, &ucAddr);444;445;444;/* 如果节点为空,直接返回,此处不该为空 */CHECK;
/* 添加发送控制表 */ulRet = AddToPnPSynTxTab(ulResId, ucCmd, &ucIndex, pucData, ulLen);
if ( CCU_OK != ulRet ){ 451;452;}uwCmd = (UINT16)(((UINT16)pstNode->431 << 8) + ucCmd);
/* 向pnp发送同步消息 */ulRet = SendAsyMsgToPnP(ulResId, uwCmd, (UINT16)ucIndex
, TO_PNP_SYNC_TYPE, pucData, ulLen);if ( CCU_OK != ulRet ){451;452;}
/* P同步信号量等待回应,此处不恒P,暂定2秒返回 */
if ( CCU_OK != ADA_SmP((INT32)381.ulSynId, CCU_5S_TICK) ){ 451;return CCU_ERR_MPI_SEM_TAKE_TIMEOUT;}
ulRet = GetCompleteCodeFromPnPSynTab(ulResId, ucIndex, ucCmd, &ucCompleteCode, aucBuf, &ulTempLen);
if ( CCU_OK != ulRet ){451;452;}/* 释放同步发送控制表 */451;
/* 此处今后还要丰富,因为有些命令应答字节非0时也表示命令执行成功 */return ucCompleteCode;}