OleDbConnection con = new OleDbConnection(_connectionString);
            string strExcel = "select * from [" + sheetName + "$]";
            OleDbDataAdapter cmd = new OleDbDataAdapter(strExcel, con);
            con.Open();            DataTable ExcelData = new DataTable();
            cmd.Fill(ExcelData);
            con.Close();在cmd.Fill(ExcelData)时候经常报这个错误。  每次都要打开excel,然后把内容剪切出来,把空行在重新删除一遍。总觉得不是办法。从表面上看,把水平条移到最右边也只是“AL”列,垂直的移到最下面52行。  不知道是什么原因,求高手指导。

解决方案 »

  1.   

    试试
    string strExcel = "select * from [\"" + sheetName + "$\"]";或者
    string strExcel = "select * from [\"" + sheetName + "\"$]";忘记是哪种了
      

  2.   

    因为Excel中使用范围的关系,某的单元格使用以后如果直接删除内容看起来不再是使用中,但是excel默认这个单元格还在使用只不过值是空,所以只用删除了行或者列才会改变使用范围。
      

  3.   

            private void Route_Click(object sender, EventArgs e)
            {
                dataGridView1.DataSource = null;
                #region   调入EXCEL文件
                OpenFileDialog ope = new OpenFileDialog();
                ope.Filter = "EXCEL文件(*.xls)|*.xls|EXCEL文件(*.xlsx)|*.xlsx";
                if (ope.ShowDialog() == DialogResult.Cancel) return;
                string fileNameString = ope.FileName;
                if (fileNameString.Trim() == " ")
                { return; }            fileName = fileNameString.ToString();
                string strCon = string.Format(" Provider = Microsoft.Ace.OLEDB.12.0 ; Data Source = {0};Extended Properties=Excel 12.0", fileNameString);
                OleDbConnection myConn = new OleDbConnection(strCon);
                OleDbConnection conn = new OleDbConnection(strCon);
                try
                {
                conn.Open();
                DataTable dt = conn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, new object[] { null, null, null, "TABLE" });
                string SheetName = dt.Rows[0]["TABLE_NAME"].ToString();
                comboBox1.Items.Clear();
                for (int i = 0; i < dt.Rows.Count; i++)
                {
                    comboBox1.Items.Add(dt.Rows[i]["Table_Name"].ToString());
                }            string strCom = string.Format("SELECT cgoodspn,cgoodsclass,ramont FROM [{0}]", SheetName);
                    myConn.Open();
                    OleDbDataAdapter myCommand = new OleDbDataAdapter(strCom, myConn);
                    DataSet myDataSet;
                    myDataSet = new DataSet();
                    //myCommand.Fill(myDataSet, "[+SheetName+]");
                    int iRowCount = myCommand.Fill(myDataSet, "[+SheetName+]");
                    myConn.Close();
                    dataGridView1.DataSource = myDataSet.Tables["[+SheetName+]"];
                    ks = 0;
                    
                }
               
                catch (Exception)
                {
                    MessageBox.Show("您已经打开此表,或此表中未有您所查询的内容");
                }
            
    #endregion
            }
      

  4.   

    在excel worksheet类中有个UsedRange表示你使用的范围,有些时候我们并没有使用很大的范围,但是这个东西取到的范围却远远超过我们使用的。
    那是因为我们认为没有使用是【那个范围内的cell里都是空的,没有值】
    但是excel不这样认为,他认为你的某个cell只要是进入过编辑状态就表示在使用,要想消除【使用】这个状态必须删除这个行或者列。如果你的源文件是系统生成的,那没有关系了,如果会有认为操作你就必须考虑这种情况。有人随便点了2下你的数据取得就都变了。
    所以你用这种方法取得数据必须先保证你execl文件的正确性
    其实这个可以在读之前就行check的
      

  5.   

    有道理,先检查你的Excel文档中是否有隐藏列或某一单元格中是''不是null
      

  6.   

    建议你新建一个Execl,把需要的数据一列一列的粘贴过来,因为隐藏的列或空值很难找到。
      

  7.   

    //这里是2007的连接,改成自己用的
    string strCon = " Provider = Microsoft.ACE.OLEDB.12.0; 
                                            Data Source =C:\\08.xlsx;ExtendedProperties=Excel 12.0";
    //SQL要查询的sheet
    string sql = "select * from [Sheet1$]";
    //存放数据用的
    DataSet ds = new DataSet();
    //打开连接
    OleDbConnection conn = new OleDbConnection(strCon);
    conn.Open();
    //取得数据
    OleDbDataAdapter myCommand = new OleDbDataAdapter(sql, strCon);
    //填充数据
    myCommand.Fill(ds, "[Sheet1$]");
    //关闭
    conn.Close();试一下吧,你遇到的挺特别的
      

  8.   

    就是你的 SHeet名称是否存在特殊字符,如空格,是为了防止这些名称的
      

  9.   

    如果不存在xls和xlsx格式的区别的话,你select * 出现这样的错误,感觉是你的Sheet名字的问题
      

  10.   

    sheet名字应该没问题。
    xls和xlsx我已经用split区别了,03跟07的连接也区分了。
    我的问题应该是出在表里面的数据上。 如果把所有数据剪切出来,粘贴到新的excel文件中,就可以了。