现有一个Excel表,有固定的几个列,可能有几百行,现通过Delphi,需要按序取出一行的内容,把取到的值通过参数转的给Oracle中的存储过程,导入到Oracle中去。谁有最有效率的取Excel每行单元格的源程序呀
解决方案 »
- 莫名其妙的
- 弹出窗口按钮没反应
- 三层中,怎样增加删除修改数据啊(请给出代码)
- treeview控件
- 如何把一个char型数组做一个整体进行传递?
- 您好,请教如何将 DbGrid/DbGridEh 中的数据导入 word ?
- 由Foxmail导出若干MSG文件,其汉字部分均变成了=??=??的乱码,请问这是种什么编码,怎么还原成汉字?
- 情感纪实:前后不过二十天,过眼彩“云”化青烟
- 如何直接据机名读取局域网中机器的“网卡IP地址”,而非经DNS解析的IP。急用!
- 在c/s结构中,到底用不用数据敏感控件?
- Delphi 中用 Xml 配置文档生成 Treeview
- 再问"由于超出容量限制,不能创建新事务"
这个是用的较多的方法,前提必须oracle数据中目的表已经存在。
大体步骤如下:
1 将excle文件另存为一个新文件比如文件名为text.txt,文件类型选文本文件(制表符分隔),这里选择类型为csv(逗号分隔)也行,但是在写后面的control.ctl时要将字段终止符改为','(fields terminated by ','),假设保存到c盘根目录。
2 如果没有存在的表结构,则创建,假设表为test,有两列为dm,ms。
3 用记事本创建SQL*Loader控制文件,网上说的文件名后缀为ctl,其实我自己发现就用txt后缀也行。比如命名为control.ctl,内容如下:(--后面的为注释,实际不需要)
load data --控制文件标识
infile 'c:\text.txt' --要输入的数据文件名为test.txt
append into table test --向表test中追加记录
fields terminated by X'09' --字段终止于X'09',是一个制表符(TAB)
(dm,ms) --定义列对应顺序
备注:数据导入的方式上例中用的append,有一下几种:insert,为缺省方式,在数据装载开始时要求表为空;append,在表中追加新记录;replace,删除旧记录,替换成新装载的记录
;truncate,同replace。
4 在命令行提示符下使用SQL*Loader命令实现数据的输入
sqlldr userid=system/manager control='c:\control.ctl'
try
//创建对象
ExlApp := CreateOleObject( 'Excel.Application' );
except
MessageDlg('您的机器里未安装Microsoft Excel!', mtError, [mbOk], 0);
exit;
end; //打开已存在的Excel文档
ExlApp.WorkBooks.Open(self.OpenDialog1.FileName);
ExlApp.Visible:=False;
Screen.Cursor:=crSQLWait;
for i:=2 to ExlApp.ActiveSheet.UsedRange.Rows.Count do
begin
//取出各个单元格,并对某些单元格进行判断
str_xm:=ExlApp.Cells[i,1].Value;
str_xb:=ExlApp.Cells[i,2].Value;
str_sfzh:=ExlApp.Cells[i,3].Value;
str_cbrq:=ExlApp.Cells[i,4].Value;
str_rylb:=ExlApp.Cells[i,5].Value;
str_dbzh:=ExlApp.Cells[i,6].Value;
str_jtdz:=ExlApp.Cells[i,7].Value;
str_jtdh:=ExlApp.Cells[i,8].Value;
str_yhzh:=ExlApp.Cells[i,9].Value;
str_hm:=ExlApp.Cells[i,10].Value;
str_xyh:=ExlApp.Cells[i,11].Value;
//判断身份证号的位数及校验的正确性
iLen:=length(str_sfzh);
if (iLen<>18) and (iLen<>15) then
begin
serrmsg:='该行身份证号位数不对,应为18位或15位!';
//goto L1;
end;
if iLen=18 then //18位校验位的判断
begin
if IDverify(sstr[0])=false then
begin
serrmsg:='该行证件号码校验出错!';
//goto L1;
end;
end;
if iLen=15 then //15位自动转换为18位
begin
str_sfzh:=ID15to18(sstr[0]);
end;
//性别的判断(男或女或空)
if (str_xb<>'男') and (str_xb<>'女') and (str_xb<>'') then
begin
serrmsg:='该行性别格式不对,应为男或女或为空!';
//goto L1;
end;
//参保日期的判断
if length(str_cbrq)<>6 then
begin
serrmsg:='该行参保日期位数不对,应为6位的yyyymm!';
//goto L1;
end;
Stp_Jfjl.Close;
Stp_Jfjl.StoredProcName:='JM_I_JFJL';
Stp_Jfjl.Prepare ;
Stp_Jfjl.ParamByName('p_fsdwybdm').AsString :=trim(EdtDwybdm.Text);
Stp_Jfjl.ParamByName('p_fssfzh').AsString :=str_sfzh;
Stp_Jfjl.ParamByName('p_fsxm').AsString :=str_xm;
Stp_Jfjl.ParamByName('p_fsrylb').AsString :=str_rylb;
Stp_Jfjl.ParamByName('p_fscbrq').AsString :=str_cbrq;
//低保标志或残疾标志
if copy(str_dbzh,1,1)='残' then
Stp_Jfjl.ParamByName('p_fsdbbz').AsString :='2'
else if copy(str_dbzh,1,1)='低' then
Stp_Jfjl.ParamByName('p_fsdbbz').AsString :='1'
else
Stp_Jfjl.ParamByName('p_fsdbbz').AsString :='';
Stp_Jfjl.ParamByName('p_fsdbzh').AsString :=copy(str_dbzh,2,length(str_dbzh)-1);
Stp_Jfjl.ParamByName('p_fsjtdz').AsString :=str_jtdz;
Stp_Jfjl.ParamByName('p_fsjtdh').AsString :=str_jtdh;
if ChkMfq.Checked =True then
begin
Stp_Jfjl.ParamByName('p_fsmfqbz').AsString :='1';
Stp_Jfjl.ParamByName('p_fsmfq').AsString :=trim(EdtMfq.Text);
end
else
begin
Stp_Jfjl.ParamByName('p_fsmfqbz').AsString :='0';
Stp_Jfjl.ParamByName('p_fsmfq').AsString :='';
end;
Stp_Jfjl.ParamByName('p_fsczy').AsString :=czydm;
if ChkDkbz.Checked =True then
Stp_Jfjl.ParamByName('p_dkbz').AsString :='1'
else
Stp_Jfjl.ParamByName('p_dkbz').AsString :='0';
if ChkXs.Checked =True then
Stp_Jfjl.ParamByName('p_xsbz').AsString :='1'
else
Stp_Jfjl.ParamByName('p_xsbz').AsString :='0'; try
Stp_Jfjl.ExecProc;
except
sErrMsg:='调用存储过程<JM_I_JFJL>出错!';
InsertJfjl:=false;
exit;
END;
if Stp_Jfjl.ParamByName('x_rc').AsString<>'0' then
begin
serrmsg:=Stp_Jfjl.ParamByName('x_message').AsString;
InsertJfjl:=false;
exit;
end
else
begin
InsertJfjl:=true;
end; end;不过导入成功和错误的信息暂时还未考虑好该怎么存储? 以前我导入txt文件时,存储在正确或错误文件中,我现在导入Excel文件,难道还是存储在txt文件吗?