我用ADO成功连接了EXCEL。但运行程序时却出错。说“JET OLEDB 4.0不能打开数据库(这里连接的是EXCEL),文件被独占使用......”之类的。
大哥们,这是什么回事啊?还有我打开连了DELPHI的那个excel文件也说打不开。关了delphi才打得开。
这样应该就是delphi独占了它了吧?

解决方案 »

  1.   

    你查看任务管理器,进程里面有EXCEL吧。程序调用了EXCEL后,没关的结果。
      

  2.   

    不是啊,任务管理器里没有EXCEL,不是楼上大哥所说的问题。
    下面我把我的代码贴上,你们看看:
    unit tryexcel;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, Grids, DBGrids, StdCtrls,ExtCtrls,ComObj;type
      TForm2 = class(TForm)
        Button1: TButton;
        DBGrid1: TDBGrid;
        OpenDialog1: TOpenDialog;
        procedure FormActivate(Sender: TObject);
        procedure Button1Click(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
      end;var
      Form2: TForm2;implementationuses dm1;{$R *.dfm}procedure TForm2.FormActivate(Sender: TObject);
    begin
    with dm1.DataModule1.ADOQuery1 do
    begin
    close;
    end;end;
    procedure TForm2.Button1Click(Sender: TObject);
    VAR XL: Variant; Sheet: Variant; SFileName:string; J:integer;
    begin
    TRY XL := GetActiveOleObject('Excel.Application');EXCEPT XL := CreateOleObject('Excel.Application');
    END;
    OpenDialog1.Execute;SFileName:=OpenDialog1.FileName;XL.WorkBooks.Open(SFileName);Sheet := XL.WorkBooks[XL.WorkBooks.Count].WorkSheets[1]; 
    WITH dm1.DataModule1.ADOQuery5 do
    BEGINclose;
    SQL.Clear;
    SQL.Add('select * from Table1');
    open;
    END;
    J:=2;
    WHILE (sheet.Cells[J,1].text<>'') and (sheet.Cells[J,2].text<>'') DO
     BEGIN
    dm1.DataModule1.ADOQuery5.FieldByName('学号').Value:=sheet.Cells[J,1].Value;
    dm1.DataModule1.ADOQuery5.FieldByName('姓名').Value:=sheet.Cells[J,2].Value;J:=J+1; END;
    dm1.DataModule1.ADOQuery5.UpdateBatch(); ShowMessage('成功接收Excel文件信息!');
    XL.Quit;end;end.
      

  3.   

    大哥们,这问题急啊!!!!!
    说白了就是delphi怎么能导入EXCEL里的表,还有的刚是相反的:怎么能把delphi里的gird的数据导进excel里。这功能应该很多系统都要实现的吧?!!
    请帮帮我吧!!
      

  4.   

    你是說通過delphi 將execl數据導入數据庫,是嗎.baidu一下
      

  5.   

    标准的二维表格Excel,直接把Excel文件当作ado的数据源,和其它数据库一样使用
      

  6.   

    uses ComObj
    {以下是导出的操作,假设是一个已经设置好格式的EXCEL文件,要对其作写入数据,写入后保存成另一个新文件:}procedure TForm1.Button1Click(Sender: TObject);
    var 
    ExcelApp: Variant;
    i,j:integer;
    begin
     if OpenDialog1.Execute  then begin
     
     ExcelApp := CreateOleObject( 'Excel.Application' );
     ExcelApp.Visible := false;
     ExcelApp.DisplayAlerts := False;
     ExcelApp.WorkBooks.Open( 'C:\Excel\Demo.xls' );{打开模块文件}
     with adoquery do begin
       close;
       open;
       i:=Fields.Count;{字段总数}
       j:=RecordCount;{多少行记录}
       for j:=1 to RecordCount-1 do begin
          for i:=0 to Fields.Count-1 do 
          ExcelApp.Cells[j+1,i].Value:=Fields[i].Value; 
       end;
     
     end;
     ExcelApp.ActiveWorkbook.SaveAs(OpenDialog1.FileName);{另存为一个新文件}
     end;
    end;
    {大概是这样,自已理解一下就行了}
      

  7.   

    有点笔误,以下修正一下:uses ComObj
    {以下是导出的操作,假设是一个已经设置好格式的EXCEL文件,要对其作写入数据,写入后保存成另一个新文件:}procedure TForm1.Button1Click(Sender: TObject);
    var 
    ExcelApp: Variant;
    i,j:integer;
    begin
     if OpenDialog1.Execute  then begin
     
     ExcelApp := CreateOleObject( 'Excel.Application' );
     ExcelApp.Visible := false;
     ExcelApp.DisplayAlerts := False;
     ExcelApp.WorkBooks.Open( 'C:\Excel\Demo.xls' );{打开模块文件}
     with adoquery do begin
       close;
       open;
       i:=Fields.Count;{字段总数}
       j:=RecordCount;{多少行记录}
       for j:=1 to RecordCount-1 do begin
          for i:=0 to Fields.Count-1 do 
          ExcelApp.Cells[j+1,i].Value:=Fields[i].Value; 
       end;
     
     end;
     ExcelApp.ActiveWorkbook.SaveAs(OpenDialog1.FileName);{另存为一个新文件}
     end;
    end;
    {大概是这样,自已理解一下就行了}
      

  8.   


    uses ComObj
    {以下是导出的操作,假设是一个已经设置好格式的EXCEL文件,要对其作写入数据,写入后保存成另一个新文件:}procedure TForm1.Button1Click(Sender: TObject);
    var 
    ExcelApp: Variant;
    i,j:integer;
    begin
     if OpenDialog1.Execute  then begin
     
     ExcelApp := CreateOleObject( 'Excel.Application' );
     ExcelApp.Visible := false;
     ExcelApp.DisplayAlerts := False;
     ExcelApp.WorkBooks.Open( 'C:\Excel\Demo.xls' );{打开模块文件}
     with adoquery do begin
       close;
       open;
       {i:=Fields.Count;字段总数}
       {j:=RecordCount;多少行记录}
       for j:=1 to RecordCount-1 do begin
          for i:=0 to Fields.Count-1 do 
          ExcelApp.Cells[j+1,i].Value:=Fields[i].Value; 
       end;
     
     end;
     ExcelApp.ActiveWorkbook.SaveAs(OpenDialog1.FileName);{另存为一个新文件}
     end;
    end;
    {大概是这样,自已理解一下就行了}
      

  9.   

    导出后还要多加以下两名结束EXCEL进程: ExcelApp.Quit;
     varclear(ExcelApp);
      

  10.   

    以下这段小程序供参考:
    procedure TForm1.Button1Click(Sender: TObject);
     var 
    sheet,sheet1,XLApp,workbook : variant;//sheet,sheet1,用来表示工作表的变量,如果你不只两个的话,还可以根据需要设置多几个变量begin
     XLApp:=createoleobject('excel.Application');
      xlApp.Visible:=true;
    //XLApp.displayAlerts:=false;
    //XLApp.ScreenUpdating:=false;
      xlApp.Workbooks.Add(xlWBATWorksheet);
        workbook := XLApp.workbooks[1];sheet:=workbook.worksheets[1];//第一个工作表
    sheet.name:='my first sheet';
    workbook.worksheets.add;sheet1:=workbook.worksheets[1];//第二个工作表
     sheet1.name:='second sheet';
    end;
    你的XL := CreateOleObject('Excel.Application');后加:XL.Visible:=true;然后加sheet,再给sheet个name,否则怎么能open?
    XL的建立代码写完后可以先测试是否成功,再接着写后面的代码。
      

  11.   

    9楼的“ExcelApp.WorkBooks.Open( 'C:\Excel\Demo.xls' );{打开模块文件}”中,'C:\Excel\Demo.xls' 是什么意思啊?我电脑没有这个文件啊。
    还有11楼中“xlApp.Workbooks.Add(xlWBATWorksheet); ”的xlWBATWorksheet是什么东西啊?
    可否说得详细点?