标题:在delphi中如何实现用代码将excel导入到sql数据库中
只看楼主
ccc111
Rank: 1
等 级:新手上路
帖 子:105
专家分:0
注 册:2007-1-11
 问题点数:0 回复次数:7 
在delphi中如何实现用代码将excel导入到sql数据库中
请问在delphi中如何实现用代码将excel导入到sql数据库中
搜索更多相关主题的帖子: 数据库 delphi 代码 sql excel 
2008-11-17 10:09
ccc111
Rank: 1
等 级:新手上路
帖 子:105
专家分:0
注 册:2007-1-11
得分:0 
有人会吗,谢谢
2008-11-20 09:20
linseaman
Rank: 1
等 级:新手上路
帖 子:5
专家分:0
注 册:2006-6-2
得分:0 
这问题正是我想问的
2008-11-20 10:36
linseaman
Rank: 1
等 级:新手上路
帖 子:5
专家分:0
注 册:2006-6-2
得分:0 
下面是一张EXCEL表格
客户代码 客户名称 客户税号 客户地址 客户开户银行账号
000001 abc 11111000 dasgadsgs 3241354325423
000002 dsf 32413454 dasadgdsgf 2314341413143
。。。
下面是一个用SQL语句创建的表
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
SET ANSI_PADDING ON
GO
CREATE TABLE [dbo].[客户基本资料表](
[系统编号] [int] IDENTITY(1,1) NOT NULL,
[单位级别代码] [varchar](10) COLLATE Chinese_PRC_CI_AS NOT NULL,
[单位名称] [varchar](255) COLLATE Chinese_PRC_CI_AS NOT NULL,
[单位电话] [varchar](255) COLLATE Chinese_PRC_CI_AS NULL,
[所在省份代码] [varchar](10) COLLATE Chinese_PRC_CI_AS NOT NULL,
[所在城市代码] [varchar](10) COLLATE Chinese_PRC_CI_AS NOT NULL,
[邮政编码] [varchar](6) COLLATE Chinese_PRC_CI_AS NULL,
[通信地址] [varchar](255) COLLATE Chinese_PRC_CI_AS NULL,
[公司网址] [varchar](255) COLLATE Chinese_PRC_CI_AS NULL,
[公司类型代码] [varchar](10) COLLATE Chinese_PRC_CI_AS NOT NULL,
[公司性质代码] [varchar](10) COLLATE Chinese_PRC_CI_AS NOT NULL,
[所在行业代码] [varchar](10) COLLATE Chinese_PRC_CI_AS NOT NULL,
[经营品牌] [varchar](255) COLLATE Chinese_PRC_CI_AS NULL,
[行业地位] [varchar](255) COLLATE Chinese_PRC_CI_AS NULL,
[其它描述] [text] COLLATE Chinese_PRC_CI_AS NULL,
[录入日期] [datetime] NOT NULL,
[录入人员代码] [varchar](50) COLLATE Chinese_PRC_CI_AS NOT NULL,
[公司传真] [varchar](255) COLLATE Chinese_PRC_CI_AS NULL,
[月开票量] [varchar](50) COLLATE Chinese_PRC_CI_AS NULL,
[可能购买的产品] [varchar](10) COLLATE Chinese_PRC_CI_AS NULL,
[最后跟踪时间] [datetime] NULL,
[签约标志] [varchar](2) COLLATE Chinese_PRC_CI_AS NULL,
CONSTRAINT [PK_客户基本资料表] PRIMARY KEY CLUSTERED
(
[系统编号] ASC
)WITH (IGNORE_DUP_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]

GO
SET ANSI_PADDING OFF



CREATE TABLE [dbo].[税控导入资料](
[客户编码] [int] IDENTITY(1,1) NOT NULL,
[客户名称] [varchar](10) COLLATE Chinese_PRC_CI_AS NOT NULL,
[客户地址电话] [varchar](255) COLLATE Chinese_PRC_CI_AS NOT NULL,
CONSTRAINT [PK_税控导入资料] PRIMARY KEY CLUSTERED
(
[客户编码] ASC
)WITH (IGNORE_DUP_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY]

请问如何根据上面两个用DELPHI设计一个程序实现下面的要求:
1、根据 excel表上的客户名称,判断一下 客户基本资料表中的单位名称是否存在,如果存在,那么就不做处理
2、如果不存在,那么,再根据客户名称,判断一下 税控导入资料中的 客户名称 是否存在
3、如果存在,则不做处理,如果不存在,那么将数据插入到 税控导入资料表中

我是一个初学者,刚学DELPHI不到一个星期,老总就给了这个测试,希望大家能帮个忙,尽量能把步骤说清楚点,万分感谢
2008-11-20 10:37
云中雾
Rank: 1
等 级:新手上路
威 望:1
帖 子:168
专家分:3
注 册:2005-12-30
得分:0 
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=字段数

白色的忧郁让我白色的思念从洁白到苍白,从苍白到空白,比空白更空白,变成深白的坦白!
2008-11-25 15:41
ccc111
Rank: 1
等 级:新手上路
帖 子:105
专家分:0
注 册:2007-1-11
得分:0 
按上面的执行,Tinifile报错
2008-11-28 11:36
ccc111
Rank: 1
等 级:新手上路
帖 子:105
专家分:0
注 册:2007-1-11
得分:0 
是不是要uses inifile: Tinifile;
还有OpenDialog1.InitialDir:=directory_app;里的directory_app是什么意思,执行的时候也说没有定义
2008-11-28 11:49
makebest
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:3
帖 子:658
专家分:962
注 册:2005-3-17
得分:0 
不得不承认5楼的兄弟相当强,代码也很值得研究,但是对这个问题是大材小用了,
下面是我使用的读取EXCEL数据的部分代码,希望有些用处:
procedure TForm1.Button1Click(Sender: TObject);
begin
  adoconnection1.ConnectionString := 'driver={microsoft excel driver (*.xls)};driverid=790;dbq=c:\book1.xls';
  ADOConnection1.Open;
  ADOQuery1.SQL.Text := 'select * from [sheet1$]';
  ADOQuery1.Open;
  while not ADOQuery1.Eof do
  begin
    ShowMessage( ADOQuery1.FieldByName('客户代码').AsString );
    adoquery1.Next;
  end;
  ADOQuery1.Close;
  ADOConnection1.Close;
end;
2008-11-28 21:31



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-244713-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.131463 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved