TADODataSet组件的郁闷我用delphi访问excel表,其中有一个表名是sheet1,第一次执行下面语句系列时正常,当执行了一个将数据库表保存为excel的函数后(函数名:Save2File,见后面附件),再执行到frmmain.ADODataSet1.Active:=true;时,都是提示数据库引擎找不到对象sheet1$,很郁闷,不知道为什么
  ......
  frmmain.ADODataSet1.Close;
  frmmain.ADODataSet1.CommandText := 'sheet1$';
  frmmain.ADODataSet1.Active:=true;
  frmmain.ADOCon.Connected:=true;
  frmmain.DBGrid1.ReadOnly:=true;
  ......附件:将数据库表保存为excel文件的函数------------------------------------
unit func1;interfaceUses
 DB, Classes;var
 CXlsBof: array[0..5] of Word = ($809, 8, 0, $10, 0, 0);
 CXlsEof: array[0..1] of Word = ($0A, 00);
 CXlsLabel: array[0..5] of Word = ($204, 0, 0, 0, 0, 0);
 CXlsNumber: array[0..4] of Word = ($203, 14, 0, 0, 0);
 CXlsRk: array[0..4] of Word = ($27E, 10, 0, 0, 0);
 CXlsBlank: array[0..4] of Word = ($201, 6, 0, 0, $17);Type
 TDS2Excel = Class(TObject)
 Private
   FCol: word;
   FRow: word;
   FDataSet: TDataSet;
   Stream: TStream;
   FWillWriteHead: boolean;
   FBookMark: TBook;
   procedure IncColRow;
   procedure WriteBlankCell;
   procedure WriteFloatCell(const AValue: Double);
   procedure WriteIntegerCell(const AValue: Integer);
   procedure WriteStringCell(const AValue: string);
   procedure WritePrefix;
   procedure WriteSuffix;
   procedure WriteTitle;
   procedure WriteDataCell;
   procedure Save2Stream(aStream: TStream);
 Public
   procedure Save2File(FileName: string; WillWriteHead: Boolean);
   Constructor Create(aDataSet: TDataSet);
 end;implementationuses SysUtils;Constructor TDS2Excel.Create(aDataSet: TDataSet);
begin
 inherited Create;
 FDataSet := aDataSet;
end;procedure TDS2Excel.IncColRow;
begin
 if FCol = FDataSet.FieldCount - 1 then
 begin
   Inc(FRow);
   FCol :=0;
 end
 else
   Inc(FCol);
end;procedure TDS2Excel.WriteBlankCell;
begin
 CXlsBlank[2] := FRow;
 CXlsBlank[3] := FCol;
 Stream.WriteBuffer(CXlsBlank, SizeOf(CXlsBlank));
 IncColRow;
end;procedure TDS2Excel.WriteFloatCell(const AValue: Double);
begin
 CXlsNumber[2] := FRow;
 CXlsNumber[3] := FCol;
 Stream.WriteBuffer(CXlsNumber, SizeOf(CXlsNumber));
 Stream.WriteBuffer(AValue, 8);
 IncColRow;
end;procedure TDS2Excel.WriteIntegerCell(const AValue: Integer);
var
 V: Integer;
begin
 CXlsRk[2] := FRow;
 CXlsRk[3] := FCol;
 Stream.WriteBuffer(CXlsRk, SizeOf(CXlsRk));
 V := (AValue shl 2) or 2;
 Stream.WriteBuffer(V, 4);
 IncColRow;
end;procedure TDS2Excel.WriteStringCell(const AValue: string);
var
 L: Word;
begin
 L := Length(AValue);
 CXlsLabel[1] := 8 + L;
 CXlsLabel[2] := FRow;
 CXlsLabel[3] := FCol;
 CXlsLabel[5] := L;
 Stream.WriteBuffer(CXlsLabel, SizeOf(CXlsLabel));
 Stream.WriteBuffer(Pointer(AValue)^, L);
 IncColRow;
end;procedure TDS2Excel.WritePrefix;
begin
 Stream.WriteBuffer(CXlsBof, SizeOf(CXlsBof));
end;procedure TDS2Excel.WriteSuffix;
begin
 Stream.WriteBuffer(CXlsEof, SizeOf(CXlsEof));
end;procedure TDS2Excel.WriteTitle;
var
 n: word;
begin
 for n := 0 to FDataSet.FieldCount - 1 do
   WriteStringCell(FDataSet.Fields[n].DisplayLabel);
end;procedure TDS2Excel.WriteDataCell;
var
 n: word;
begin
 WritePrefix;
 if FWillWriteHead then WriteTitle;
 FDataSet.DisableControls;
 FBookMark := FDataSet.GetBook;
 FDataSet.First;
 while not FDataSet.Eof do
 begin
   for n := 0 to FDataSet.FieldCount - 1 do
   begin
     if FDataSet.Fields[n].IsNull then
       WriteBlankCell
     else begin
       case FDataSet.Fields[n].DataType of
         ftSmallint, ftInteger, ftWord, ftAutoInc, ftBytes:
             WriteIntegerCell(FDataSet.Fields[n].AsInteger);
         ftFloat, ftCurrency, ftBCD:
             WriteFloatCell(FDataSet.Fields[n].AsFloat);
       else
         WriteStringCell(FDataSet.Fields[n].AsString);
       end;
     end;
   end;
   FDataSet.Next;
 end;
 WriteSuffix;
 if FDataSet.BookValid(FBookMark) then FDataSet.GotoBook(FBookMark);
 FDataSet.EnableControls;
end;procedure TDS2Excel.Save2Stream(aStream: TStream);
begin
 FCol := 0;
 FRow := 0;
 Stream := aStream;
 WriteDataCell;
end;procedure TDS2Excel.Save2File(FileName: string; WillWriteHead: Boolean);
var
 aFileStream: TFileStream;
begin
 FWillWriteHead := WillWriteHead;
 if FileExists(FileName) then DeleteFile(FileName);
 aFileStream := TFileStream.Create(FileName, fmCreate);
 Try
   Save2Stream(aFileStream);
 Finally
   aFileStream.Free;
 end;
end;end.

解决方案 »

  1.   

    很郁闷,重新初始化了还是提示数据库引擎找不到对象sheet1$
      

  2.   

    执行下面代码后,DBGrid里显示excel里的内容,如果不执行问题中的数据库转excel函数(函数名:Save2File),则再次执行下面代码是正常的;如果执行了数据库转excel函数(Save2File),则再次执行下面代码时就出错了,提示:Microsoft Jet 数据库引擎找不到对象'sheet1$',请确定对象是否存在,并正确地写出它的名称和路径。
      ...... 
      frmmain.ADODataSet1.Close; 
      frmmain.ADODataSet1.CommandText := 'sheet1$'; 
      frmmain.ADODataSet1.Active:=true; 
      frmmain.ADOCon.Connected:=true; 
      frmmain.DBGrid1.ReadOnly:=true; 
      ...... 
      

  3.   

    应该是
    frmmain.ADOCon.Connected:=true;//先要建立数据库连接再打开数据集吧 
    frmmain.ADODataSet1.Close; 
    frmmain.ADODataSet1.CommandText := 'sheet1$'; 
    frmmain.ADODataSet1.Active:=true; 
    frmmain.DBGrid1.ReadOnly:=true;