请问如何用delphi程序实现,将EXCEL导入ACCESS数据库,谢谢!

解决方案 »

  1.   

    procedure TF_Main.ToolButtonExcelClick(Sender: TObject);
    var
      OpenDialog:TOpenDialog;
      iCount:integer;
    begin
      if ShowIYN('是否真的要导入Excel数据,要生的数据将被删除?')<>IDCANCEL then
      try
        OpenDialog:=TOpenDialog.Create(Self);
        OpenDialog.DefaultExt := 'xls';
        OpenDialog.Filter := 'Microsoft Excel 文件  (*.xls)|*.xls';
        OpenDialog.Execute;
        if OpenDialog.FileName<>'' then
        try
          Screen.Cursor:=crSqlWait;
          ADOConExcel.Close;
          ADOConExcel.ConnectionString:='Provider=Microsoft.Jet.OLEDB.4.0;Data
    Source='
                                            +OpenDialog.FileName+';Extended
    Properties=Excel 8.0;Persist Security Info=False';
          ADOConExcel.Open;
          with ADOQryExcel do
          begin
            Close;
            Sql.Clear;
            Sql.Add('SELECT 材料编号,百平米用量,预算价,最低价 FROM
    [Sheet1$]');
            Prepared:=true;
            Open;
          end;
          iCount:=ADOQryExcel.RecordCount;
          ADOConExcel.BeginTrans;
          with F_DataModule.ADOCom do
          begin
            CommandText:='DELETE FROM MatPriCal WHERE
    cYearMonth='+''''+FormatDateTime('yyyymm',DateTimePicker.DateTime)+'''';
            Execute;
          end;
          ADOQryExcel.First;
          while not ADOQryExcel.Eof do
          begin
            with F_DataModule.ADOCom do
            begin
              CommandText:='INSERT INTO MatPriCal
    VALUES('+''''+FormatDateTime('yyyymm',DateTimePicker.DateTime)+''''+','+''
    ''+Trim(ADOQryExcel.FieldByName('材料编号
    ').AsString)+''''+','+Trim(ADOQryExcel.FieldByName('百平米用量
    ').AsString)+','+Trim(ADOQryExcel.FieldByName('预算价
    ').AsString)+','+Trim(ADOQryExcel.FieldByName('最低价').AsString)+')';
              Execute;
            end;
            ADOQryExcel.Next;
            F_Main.StatusBar.Refresh;
            F_Main.StatusBar.Panels[2].text:='当前数
    :'+IntToStr(ADOQryExcel.RecNo)+'(共'+IntToStr(iCount)+'条)';
          end;
          ADOConExcel.CommitTrans;
          ShowWIE(2,'导入成功!');
        except
          ADOConExcel.RollbackTrans;
          ShowWIE(2,'导入失败!');
        end;
      finally
        ADOQryExcel.Close;
        ADOConExcel.Close;
        OpenDialog.Free;
        Screen.Cursor:=crDefault;
        F_Main.StatusBar.Panels[2].Text:='';
      end;
    end;或用sql 自带的openrowset,参考程序
    if ShowIYN('是否真的要导入Excel数据?')<>IDCANCEL then
      try
        ADOConInfoExcel.Open;
        OpenDialog:=TOpenDialog.Create(Self);
        OpenDialog.DefaultExt := 'xls';
        OpenDialog.Filter := 'Microsoft Excel 文件  (*.xls)|*.xls';
        OpenDialog.Execute;
        if OpenDialog.FileName<>'' then
        try
          with ADOQryInfoExcel do
          begin
            Close;
            Sql.Clear;
            Sql.Add(' SELECT TOP 1 * FROM OPENROWSET');
            Sql.Add('(');
            Sql.Add('''MSDASQL.1''');
            Sql.Add(',');
            Sql.Add('''DRIVER=Microsoft Excel Driver (*.xls);');
            Sql.Add('DBQ='+OpenDialog.FileName+'''');
            Sql.Add(',');
            Sql.Add('''SELECT * FROM [Sheet1$]''');
            Sql.Add(')');
            Open;
          end;
          if Copy(ADOQryInfoExcel.Fields[2].AsString,1,4)<>mUser.UserArea
    then
          begin
            ShowWIE(1,'不能导入其它地区数据!');
            ADOQryInfoExcel.Close;
            ADOConInfoExcel.Close;
            exit;
          end;
          //ADOConInfoExcel.BeginTrans;
          with ADOComInfoExcel do
          begin
            CommandText:=' UPDATE C';
            CommandText:=CommandText+' SET C.MNo=A.类别编码,C.MName=A.材料名称
    ,C.spec=A.材料规格,C.unit=A.材料单位,C.Factory=A.生产厂家,C.TradeMark=A.厂
    牌,C.Price=A.材料单价,C.pingyin=A.材料拼音,C.hs=A.换算系数 FROM
    InfoPrice'+mUser.UserArea;
            CommandText:=CommandText+' C,  OPENROWSET';
            CommandText:=CommandText+'(';
            CommandText:=CommandText+'''MSDASQL.1''';
            CommandText:=CommandText+',';
            CommandText:=CommandText+'''DRIVER=Microsoft Excel Driver
    (*.xls);';
            CommandText:=CommandText+'DBQ='+OpenDialog.FileName+'''';
            CommandText:=CommandText+',';
            CommandText:=CommandText+'''SELECT * FROM [Sheet1$]''';
            CommandText:=CommandText+') A WHERE C.RDate=A.发布日期 AND
    C.RNO=A.发布编号 AND C.Area=A.地区编码';
            Execute;
            CommandText:=' INSERT INTO InfoPrice'+mUser.UserArea;CommandText:=CommandText+'(RDate,RNO,Area,MNo,MName,spec,unit,Factory,Trad
    eMark,Price,pingyin,hs) ';
            CommandText:=CommandText+' SELECT 发布日期,发布编号,地区编码,类别
    编码,材料名称,材料规格,材料单位,生产厂家,厂牌,材料单价,材料拼音,换算系数
    FROM  OPENROWSET';
            CommandText:=CommandText+'(';
            CommandText:=CommandText+'''MSDASQL.1''';
            CommandText:=CommandText+',';
            CommandText:=CommandText+'''DRIVER=Microsoft Excel Driver
    (*.xls);';
            CommandText:=CommandText+'DBQ='+OpenDialog.FileName+'''';
            CommandText:=CommandText+',';
            CommandText:=CommandText+'''SELECT * FROM [Sheet1$]''';
            CommandText:=CommandText+') A';
            CommandText:=CommandText+' WHERE NOT EXISTS(SELECT 1 FROM
    InfoPrice'+mUser.UserArea+' C';
            CommandText:=CommandText+' WHERE C.RDate=A.发布日期 AND C.RNO=A.发
    布编号 AND C.Area=A.地区编码)';
            Execute;
          end;
          //ADOConInfoExcel.CommitTrans;
          RefreshGridData;
          ShowWIE(2,'导入成功!');
        except
          //ADOConInfoExcel.RollbackTrans;
          ShowWIE(2,'导入失败!');
        end;
      finally
        ADOQryInfoExcel.Close;
        ADOConInfoExcel.Close;
        OpenDialog.Free;
      end;
      

  2.   

    use ComObj,{Access2000}var
      AA: OleVariant;  try
        //创建Access Application对象,并打开Access临时数据库
        AA:=CreateOleObject('Access.Application');
        if not FileExists(sTempPath)
          then AA.NewCurrentDatabase(sTempPath)
          else AA.OpenCurrentDatabase(sTempPath,False);
        AA.DoCmd.TransferSpreadsheet(acImport,acSpreadsheetTypeExcel8,sacTableName,sPathNameStr,true,'');
        AA.CloseCurrentDatabase;
      except
        WARNING('文件格式有误,转换过程中发生错误!');
      end;
      if FileExists(sTempPath) then DeleteFile(sTempPath);
      

  3.   

    if FileExists(sTempPath) then DeleteFile(sTempPath);
    这句不要,我这儿是删除临时产生的Access文件。
      

  4.   

    把Excel和WORD内的数据导入数据库的控件(V2.0版)
    一个批量导入数据的控件也就是,把Excel和WORD内的数据导入数据的控件!!
    有需要请到http://api8.8u8.com/Excel1.rar下载!!
    本控只有一个方法和3个属性!!
    本控件为V2。0版注:本版为V2。0版,可以导入SQL、Access、Oracle等数据库~~
    本控件只有一个方法(mygaoload),4个要设置的属性(DatabaseName、RecordSource、wordtable、ExcelRows)!!下面让我一一说明!!
    1。mygaoload(方法)     该方法,在正确的设置好上面所说的4个属性后,就会调用出一个对话框让用户选择Excel或word的文件(运行时才知)
    2。DatabaseName(属性)        设置数据库的路径和文件名!!
    3。RecordSource(属性)        设置,你被导入数据的表!
    4。wordtable(属性)           设置,word中的表格ID,因为不知你在word中的表格有多少个,所以要指定word表的ID,比如说,你在word中
    有3表格,如果你要导入第一个表格的数据就填1,如要导入第二个表格的数据就填2,反之则然!!(注意,一定要把数据放在word的表格中,不然的话将会不导数据!!)
    该属性的默认值为15。ExcelRows(属性)         设置,读取Excel表中的数据从第几行开始读,因你可能会在表中的头N行打进该表的名称,因为哪个表的名称可能
    是你不想导入数据库的!!比如你要从2行开始读取数,因为第一行你要用放一些不想导入数据库的数据(比如标题),就个属性就要填2
                                                                    
                                                                      http://wplll.126.com
                                                                      
      

  5.   

    http://www.delphibbs.com/delphibbs/dispq.asp?lid=1691966
    http://www.csdn.net/Develop/Read_Article.asp?Id=18589
    http://www.csdn.net/develop/Read_Article.asp?Id=18595看看行不
      

  6.   

    我用下面语句
    ADOConnection2.Execute('SELECT * into abc FROM OpenDataSource(''Microsoft.Jet.OLEDB.4.0'',''Data Source="C:\1.xls";Extended Properties=Excel 8.0'')...[Sheet1$]');
    报"FROM子句语法出错"
    而用
    ADOConnection1.Execute('select * into abc from [excel 8.0;database=''c:\1.xls''].[Sheet1$]');
    报"不能更新,数据库或对象为只读"
    哪位高手指点下,谢谢!  
      

  7.   

    楼主:借光:用delphi程序将sql server中的数据导出到excel时数据类型怎么控制???就是说原来在sql server 时数值类型的数据导出到excel中怎样让它保持还是数值类型的客户要在excel中进行数值的运算!!!!