procedure TForm1.Button1Click(Sender: TObject);
var
inifile:tinifile;
int_sfieldnum,int_firstrec,int_recnum,int_fieldnum,int_dfieldnum, field_rec,sheet_num:integer;
//插入列数 , 记录开始行, 记录数 , 字段数, 缺省值字段数, 字段名所在行,工作表号
chk_ffield,chk_dbfield:integer;
source_filename:string; //文件名
array_sfield:array of integer;
array_cfield:array of string;
table_name:string;
opr_type,default_type:integer; //操作类型
eclApp,WorkBook:Variant;
//声明为OLE Automation 对象
inifilename,xlsFileName:string;
sheet,range:variant;
i,j,int_mid:integer;
sql_str:string;
str_mid,str_mid1,str_field,str_field1,str_values,str_dfield,str_dvalues:string;
begin
OpenDialog_excel1.FileName:='syspara.ini';
OpenDialog_excel1.InitialDir:=directory_app;
OpenDialog_excel1.Filter:='Ini files (*.ini)|*.INI';
if OpenDialog_excel1.Execute then
begin
inifilename:=OpenDialog_excel1.FileName;
end
else
begin
inifilename:=directory_app+'syspara.ini';
end;
memo1.Lines.Clear;
//判断配置文件是否存在
if fileexists(inifilename)=false then
begin
Application.MessageBox('配置文件加载失败',' 警告',mb_ok);
exit;
end;
inifile:=tinifile.Create(inifilename);
/////////////////////////////读取操作类型
if inifile.SectionExists('opr_type')=false then
begin
opr_type:=0;
default_type:=0;
end
else
begin
opr_type:=inifile.ReadInteger('opr_type','operation_type',0);
default_type:=inifile.ReadInteger('opr_type','default_type',0);
end;
/////////////////////////////读取源文件信息
if inifile.SectionExists('sourcefile')=false then
begin
Application.MessageBox('配置解析失败(sourcefile)',' 警告',mb_ok);
inifile.Free;
exit;
end;
//解析excel文件相关信息
int_sfieldnum:=inifile.ReadInteger('sourcefile','field_num',0); //列的个数
SetLength(array_sfield,int_sfieldnum); //设置数组长度
int_firstrec:=inifile.ReadInteger('sourcefile','firstrec',0); //记录开始行
source_filename:=inifile.ReadString('sourcefile','filename',''); //excel文件名
int_recnum:=inifile.ReadInteger('sourcefile','recnum',0); //记录数
sheet_num:=inifile.ReadInteger('sourcefile','sheet_num',1); //工作表序号
field_rec:=inifile.ReadInteger('sourcefile','fieldrec',0); //字段所在行,没有为0
//读取每个字段对应列的信息
if (opr_type=0) or (opr_type=2) or (opr_type=4) then
begin
for i:=0 to int_sfieldnum-1 do
begin
array_sfield[i]:=inifile.ReadInteger('sourcefile','field'+trim(inttostr(i+1)),0); //读取字段对应列的信息
end;
end;
//读取缺省值信息
str_dfield:='';
str_dvalues:='';
int_dfieldnum:=inifile.ReadInteger('defaultvalue','field_num',0); //列的个数
if (default_type<>0) then
begin
for i:=1 to int_dfieldnum do
begin
str_mid:=inifile.ReadString('defaultvalue','field'+trim(inttostr(i)),'');
str_mid1:=inifile.ReadString('defaultvalue','field'+trim(inttostr(i))+'value','');
// if (trim(str_mid)<>'') and (trim(str_mid1)<>'')then //
if (trim(str_mid)<>'') then
begin
str_dfield:=str_dfield+str_mid+',';
str_dvalues:=str_dvalues+''''+str_mid1+''',';
end;
end;
end;
/////////////////////////////读取数据库文件信息
if inifile.SectionExists('db')=false then
begin
Application.MessageBox('配置解析失败(db)',' 警告',mb_ok);
inifile.Free;
exit;
end;
table_name:=inifile.ReadString('db','tablename','');
int_fieldnum:=inifile.ReadInteger('db','field_num',0);
//从文件db中解析字段顺序
if (opr_type=0) then
begin
str_field:='';
for i:=1 to int_fieldnum do
begin
str_mid:=inifile.ReadString('db','field'+trim(inttostr(i)),'');
if trim(str_mid)='' then
begin
Application.MessageBox(pchar('配置解析失败(db.field'+trim(inttostr(i))+')'),' 警告',mb_ok);
inifile.Free;
exit;
end;
str_field1:=str_field1+str_mid+',';
end;
end;
if fileexists(source_filename)=false then
begin
application.MessageBox(pchar('源文件不存,请检查'+chr(13)+source_filename),'警告',mb_ok);
exit;
end;
/////////////////////////////读取EXCEL文件信息,生成数据库脚本 /////////////////////////////
try
//创建OLE对象Excel Application与 WorkBook
eclApp:=CreateOleObject('Excel.Application');
WorkBook:=CreateOleobject('Excel.Sheet');
except
memo1.Lines.Add('您的机器里未安装Microsoft Excel。');
ShowMessage('您的机器里未安装Microsoft Excel。');
Exit;
end;
try
WorkBook:=eclApp.workBooks.Open(source_filename);
sheet:= workbook.sheets[sheet_num];
//获取字段名信息
if (opr_type=3) then
begin
for j:=1 to int_fieldnum do
begin
str_mid1:=sheet.cells[field_rec,j];
str_field1:=str_field1+str_mid1+',';
end;
end;
if (opr_type=4) then
begin
for j:=0 to int_fieldnum-1 do
begin
int_mid:=array_sfield[j];
str_mid1:=sheet.cells[field_rec,int_mid];
str_field1:=str_field1+str_mid1+',';
end;
end;
//获取字段列表
str_field:=str_field1+str_dfield;
if rightstr(str_field,1)=',' then
begin
str_field:=copy(str_field,1,length(str_field)-1);
end;
if trim(str_field)<>'' then
begin
str_field:='('+str_field+') ';
end;
//读取每一行数据,生成sql脚本
for i:=int_firstrec to int_recnum+int_firstrec-1 do
begin
str_values:='';
if (opr_type=0) or (opr_type=2) or (opr_type=4) then
begin
for j:=1 to int_sfieldnum do
begin
int_mid:=array_sfield[j-1];
str_mid1:=sheet.cells[i,int_mid];
str_values:=str_values+''''+str_mid1+''',';
end;
end;
if (opr_type=1) or (opr_type=3) then
begin
for j:=1 to int_sfieldnum do
begin
str_mid1:=sheet.cells[i,j];
str_values:=str_values+''''+str_mid1+''',';
end;
end;
str_values:=copy(str_values+str_dvalues,1,length(str_values+str_dvalues)-1);
sql_str:='insert into '+table_name+str_field+' values('+str_values+');';
memo1.Lines.Add(sql_str);
{
ADOQ_exe.Close;
ADOQ_exe.SQL.Clear;
ADOQ_exe.SQL.Add(sql_str);
ADOQ_exe.ExecSQL;
}
end;
except
WorkBook.close;
eclApp.Quit;
//释放VARIANT变量
eclApp:=Unassigned;
application.MessageBox('保存数据出错','警告',mb_ok);
exit;
end;
WorkBook.close;
eclApp.Quit;
//释放VARIANT变量
eclApp:=Unassigned;
end;
syspara.ini内容
[opr_type]
operation_type=3
default_type=1
[sourcefile]
filename=C:\Documents and Settings\Administrator\桌面\信息业务地期培训上线文档\二期文档\dlpx2tlr.xls
sheet_num=5
firstrec=3
recnum=42
fieldrec=1
field_num=6
field1=4
field2=1
field3=8
[db]
tablename=T_CRED_SND
field_num=6
field1=tlrname
field2=instno
field3=tlrlvl
[defaultvalue]
field_num=7
field1=Credtype
field1value=100001
field2=Sndstat
field2value=1
field3=Trandate
field3value=20071011
field4=Used
field4value=0
field5=Norevnum
field5value=100
field6=Flag
field6value=00000000
field7=Num
field7value=100
[注释]
operation_type=0:标准格式(域对应字段);{sourcefile 和 db 的field都解析}
1:不需字段,按列的原始顺序插入;{sourcefile 和 db 的field都不解析},无缺省字段
2:不需字段,按列的顺序插入;{sourcefile 的field解析,db 的field不解析},无缺省字段
3:字段名连续存放在某行上,与内容相对应时,选此选项(sourcefile 和 db 的field不必填){sourcefile 和 db 的field都不解析}
4:字段名不连续存放在某行上,与内容相对应时,选此选项(sourcefile的field必填,db 的field不必填){sourcefile 的field都解析,db 的field不解析}
字段列表 解析列顺序 解析字段名称
0 1 1 1
1 0 0 0
2 0 1 0
3 1 0 0
4 1 1 0
default_zhi=0:没有缺省值
1:有缺省值
filename:=Excel文件名
sheet_num=工作表号(第几个)
firstrec=记录开始行
fieldrec=字段名所在行
recnum=记录数
field_num=字段数
tablename=表名
field_num=字段数