在弄一个小程序.EXCEL导入MDB
EXCEL 第一行是标题 第二有一个日期
第三行才是正常的字段名
第四行就是正常的数据了
      标  题
                 日期:2011年3月3日
序号,收货人,件数,货物名称,代收货款,运费,手续费,取货时间,合计 
这样的结构
如果手工删掉第一二行后,
第三行做为字段名,
使用ADOQuery,才能正常导入.
  Close;
  SQL.Text:='SELECT 收货人,件数,货物名称,代收货款,运费,手续费,取货时间,合计 INTO SJ1 FROM [货物清单$] IN "'+ FileName + '" "EXCEL 8.0;"';
  ExecSQL;  能够导入,很快,速度很满意.
  但是客户的EXCEL就是有标题和第二行的日期 让客户每次都手工删除不太好  所以求教怎么样在导入时过滤第一二行,
  直接拿第三行当字段名读入数据呢?
  谢谢,谢谢.

解决方案 »

  1.   

    Try unnamed range like this:select * from [货物清单$A4:H65531]Hope it helps.//Ali
      

  2.   

    你用的ado的方式导入的,导入之前在程序里面把你不需要的行给删除,例如:
    uses   ComObj;
    var   Excel:   OleVariant;
    begin
        Excel   :=   CreateOLEObject( 'Excel.Application ');
        Excel.WorkBooks.Open( 'c:\1.xls ');//打开
        Excel.WorkSheets[1].Rows[1].Delete;  //删除第一行
        Excel.ActiveWorkbook.Save;     //   保存
        Excel.Quit;//退出
    end;
    或者不用ado的方式来导入,写个循环,单元格一个个读取值,然后导入数据库
      

  3.   

    两位的方式都挺好
    谢谢
    使用OLE方式循环操作 这个太浪费资源了 只能是最后的招.
    再补加一个问题SQL.Text := 'INSERT INTO SJ(DB_ShippingDate, DB_Consignee,DB_Number,DB_GoodsName,DB_GoodsInvoice,DB_Freight,DB_Fee,DB_DeliveryTime,DB_Total) SELECT NOW,收货人,件数,货物名称,代收货款,运费,手续费,取货时间,合计 FROM SJ1 WHERE 收货人<> ""';我用最上边的方式 把EXCEL导入的SJ1临时表中
    再从SJ1中导入到我的主表SJ中
    其中主表在插入要有一个 DB_ShippingDate 时间
    如果在 SELECT NOW,收货人 中间 使用NOW可以插入当天
    相当方便  但是我想指定某一天怎么弄呢?
    我试过弄一个变量 但是会被当成字段名出错..郁闷了菜鸟的菜鸟求解,谢谢谢谢谢谢!
      

  4.   

    可以用Cast函数把字符串('2011-04-20 20:19:19')转换成时间类型可以试试,仅供参考
      

  5.   

    请问CAST是DELPHI函数还是SQL函数?
    照着上边 改成 SQL.Text := 'INSERT INTO SJ(DB_ShippingDate, DB_Consignee,DB_Number,DB_GoodsName,DB_GoodsInvoice,DB_Freight,DB_Fee,DB_DeliveryTime,DB_Total) SELECT Cast('2011-04-20 20:19:19'),收货人,件数,货物名称,代收货款,运费,手续费,取货时间,合计 FROM SJ1 WHERE 收货人<> ""';出错 @@ 当然也是我乱用了...主要是 SJ1没有 DB_ShippingDate 对应的字段 在过滤SJ1数据 插入SJ时 给它设置一个日期..
    直接使用NOW 可以插入日期  就想会不会有别的方式 使用 一个日期赋值变量后
    代替那个NOW 就可以插入指定日期了?也许是菜鸟的想法, 求解. 谢谢
      

  6.   

    补充一个 
    已经从EXCEL中 SELECT INTO 到SJ1 这个临时表中了现在只需要把SJ1插入到SJ这个主表
    主表SJ比临时SJ1多了一个 DB_ShippingDate 日期型字段
    又因为是使用INSERT INTO SELECT 的SQL语句(主要是方便 速度快)
    所以想有什么好办法能在SJ1插入SJ时给那个DB_ShippingDate 赋一个指定日期如果是用循环的方式 SJ1插入SJ 就可以自己 设置一个字段字和日期值
    只是 INSERT INTO SELECT 这个就不能达到同样效果吗打了很多 希望大家能看懂后帮帮我..谢谢
      

  7.   

    cast是数据库的函数,具体可以看看帮助。cast('2009-01-01' as datetime)
      

  8.   

    搜索CAST了  看了几贴 不得其解
    不过自己用别的方式解决了SQL.Text := 'INSERT INTO SJ(DB_ShippingDate, DB_Consignee,DB_Number,DB_GoodsName,DB_GoodsInvoice,DB_Freight,DB_Fee,DB_DeliveryTime,DB_Total) SELECT :ShipDate,收货人,件数,货物名称,代收货款,运费,手续费,取货时间,合计 FROM SJ1 WHERE 收货人<> ""';
    Parameters.ParamByName('ShipDate').Value := '2011-4-21'; //D_ShippingDate;然后EXECSQL;
    OK 效果达到感谢LS所有人
    结贴散分.
      

  9.   

    读取完excel表格数据后返回一个datatable (dt), 你在插入数据的时候,是用循环插入的的吧,你把i取2不就行了吗,这不就过滤掉一二行了吗:
    for(int i=2;i<dt.Rows.Count;i++)
    {
     你的插入语句……
    }