FWorkSheet:=FExcel.WorkBooks[1].WorkSheets[1];
FWorkSheet.Range[RangeStr].Value:=FArray;
这2句中说worksheets 和value没有定义。
 请问是什么原因?
谢谢

解决方案 »

  1.   

    FWorkSheet:=FExcel.WorkSheets[1];直接这样吧
      

  2.   

    unit Main;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, ExtCtrls, Buttons, Grids, DBGrids, DB, ADODB, StdCtrls, ComCtrls,Comobj,
      Vcl.XPMan;type
      TFrmMain = class(TForm)
        Panel1: TPanel;
        Panel2: TPanel;
        SpeedButton1: TSpeedButton;
        DBGrid1: TDBGrid;
        ADODataSet1: TADODataSet;
        ADOConnection1: TADOConnection;
        DataSource1: TDataSource;
        Label1: TLabel;
        DateTimePicker1: TDateTimePicker;
        Label2: TLabel;
        DateTimePicker2: TDateTimePicker;
        Edit1: TEdit;
        Label3: TLabel;
        SpeedButton2: TSpeedButton;
        SpeedButton3: TSpeedButton;
        Button1: TButton;
        XPManifest1: TXPManifest;
        FontDialog1: TFontDialog;
        procedure SpeedButton1Click(Sender: TObject);
        procedure FormCreate(Sender: TObject);
        procedure SpeedButton2Click(Sender: TObject);
        procedure SpeedButton3Click(Sender: TObject);
        procedure Button1Click(Sender: TObject);
      private
      procedure DBGridSaveXLS(aDBGrid:TDBGrid;sFileName:string);
        { Private declarations }
      public
        { Public declarations }
      end;var
      FrmMain: TFrmMain;implementation{$R *.dfm}
    procedure TFrmMain.DBGridSaveXLS(aDBGrid:TDBGrid;sFileName:string);function LineFeedsToXLS(s:string):string;
    var
    Res:string;
         i:Integer;
     begin
        Res:='';
        for i:=1 to Length(s) do
        if s[i] <>#13 then
        Res:=Res+s[i];
        Result:=res;
    end;
    var
    FExcel:Variant;
    FWorkbook:Variant;
    FWorksheet:Variant;
    FArray:Variant;
    s,z:Integer;
    RangeStr,sTitle:string;
    aBookMark:TBookMark;
    StrtCol,StrtRow,RowCount,ColCount:Integer;
    begin
    Screen.Cursor:=crHourGlass;
    try
      FExcel:=CreateOleObject('excel.application');
    except
    Screen.cursor:=crDefault;
    MessageDlg('Could?not?start?Microsoft?Excel!',mtError,[mbCancel],0);
    Exit;
    end;
       aBookMark:=aDBGrid.DataSource.DataSet.GetBookMark;
        aDBGrid.DataSource.DataSet.DisableControls;
    try
         StrtCol:=0;
         StrtRow:=0;
        FWorkBook:=FExcel.WorkBooks.Add;
        //FWorkSheet?:=?FWorkBook.WorkSheets.Add;
        FWorkSheet:=FExcel.WorkBooks[1].WorkSheets[1];
        RowCount:=aDBGrid.DataSource.DataSet.RecordCount+1;//加上標題行
         ColCount:=aDBGrid.Columns.Count;
         FArray:=VarArrayCreate([0,RowCount-1-StrtRow,0,ColCount-1-StrtCol],VarVariant);//Title
         for z:=StrtCol to ColCount - 1 do
    begin
       sTitle:=aDBGrid.Columns[z].Title.Caption;
       if sTitle=''then
       sTitle:=aDBGrid.Columns[z].FieldName;
        FArray[0,z - StrtCol]:=LineFeedsToXLS(sTitle);
    end;
    //data
    {for s := StrtRow to RowCount - 1 do
     for z := StrtCol to ColCount - 1 do
    FArray[s - StrtRow, z - StrtCol] := LineFeedsToXLS();}s:=1;//s := StrtRow;
    aDBGrid.DataSource.DataSet.First;
       while not aDBGrid.DataSource.DataSet.Eof do
    begin
    for z:=StrtCol to ColCount - 1 do
    FArray[s-StrtRow, z-StrtCol]:=LineFeedsToXLS(aDBGrid.Columns[z].Field.DisplayText);
    Inc(s);
    aDBGrid.DataSource.DataSet.Next;
    end;
        RangeStr:='A1:';
    if (ColCount-StrtCol) > 26 then
    begin
    if (ColCount-StrtCol) mod 26 = 0 then
    begin
      RangeStr:=RangeStr+Chr(Ord('A')- 2 + ((ColCount - StrtCol) div 26));
      RangeStr:=RangeStr + 'Z';
    end
    else
    begin
    RangeStr:=RangeStr + Chr(Ord('A') - 1 + ((ColCount - StrtCol) div 26));
    RangeStr:=RangeStr + Chr(Ord('A') - 1 + ((ColCount - StrtCol) mod 26));
    end;
    end
    else
    RangeStr:=RangeStr + Chr(Ord('A') - 1 + (ColCount - StrtCol));
    RangeStr:=RangeStr + IntToStr(RowCount - StrtRow);
    FWorkSheet.Range[RangeStr].Value:=FArray;
    if sFileName <> '' then
    begin
    FWorkbook.SaveAs(sFileName);
    FExcel.Quit;
    FExcel:=unAssigned
    end
    else
    FExcel.Visible:=True;
    finally
    aDBGrid.DataSource.DataSet.GotoBookMark(aBookMark);
    aDBGrid.DataSource.DataSet.EnableControls;
    aDBGrid.DataSource.DataSet.FreeBookMark(aBookMark);
    Screen.Cursor:=crDefault;end;
    end;procedure TFrmMain.SpeedButton1Click(Sender: TObject);
    var
      StartDate,
      EndDate:string;
      SQLStr:string;
    begin
      StartDate := DateToStr(DateTimePicker1.Date)+' 00:00:00';
      EndDate := DateToStr(DateTimePicker2.Date)+' 23:59:59';
      SQLStr :='SELECT CONVERT(VARCHAR(30), VPE.DATUMUHRZEIT,111) AS DATE, LP_TYPE.TYP_DESC,AVG(LP_DATA.lichtstrom) AS AVG_LUMEN '+
             ' FROM LP_DATA INNER JOIN VPE ON LP_DATA.ID_VPE=VPE.ID_VPE '+
             ' INNER JOIN LP_TYPE ON LP_DATA.ID_TYP=LP_TYPE.ID_TYP '+
             ' WHERE VPE.DATUMUHRZEIT BETWEEN '+QuotedStr(StartDate)+
            ' and '+ QuotedStr(EndDate) +' GROUP BY LP_TYPE.TYP_DESC, '+
    ' CONVERT(VARCHAR(30),VPE.DATUMUHRZEIT,111)';  ADODataSet1.Active := False;
      ADODataSet1.CommandText := SQLStr;
      ADODataSet1.Active := True;
    end;procedure TFrmMain.Button1Click(Sender: TObject);
    begin
    with TopenDialog.Create(nil) do
      begin
      DBGRIDSAVEXLS(dbgRID1,' ');
      end;
    end;
    procedure TFrmMain.FormCreate(Sender: TObject);
    begin
      ADOConnection1.Connected := False;
      ADOConnection1.Connected := True;
      ADODataSet1.Active := False;
      ADODataSet1.Active := True;
    end;
      

  3.   

    procedure TFrmMain.Button1Click(Sender: TObject);
    begin
    with TopenDialog.Create(nil) do
      begin
      DBGRIDSAVEXLS(dbgRID1,' ');
      end;
    endButton1的点击事件修改成这样试下:
    procedure TFrmMain.Button1Click(Sender: TObject);
    begin
      DBGRIDSAVEXLS(dbgRID1,' ');
    end