如何把多个excel表中的列信息取出来,添加到一个treeview中去,当点击一个表的时候,显示下面的多个sheet文件,点击sheet文件出现列信息,然后我就可以和数据库的字段对应了。
就是这个功能,请高手帮忙!

解决方案 »

  1.   

    用AdoTable打开Excel中的一张sheet
    然后就但操作一般的表一样啊!!
      

  2.   

    经过仔细的观察,我发现ado把excel的列标题从不为空的一行开始算起,这一行被默认为所有的列标题,根据Excel表中总的列数去匹配,如果这一行的列数小于总列数,则剩余的列标题均为空的,从F2开始标记,直至最后一列,但是这往往是和实际需要的不匹配的,因为这一行很可能是表的标题,而不是列标题,所以需要有好的办法来找出我们需要的列标题并和数据库中的字段建立对应关系,以便于我们导入数据到数据库中。不知道大家是怎么做的,有没有好的办法,尤其是多个Excel文件,而一个文件中也可能有多个sheet的时候,如何能够动态的获得列标题和文件中的sheet信息。
       至于单个文件中单个表的导入,这个我觉得没有问题,请大家帮忙看一下上面复杂的问题。
      

  3.   

    不懂你的意思,只是知道你要取数,对excel来说,取数和赋值没啥区别,你看看吧var
     x,sheet:variant;
     str:string;
    begin
     try
      x:=createoleobject('excel.application');
     except
      messagedlg('不能打开Mircrosoft Excel'+#13+'请检查是否已经安装 Mircrosoft Office!',mterror,[mbok],0);
      abort;
     end; x.workbooks.add('\平衡表.xls');
     sheet:=x.workbooks[wbk].worksheets['平衡表']; sheet.cells[1,1]:='123';  //赋值
     sheet.cells[1,2]:='456';
     
     str=sheet.cells[1,2]; //exel的表取出来的数都是字符串类型的
     sheet.saveas('平衡表.xls');
     //显示excel
     x.visible = true;
     //关闭excel
     x.quit;//例子
    tpub.fieldbyname('123').asstring;=sheet.cells[i,j];
      

  4.   

    哦,对了别忘了在uses 加上comobj
      

  5.   

    说白了就是一个在DELPHI内操作EXCEL的问题,但无论如何你的EXCEL表总得有一个固定的格式比如每一张工作表哪一行是表标题哪一行是列标题(即你的字段),如果不能确定,那你也得有个其它的规则,比如说第一列单元格从第一行其首先不为空的哪一行为列标题,规则确定了就是打开工作薄,循环读取工作表,然后在每一工作表中依据规则取出列标题就行了。应该不难,不过肯定很烦。
      

  6.   

    to chinaway(溪之) ,想知道您是怎么解决的,能告诉我吗?
      

  7.   

    我给你一段我的程序阿,是操纵excel的阿!!
    procedure TForm7.Button5Click(Sender: TObject);
    var
      Range:excelrange;
      i,j,k:integer;
      letter:char;
    begin
    if datasource1.DataSet=nil then showmessage('没有内容可以导入Excel!')
    else begin
      try
        try
        excelapplication1.Connect;
        except
        showmessage('您的机器没有安装Excel!');
        abort;
        end;
        excelapplication1.Visible[0]:=true;
        excelapplication1.Caption:='送修内容';
        excelapplication1.Workbooks.Add(NUll,0);    k:=datasource1.DataSet.FieldCount-4;    if datasource1.DataSet.Fields[k].DisplayLabel='COUNT OF 局名' then
         k:=4
        else k:=0;    i:=65+datasource1.DataSet.FieldCount-1-k;
        letter:=char(i);    range:=excelapplication1.Range['A1',letter+'1'];    for i:=0 to datasource1.DataSet.FieldCount-1-k do
          begin
          range.Value:=datasource1.DataSet.Fields[i].DisplayLabel;
          range:=range.Next;
          end;
        if k=4 then begin
        range.Value:='数量';
        dec(k);
        end;
        datasource1.DataSet.First;    for i:=1 to datasource1.DataSet.RecordCount do begin
          range:=excelapplication1.Range['A'+inttostr(i+1),letter+inttostr(i+1)];
          for j:=0 to datasource1.DataSet.FieldCount-1-k do begin
            range.Value:=datasource1.DataSet.Fields[j].AsString ;
            range:=range.Next;
            end;
          datasource1.DataSet.Next;
          end;  except
      excelapplication1.Disconnect;
      end;  end;
    end;
      

  8.   

    我使用的是server里面的excelapplication阿