我想控制读取的Excel文件从第2行开始,应该如何写SQL语句?
            string strConn = "Provider=Microsoft.Jet.OLEDB.4.0;" + "Data Source=" + 
                Path + ";" + "Extended Properties=Excel 8.0;";
            OleDbConnection conn = new OleDbConnection(strConn);
            conn.Open();
            string strExcel = "select " + propertysName + " from [" + sheetName + "$]";
            OleDbDataAdapter myCommand = new OleDbDataAdapter(strExcel, strConn);
            DataSet ds = new DataSet();
            myCommand.Fill(ds, datasetTableName);
            conn.Close();
            return ds;

解决方案 »

  1.   

     string strExcel = "select " + propertysName + " from [" + sheetName + "$] where idx not in (select top 1 idx from [" + sheetName + "$])";红色如果1不行换2试试
      

  2.   

    加 HDR=Yes,表示第一行是表头,
    string strConn = "Provider=Microsoft.Jet.OLEDB.4.0;" + "Data Source=" + 
                    Path + ";" + "Extended Properties=Excel 8.0;HDR=Yes;";
      

  3.   

    Microsoft Jet 提供程序用于连接到 Excel 工作簿。下列连接字符串中的 Extended Properties 关键字会设置特定于 Excel 的属性。“HDR=Yes;”指示第一行包含列名称,但不包含数据;“IMEX=1;”指示驱动程序始终将“intermixed”数据列作为文本进行读取。
      

  4.   

    我有个存储过程操作excel的 希望你能用到
    set ANSI_NULLS ON
    set QUOTED_IDENTIFIER ON
    goALTER PROC [dbo].[Sp_InputExcel2007toSQL]
    @dir NVARCHAR(100),--EXCEL文件存放路径:如D:\ExcelFiles
    @tabname NVARCHAR(50) --定义导入到数据库中的表名
    AS
    SET NOCOUNT ON
    CREATE TABLE #t([filename] NVARCHAR(2000))IF RIGHT(@dir,1)<>'\' 
        SET @dir=@dir+'\'
        
    DECLARE @cmd NVARCHAR(2000)    
    SET @cmd = N'dir "' + @dir + '*.xls*" /B'INSERT #t EXEC master..xp_cmdshell @cmd
    DELETE #t WHERE [filename] IS NULL
    --在SQL中创建表:
    DECLARE @S nvarchar(2000)
    IF OBJECT_ID(@tabname) IS NULL
    BEGIN
        SELECT TOP 1 @S='SELECT TOP 0 * INTO '+ @tabname+' FROM OPENROWSET(
                ''MICROSOFT.ACE.OLEDB.12.0'', ''EXCEL 12.0;HDR=YES;IMEX=2;DATABASE='+@DIR+[filename]+'''
                ,''SELECT * FROM [Sheet1$]'')'
        FROM #t  
        EXEC(@S)
    END
    --开始导入目录下的文件
    SET @S = ''
    SELECT @S = @S + 'INSERT '+@tabname+' SELECT * FROM OPENROWSET(
        ''MICROSOFT.ACE.OLEDB.12.0'', ''EXCEL 12.0;HDR=YES;IMEX=2;DATABASE='+@DIR+FILENAME+'''
        ,''SELECT * FROM [Sheet1$]'')'  
    FROM #t      
    EXEC(@S)
    SET NOCOUNT OFFdrop table tt;
    create table tt
    (
       tid varchar(10),
       tname varchar(10))/*
    --测试时先在D盘创建目录:D:\ExcelFiles
    --任意新建几个表结构相同的excel文件,2003或2007版本均可,并任意存入一些内容。
    --调用存储过程导入数据:
    EXEC Sp_InputExcel2007toSQL 'D:','Tony'
    --查询结果:
    SELECT * FROM Tony
    */
    EXEC Sp_InputExcel2007toSQL 'D:','tt'
    select * from tt;
      

  5.   


    我测试了下,好像第一行永远都取不到(不管第一行是表头或是表内容[XP+VS2005+excel2003])用SQL语句取出时,第二行才算第一笔记录
    设我的excel是三列(A,B,C) //以下为查询第二行开始的,所有记录
     string strExcel ="select * from [sheet1$A1:C65535]";//sheet1为表名//以下为查询第二行开始的,所有记录
    string strExcel ="select * from [sheet1$A4:C65535]";//sheet1为表名从其它行只需改变AN中的N就可以了也可以只取一列
    select * from [sheet1$B1:B65535]
      

  6.   

    我测试了下,好像第一行永远都取不到(不管第一行是表头或是表内容[XP+VS2005+excel2003])用SQL语句取出时,第二行才算第一笔记录
    设我的excel是三列(A,B,C) //以下为查询第二行开始的,所有记录
     string strExcel ="select * from [sheet1$A1:C65535]";//sheet1为表名//以下为查询第五行开始的,所有记录
    string strExcel ="select * from [sheet1$A4:C65535]";//sheet1为表名从其它行只需改变AN中的N就可以了也可以只取一列
    select * from [sheet1$B1:B65535]完整实现:
      string strConn = "Provider=Microsoft.Jet.OLEDB.4.0;" + "Data Source=" + Server.MapPath("~/yyy.xls") + ";" + "Extended Properties=Excel 8.0;";//HDR=Yes,红色为EXCEL文件
            OleDbConnection conn = new OleDbConnection(strConn);
            conn.Open();   
            string strExcel = "";    
            OleDbDataAdapter myCommand = null;
            DataSet ds = null;
            strExcel = "select * from [sheet1$A3:C65535]"; //EXCEL文件里的表
            myCommand = new OleDbDataAdapter(strExcel, strConn);
            ds = new DataSet();
            myCommand.Fill(ds, "table1");  
            conn.Close();
            return ds;
      

  7.   

    看来没办法,只有有EXCEL大法来读.也就是一个格子一个格子读.
    按单元格来读是可以的.
    用office 的 dll文件引入.