读书人

大侠帮忙看看下面代码解决办法

发布时间: 2012-02-12 17:16:33 作者: rapoo

大侠帮忙看看下面代码
将数据库数据导入到excel文件时,从网上看到通过文件流的形式实现的,但有些代码看不懂,希望大家帮忙看看:数组初始化:
1)$809,$10,$0A等什么意思?
2)arXlsString[1] := 8 + L;又是什么?
var
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; aDataSet: TDataSet);
var
 i, j: integer;
 Col, row: word;
 ABookMark: TBookMark;
 aFileStream: TFileStream;
 
procedure incColRow; //增加行列号
begin
 if Col = ADataSet.FieldCount - 1 then
 begin
  Inc(Row);
  Col :=0;
 end
 else
  Inc(Col);
 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
 arXlsInteger[2] := Row;
 arXlsInteger[3] := Col;
 aFileStream.WriteBuffer(arXlsInteger, SizeOf(arXlsInteger));
 V := (AValue shl 2) or 2;
 aFileStream.WriteBuffer(V, 4);
 IncColRow;
end;
procedure WriteFloatCell(AValue: double);//写浮点数
begin
 arXlsNumber[2] := Row;
 arXlsNumber[3] := Col;
 aFileStream.WriteBuffer(arXlsNumber, SizeOf(arXlsNumber));
 aFileStream.WriteBuffer(AValue, 8);
 IncColRow;
end;
begin
if FileExists(FileName) then DeleteFile(FileName); //文件存在,先删除
 aFileStream := TFileStream.Create(FileName, fmCreate);
 Try
  //写文件头
  aFileStream.WriteBuffer(arXlsBegin, SizeOf(arXlsBegin));
  //写列头
  Col := 0; Row := 0;
  if bWriteTitle then
  begin
   for i := 0 to aDataSet.FieldCount - 1 do
    WriteStringCell(aDataSet.Fields[i].FieldName);
   end;
   //写数据集中的数据
   aDataSet.DisableControls;
   ABookMark := aDataSet.GetBookmark;


   aDataSet.First;
   while not aDataSet.Eof do
   begin
    for i := 0 to aDataSet.FieldCount - 1 do
     case ADataSet.Fields[i].DataType of
      ftSmallint, ftInteger, ftWord, ftAutoInc, ftBytes:
      WriteIntegerCell(aDataSet.Fields[i].AsInteger);
      ftFloat, ftCurrency, ftBCD:
      WriteFloatCell(aDataSet.Fields[i].AsFloat)
     else
      WriteStringCell(aDataSet.Fields[i].AsString);
     end;
     aDataSet.Next;
    end;
    //写文件尾
    AFileStream.WriteBuffer(arXlsEnd, SizeOf(arXlsEnd));
    if ADataSet.BookmarkValid(ABookMark) then aDataSet.GotoBookmark(ABookMark);
    Finally
     AFileStream.Free;
    ADataSet.EnableControls;
   end;
 end;


[解决办法]
没看完代码,因为有点长.

1)$809,$10,$0A等什么意思?
-------以$开头,表明这是一个十六进制表示的立即数,如$809就是十进制的2057,$10就是十进制的16,$0A就是十进制的10


2)arXlsString[1] := 8 + L;又是什么?
------这是一个赋值语句,即:让arXlsString数组的第2个元素值为表达式8+L的运算结果,而L已知是Length(AValue)即字符串AValue的长度.

读书人网 >.NET

热点推荐