入库表格名称 型号 入库数量 入库时间 单价 总价 经手人
物品一 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数据库,对每样物品都建立相应的表。依次读取“入库表格”的记录,读取后首先检查数据库里有无“物品一”这张表,如果有“物品一”的表就将这条记录的所有内容存入数据库的“物品一”表。如果没有“物品一”这张表,就先创建“物品一”表,并将记录所有内容存入表中。一直循环读取到“入库表格”的最后一条记录。大侠们帮写个代码吧,高分求,不够再加!
物品一 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数据库,对每样物品都建立相应的表。依次读取“入库表格”的记录,读取后首先检查数据库里有无“物品一”这张表,如果有“物品一”的表就将这条记录的所有内容存入数据库的“物品一”表。如果没有“物品一”这张表,就先创建“物品一”表,并将记录所有内容存入表中。一直循环读取到“入库表格”的最后一条记录。大侠们帮写个代码吧,高分求,不够再加!
解决方案 »
- 三层结构DLL调用的数据连接
- 能否用POSTMESSAGE发送发鼠标消息
- 寻找RBuilder汉化版(简体或繁体)
- 响应liulangfeiniao (飞鸟),开QQ群一个,欢迎大家一起进步!
- 在桌面上textout出来的文字如何设置(包括字体和大小)?
- ClientSocket & ServerSocket的问题
- 这样简单的问题都搞不定1
- 散分!要考试了!不知下次何时能上!
- 求救!!!!如何将打印预览中的"0"给去掉。
- !!!!!计算机高手请看这里!!!!!
- delphi取反表达式疑惑?
- could not convert variant of type(null)into type(string)问题
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 执行通过.
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.
在單元中加入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中的內容的類型與數據庫中對應的字段類型一致或可以隱含轉換. 否則出現異常.