procedure TForm1.Button2Click(Sender: TObject);
var
  i,n: Integer;
  xlsApp: Variant;
begin
  if ADODataSet1.Eof then begin
    ShowMessage('没有数据!');
    exit;
  end;
  xlsApp := CreateOleObject('Excel.Application');
  xlsapp.WorkBooks.add;
  xlsApp.Visible := false;
  xlsApp.WorkSheets[1].Activate;  ADODataSet1.First;
  i :=1;
  //填Excel标题行
  for n:=1 to ADODataSet1.FieldCount do xlsApp.Cells[i,n].Value := ADODataSet1.Fields[n-1].DisplayLabel;
  While not ADODataSet1.Eof do begin
    inc(i);//因在循环前使用了一次填标题行,所以在前面做增量
    for n:=1 to ADODataSet1.FieldCount do begin
       xlsApp.Cells[i,n].Value := ADODataSet1.Fields[n-1].AsString;
    end;  xlsApp.Range['A1','Q1'].HorizontalAlignment := -4108;
  xlsApp.Range['A1','Q1'].Font.Name := '宋体';
  xlsApp.Range['A1','Q1'].Font.Size := 9;
  xlsApp.Range['A1','Q'+inttostr(i)].Font.Name := '宋体';
  xlsApp.Range['A1','Q'+inttostr(i)].Font.Size := 9;    xlsApp.Columns[1].ColumnWidth := 8;
    xlsApp.Columns[2].ColumnWidth := 10;
    xlsApp.Columns[3].ColumnWidth := 45;
    xlsApp.Columns[4].ColumnWidth := 5;
    xlsApp.Columns[5].ColumnWidth := 6;
    xlsApp.Columns[6].ColumnWidth := 7;
    xlsApp.Columns[7].ColumnWidth := 7;
    xlsApp.Columns[8].ColumnWidth := 6;
    xlsApp.Columns[9].ColumnWidth := 8;
    xlsApp.ActiveSheet.Columns[1].NumberFormatLocal:= '@';
    xlsApp.ActiveSheet.Columns[7].NumberFormatLocal:= '@';
    xlsApp.ActiveSheet.Columns[8].NumberFormatLocal:= '@';    ADODataSet1.Next;
  end;
  xlsApp.Visible := true;
  end;导出代码, 导出后为什么日期那里会显示成那样,还有就是第二行为什么它不是文本模式的。我设置的是文本模式啊。

解决方案 »

  1.   

    在导出时,每个字段前加个文本符号好了'xlsApp.Cells[i,n].Value := ADODataSet1.Fields[n-1].AsString
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    xlsApp.Cells[i,n].Value := ''''+ADODataSet1.Fields[n-1].AsString
      

  2.   

    原因很简单
    xlsApp.ActiveSheet.Columns[1].NumberFormatLocal:= '@';
    xlsApp.ActiveSheet.Columns[7].NumberFormatLocal:= '@';
    xlsApp.ActiveSheet.Columns[8].NumberFormatLocal:= '@';
    这几句你放在了循环中,而且是在显示数据
    xlsApp.Cells[i,n].Value := ADODataSet1.Fields[n-1].AsString;
    之后,所以第一条数据相当于你未指定格式,才造成此问题,将上面三句放在
    显示数据之前