一个两层CS程序 数据库在远程服务器上 如果导入本地的Excel?
SELECT * 
FROM OpenDataSource( 'Microsoft.Jet.OLEDB.4.0',
  'Data Source="c:\test.xls";User ID=Admin;Password=;Extended properties=Excel 8.0')...[A$]
这样访问时 Excel文件在数据库服务器上的相应位置时正常 在本地时不能运行 如何解决?

解决方案 »

  1.   

    还有 查询Excel时 有一栏有文本有数字 但查询出来只显示数字 文本的全为NULL 在Excel中手工指定全为文本也没有用 如何让查询时按文本显示
      

  2.   

    你这一段SQL似乎只会在服务器上面执行。因此Excel文件在数据库服务器上的相应位置时正常,在本地时不能运行。
      

  3.   

    现在Excel文件在本地 如何能执行?
      

  4.   

    第一个问题找到解决方法了 用连接字串解决了 第二个如何解决?查询Excel时 有一栏有文本有数字 但查询出来只显示数字 文本的全为NULL 在Excel中手工指定全为文本也没有用 如何让查询时按文本显示
      

  5.   

    这中方法我没实验过,不过DELPHI 可以通过ADO 连接EXCEL ,可以通过OLE 命令或者DELPHI自带的EXCEL
    控件来控制EXEL ,你的最新的问题,可以这样解决
    1,做个模板文件,在里边设置好每个格字的属性(点鼠标右健)"format ceels" 
    然后选NUMBER 页 ,Category中选择 TEXT,2,把数据输入到这个文件,然后另存一个文件.
    (公司里用英文OFFICE,你要根据我写的自己找找)
      

  6.   

    用控件控制是可以 但那样一行行读取速度不知如何 现在我是用ADO来连的 始终出现全按数值型输出了,手工指定为text,用ADO读出来 还是数值型 里面的文本型就丢失了 现在是如何能让ADO方式全以文本型读出数据?
      

  7.   

    uses comobj;procedure Texcelfrm.Button1Click(Sender: TObject);
    var
    oe:variant;
    n1:string;
    i,j:integer;
    begin
      oe:=CreateOleObject('Excel.Application');
      oe.visible:=true;
      oe.workbooks.open(FileListBox1.FileName);
      j:=2;  //假定标题在第一行
       try 
    with adoQuery1 do
       begin
        n1:='insert into tablename(fieldslist) values(:fieldslist)';
        close;
        sql.Clear;
        sql.Add(n);
        while oe.worksheets[sheetname].cells[j,1].text<>'' do
        begin
          for i:=1 to 列数 do
            Parameters.Items[i-1].Value:=oe.worksheets[sheetname].cells[j,i].text;
          execsql;
          j:=j+1;
        end;oe.visible:=false;
        showmessage('导入完毕');
       end;
       except
         oe.visible:=false;
         showmessage('数据库错误或有重复编号,请检查');
       end;
    end;
      

  8.   

    用程序写入excel,很快的。用delphi的excel组件就可搞定。控制方便
      

  9.   

    我这样导入 感觉太慢了 导入一个文件的一个工作表都要好长时间
    // ds TADODataSet
    ExcelID.workbooks.open(opendialog1.FileName);
          ExcelID.visible:=False;
          Memo1.Lines.Add('该Excel文件共有:'+inttostr(ExcelID.WorkSheets.count)+'个工作表');
          for i:=1 to  ExcelID.WorkSheets.count do
          begin
             //打开所有工作表一个个导入
             Application.ProcessMessages;
             Alist.Add(ExcelID.WorkSheets[i].Name);//工作表
             Blist.Add('##tempexl'+inttostr(i));//临时表
             Memo1.Lines.Add('开始导入:'+Alist.Strings[i-1]);
             icol:=10;
             irow:=ExcelID.WorkSheets[i].UsedRange.Rows.count;
             //sql:='gettmptab '''+blist.Strings[i-1]+'''';
              sql:='if object_id(''tempdb..'+blist.Strings[i-1]+''') is null '+#13+'begin '+#13;
             sql:=sql +'CREATE TABLE ['+blist.Strings[i-1]+'] ('+#13;
    sql:=sql +'[ID] [bigint] IDENTITY (1, 1) NOT FOR REPLICATION  NOT NULL ,'+#13;
    sql:=sql +'[A] [nvarchar] (250) COLLATE Chinese_PRC_CI_AI NULL ,'+#13;
    sql:=sql +'[B] [nvarchar] (250) COLLATE Chinese_PRC_CI_AI NULL ,'+#13;
    sql:=sql +'[C] [nvarchar] (250) COLLATE Chinese_PRC_CI_AI NULL ,'+#13;
    sql:=sql +'[D] [nvarchar] (250) COLLATE Chinese_PRC_CI_AI NULL ,'+#13;
    sql:=sql +'[E] [float] NULL ,'+#13;
    sql:=sql +'[F] [float] NULL , '+#13;
    sql:=sql +'[G] [float] NULL , '+#13;
    sql:=sql +'[H] [nvarchar] (250) COLLATE Chinese_PRC_CI_AI NULL ,'+#13;
    sql:=sql +'[I] [nvarchar] (250) COLLATE Chinese_PRC_CI_AI NULL ,'+#13;
    sql:=sql +'[J] [nvarchar] (250) COLLATE Chinese_PRC_CI_AI NULL '+#13;
      sql:=sql +' ) ON [PRIMARY]'+#13;
      sql:=sql +'end '+#13;
      sql:=sql +'else '+#13;
      sql:=sql +'drop table '+blist.Strings[i-1];
             dm.conn.Execute(sql);
             sql:='select * from '+blist.Strings[i-1];
             dm.ds.CommandText :=sql;
             dm.ds.Open;
             //文件行循环
             for j:=1 to irow do
             begin
                Application.ProcessMessages;
                
                if (ExcelID.WorkSheets[i].cells[j,1].text<>'') or (ExcelID.WorkSheets[i].cells[j,2].text<>'') then
                begin
                    Application.ProcessMessages;
                    dm.ds.Append;
                    dm.ds.fieldbyname('A').AsString :=ExcelID.WorkSheets[i].cells[j,1].text;
                    dm.ds.fieldbyname('B').AsString :=ExcelID.WorkSheets[i].cells[j,2].text;
                    ..
                   dm.ds.post;
                end;
             end;
             dm.ds.Close;
            Memo1.Lines.Add('成功导入:'+Alist.Strings[i-1]);
          end;
          Memo1.Lines.Add('Excel文件成功导入');
      

  10.   

    用這個試試
    procedure TForm1.Button1Click(Sender: TObject);
      var
      sqlstr,connstr,sheetName,filename:string;
    begin
      FileName :='d:\d.xls' ;//Excel文件名
      SheetName :='sheet1' ; //Excel表名
      ADOQuery1.Close ;
      ADOQuery1.SQL.Clear ;
      ConnStr :='Provider=Microsoft.Jet.OLEDB.4.0;Data Source=' + FileName + ';Extended Properties=Excel 8.0;Persist Security Info=False';
      ADOQuery1.ConnectionString :=ConnStr ;
      SqlStr :='Select * from ' +'[' +SheetName + '$'+']';  //打開表
      ADOQuery1.SQL.Add(SqlStr) ;
      ADOQuery1.Prepared ;
      ADOQuery1.Open ;
    end;
      

  11.   

    QWERT520(别来无恙)
    就是这样用不了 我才直接打开Excel操作的
      

  12.   

    用SQL语句只能实现EXCEL文件和SQL服务器是同一台电脑的情况。两者不在一个电脑上。只能用操作EXCEL的方法一条条读记录然后一条条写入SQL表中。
      

  13.   

    yeweimian1(我是哈哈乐) 
    Excel文件在一台电脑上 不过用sql语句打开Excel 他会把很多文本字段也当数值来就变NULL了,文本就丢了 因一列文本不多,数值数据较多 他就只让数值了
      

  14.   

    To 楼主
    QWERT520(别来无恙)的方法是可行的至于你说的文本NULL值,我倒还不知道怎么回事,如果是当文本为空的时候显示为NULL,楼主可以通过ISNULL函数来处理,比如:SELECT [name],age,isnull([no],'') [no]
    FROM OpenDataSource( 'Microsoft.Jet.OLEDB.4.0',
      'Data Source="e:\Book1.xls";User ID=Admin;Password=;Extended properties=Excel 8.0')...[Sheet1$]这样,当no列有空的数据的时候,就成''空字符了
      

  15.   

    如果还是不行,方便的话,可以把你的Excel文件发到
      

  16.   


    为什么不行是这样的 比如这样的两列值
    名称     型号
    PVC塑料管 160
    PVC塑料管 110
    PVC塑料管 75
    PVC塑料管 50
    小弯 160
    小弯 110
    小弯 75
    小弯 50
    P弯 50
    S弯 50
    门弯 160
    门弯 110
    门弯 50
    门弯(90度) 50
    弯径 160*110  //丢失
    束节 110*75   //丢失
    束节 110*50
    束节 160
    束节 110
    束节 75
    三通 75
    三通 50
    三通 110*50
    三通 110*50
    用sql查询 第二列中不为数值的全变NULL 全为数值的才可以显示 你们可以试试
    这样就造 成型号列数据丢失
      

  17.   

    用case 型号 WHEN is vartype THEN  'null' else ...
      

  18.   

    用case并不能将如上的 160*110 显示出来
    我的要求是用sql能否支持将Excel全部作为文本型读出来
      

  19.   

    QWERT520(别来无恙) :你的程序我试过了,把本地的数据导入在dbgrid里显示,但是没有保存到sql表里呢,是哪里有问题啊?能帮忙解决一下吗?
      

  20.   

    全部過程。但是提取EXcel文件名和表名不是動態的,可以研究一下,研究好告知一聲.呵呵!!!
    unit Unit2;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, Grids, DBGrids, DB, StdCtrls, ADODB, DBTables, OleServer,
      Buttons;type
      TForm1 = class(TForm)
        Button1: TButton;
        ADOConnection1: TADOConnection;
        ADOQuery1: TADOQuery;
        DBGrid1: TDBGrid;
        Table1: TTable;
        Database1: TDatabase;
        DataSource1: TDataSource;
        procedure Button1Click(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
      end;var
      Form1: TForm1;implementation{$R *.dfm}procedure TForm1.Button1Click(Sender: TObject);
    begin
         Table1.Active:=false ;              
                 Table1.DatabaseName:='WYCG';                //庫名
                 Table1.TableType:=ttparadox;               //表類型
                 Table1.TableName:='YourTableName';        //表名稱
       if  Table1.Exists then                            //表存在否
             begin
                 ADOquery1.sql.clear;
                 ADOquery1.SQL.add('drop Table YourTableName') ;   //存在則刪掉
                 ADOquery1.ExecSQL;
             end;
                 adoConnection1.Execute('SELECT * INTO YourTableName FROM OPENROWSET(''MSDASQL.1'', ''driver=Microsoft Excel Driver (*.xls);DBQ=d:\d.xls'',''select * from [sheet1$]'')');  //導入EXCEL表
                 // adoConnection1.Execute('SELECT * INTO YourTableName FROM OPENROWSET('+Quotedstr(MSDASQL.1)+', '+Quotedstr(driver=Microsoft Excel Driver (*.xls);DBQ=d:\d.xls)+','+Quotedstr(select * from [sheet1$])+')');  //導入EXCEL表
                 ADOquery1.close;
                 ADOquery1.sql.clear;
                 ADOquery1.sql.add('select * from YourTableName'); //顯示 
                 ADOquery1.Prepared;
                 ADOquery1.open;
    end;end.
      

  21.   

    EXCEL中如果某一列既有数字,又有字符, 用ADO方式打开EXCEL, 只能读取一种类别, 如果前面是数字型的, 则后面碰到字符型时, 会是NULL. 反之亦然. 这是ADO的BUG, 微软网站上有解释. 这种情况, 只有打开EXCEL, 逐行逐列读取CELL中的内容, 速度慢是无法避免的.