入库表格名称 型号 入库数量 入库时间 单价 总价 经手人
物品一 100-a 100 09.01.11 40 0000 王某
物品二 3854-b 20 09.01.31 200 0000 李某
物品三 33r4g 34 09.02.17 1000 0000 张某
… … … … … … …
物品一 100-a 200 09.02.21 43.6 0000
物品三 33r4g 66 09.02.25 1000 0000 成某
物品一 100-a 37 09.03.01 38.9 0000 王某
物品二 3854-b 60 09.04.11 200 0000 李某
去年我问过类似的问题,但没有得到答案。今年,因为工作需要再次旧事重提,我现在有很多这样的Excel表格,一张表格里有上千条记录。我想通过DELPHI语言(用ADO连接)实现建一个SQL SERVER数据库,对每样物品都建立相应的表。依次读取“入库表格”的记录,读取后首先检查数据库里有无“物品一”这张表,如果有“物品一”的表就将这条记录的所有内容存入数据库的“物品一”表。如果没有“物品一”这张表,就先创建“物品一”表,并将记录所有内容存入表中。一直循环读取到“入库表格”的最后一条记录。大侠们帮写个代码吧,高分求,不够再加!

解决方案 »

  1.   

    类似的我刚做过,先将EXCEL数据导入到GRID中(速度较慢),再导入到数据库中(速度很快);还有一种方法就是把EXCEL数据保存为文本格式,再导入数据库,我们试过,速度应该会很快
      

  2.   

    1.先在数据库中建一个过度表(名为:SH_GG),建表脚本如下:if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[SH_GG]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
    drop table [dbo].[SH_GG]
    GOCREATE TABLE [dbo].[SH_GG] (
    [名称] [nvarchar] (50) COLLATE Chinese_PRC_CI_AS NULL ,
    [型号] [nvarchar] (50) COLLATE Chinese_PRC_CI_AS NULL ,
    [入库数量] [int] NULL ,
    [入库时间] [datetime] NULL ,
    [单价] [float] NULL ,
    [总价] [float] NULL ,
    [经手人] [nvarchar] (50) COLLATE Chinese_PRC_CI_AS NULL 
    ) ON [PRIMARY]
    GO
    2.建一个存储过程,建存储过程的脚本如下:if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[S_SHGG]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
    drop procedure [dbo].[S_SHGG]
    GOSET QUOTED_IDENTIFIER ON 
    GO
    SET ANSI_NULLS OFF 
    GOCREATE PROCEDURE S_SHGG
     AS
    begin
    declare @i int,@j int,@s nvarchar(1000)
    declare @name nvarchar(50),@type nvarchar(50),@count int,@day datetime,@A_int float,@A_count float,@F_Name nvarchar(40)
    set @j=1
    select @i=count(*) from SH_GG
       
    SELECT ID=IDENTITY (int, 1, 1),名称,型号,入库数量,入库时间,单价,总价,经手人
    INTO  #NewTable
    FROM SH_GGwhile @j<=@i 
    beginselect  @name=名称,@type=型号,@count=入库数量,@day=入库时间,@A_int=单价,@A_count=总价,@F_Name=经手人
    from #newtable where id=@jif not exists (select * from dbo.sysobjects where id = object_id(N'[dbo].'+@name) and OBJECTPROPERTY(id, N'IsUserTable') = 1)
    exec('CREATE TABLE [dbo].'+@name+' (
    [名称] [nvarchar] (50) COLLATE Chinese_PRC_CI_AS NULL ,
    [型号] [nvarchar] (50) COLLATE Chinese_PRC_CI_AS NULL ,
    [入库数量] [int] NULL ,
    [入库时间] [datetime] NULL ,
    [单价] [float] NULL ,
    [总价] [float] NULL ,
    [经手人] [nvarchar] (50) COLLATE Chinese_PRC_CI_AS NULL 
    ) ON [PRIMARY]
    ')set @s='INSERT INTO '+ @name+' ( 名称,型号,入库数量,入库时间,单价,总价,经手人)   SELECT 名称,型号,入库数量,入库时间,单价,总价,经手人  FROM #newtable where id='+cast(@j  as nvarchar)exec(@s)set @j=@j+1
    end
    end
    GO
    SET QUOTED_IDENTIFIER OFF 
    GO
    SET ANSI_NULLS ON 
    GO
    3.DELPHI中的调用方式如下:
    //引用单元
    uses ComObj;//这里调用
    procedure TForm1.btn1Click(Sender: TObject);
    var
    ExcelApp: Variant;
    strv:string;
    begin
     if dlgOpen1.Execute then begin{dlgOpen1 是OpenDialog控件}
        ExcelApp := CreateOleObject('Excel.Application' );
        ExcelApp.WorkBooks.Open(dlgOpen1.FileName);
        strv:=ExcelApp.WorkSheets[1].name;
        ExcelApp.ActiveWorkBook.Save;
        ExcelApp.Quit;
        varclear(ExcelApp);
     with qry1  do begin {qry1 是adoquery控件}
       close;
       SQL.Text:='truncate TABLE SH_GG ';{--清除临时用的表所有记录--}
       ExecSQL;
       sql.Text:='INSERT INTO SH_GG([名称],[型号],[入库数量],[入库时间],[单价],[经手人]) SELECT [名称],[型号],[入库数量],[入库时间],[单价],[经手人] FROM openrowset(''Microsoft.Jet.OLEDB.4.0'', ''Excel 8.0;Database='
                 +dlgOpen1.FileName+''','+'''select * from ['+strv+'$]'')';   ExecSQL;{--执行将EXCEL文件中的数据先导入临时用的表中去--}
       Close;
       SQL.Text:='exec  S_SHGG';{--执行存储过程--}
       ExecSQL;
       messagebox(0,'数据导入完毕','提示',MB_ICONINFORMATION);
     end;
     end;
    end;
    4. 以上的方法DELPHI 2009+SQL 2000 执行通过.
      

  3.   

    DELPHI 中全部代码:unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls,ComObj, DB, ADODB;type
      TForm1 = class(TForm)
        btn1: TButton;
        dlgOpen1: TOpenDialog;
        qry1: TADOQuery;
        con1: TADOConnection;
        procedure btn1Click(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
      end;var
      Form1: TForm1;implementation{$R *.dfm}procedure TForm1.btn1Click(Sender: TObject);
    var
    ExcelApp: Variant;
    strv:string;
    begin
     if dlgOpen1.Execute then begin
        ExcelApp := CreateOleObject( 'Excel.Application' );
        ExcelApp.WorkBooks.Open(dlgOpen1.FileName);
        strv:=ExcelApp.WorkSheets[1].name;
        ExcelApp.ActiveWorkBook.Save;
        ExcelApp.Quit;
        varclear(ExcelApp);
     with qry1  do begin
       close;
       SQL.Text:='truncate TABLE SH_GG ';
       ExecSQL;
       sql.Text:='INSERT INTO SH_GG([名称],[型号],[入库数量],[入库时间],[单价],[经手人]) SELECT [名称],[型号],[入库数量],[入库时间],[单价],[经手人] FROM openrowset(''Microsoft.Jet.OLEDB.4.0'', ''Excel 8.0;Database='
                 +dlgOpen1.FileName+''','+'''select * from ['+strv+'$]'')';   ExecSQL;
       Close;
       SQL.Text:='exec  S_SHGG';
       ExecSQL;
       messagebox(0,'数据导入完毕','提示',MB_ICONINFORMATION);
     end;
     end;
    end;end.
      

  4.   


    在單元中加入comobj;
    procedure TForm1.Button1Click(Sender: TObject);
    var a,b : string;
        ExcelApp,WorkBook:Variant;     
        ExcelRowCount:integer;
        i:integer;
    begin
       ExcelApp:= CreateOleObject('Excel.Application');  //創建Excel程序
       opendialog1.Execute;  //打開對話框
       WorkBook := ExcelApp.WorkBooks.Open(opendialog1.FileName);
       ExcelApp.Visible := false;
       ExcelRowCount := WorkBook.WorkSheets[1].UsedRange.Rows.Count; //獲取Excel的行數
        for i:=1 to ExcelRowCount+1 do
         begin
          a:=excelapp.Cells.Value;  //第一列的值
          b:=excelapp.Cells.Value; //第二列的值
          if (excelapp.Cells.Value='')and(excelapp.Cells.Value='') then //第一列與第二列值都為空 則中止
          break
         else
          begin
            with adoquery1 do
            begin
            close;
            sql.Clear;
            sql.Add('insert into reny0830(a,b) values(:A,:B)');   //往表中插入Excel的內容
            parameters.ParamByName('A').Value:=a;
            parameters.ParamByName('B').Value:=b;
            Execsql;
            end;
          end;
        end;
        WorkBook.Close;//关闭工作簿
        ExcelApp.Quit; //退出Excel
        ExcelApp:=Unassigned;//釋放變量
        WorkBook:= Unassigned;
           with adoquery1 do   //把結果顯示出來
        begin
        close;
        sql.Clear;
        sql.Add('select * from reny0830');
        open;
        end;
    end;注意的地方:必須保證Excel中的內容的類型與數據庫中對應的字段類型一致或可以隱含轉換. 否則出現異常.   
     
      

  5.   

    如何将数据从 Excel 导入到 SQL Server
      

  6.   

    由于这两天比较忙,所以一直没能回复。虽然GDTOPONE和ks_reny的回贴还没能完全看懂,但我想先结贴,以后慢慢研究,如有不懂的地方再向二位请教。