RT

解决方案 »

  1.   

    http://blog.csdn.net/www_sw/archive/2009/03/26/4026811.aspx
      

  2.   


    /// <summary>
            /// 点击按钮导入数据
            /// 作者:lhxhappy
            /// </summary>
            /// <param name="sender"></param>
            /// <param name="e"></param>
            private void button1_Click(object sender, EventArgs e)
            {
                //打开一个文件选择框
                OpenFileDialog ofd = new OpenFileDialog();
                ofd.Title = "Excel文件";
                ofd.FileName = "";
                ofd.InitialDirectory = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments);//为了获取特定的系统文件夹,可以使用System.Environment类的静态方法GetFolderPath()。该方法接受一个Environment.SpecialFolder枚举,其中可以定义要返回路径的哪个系统目录
                ofd.Filter = "Excel文件(*.xls)|*.xls";
                ofd.ValidateNames = true;     //文件有效性验证ValidateNames,验证用户输入是否是一个有效的Windows文件名
                ofd.CheckFileExists = true;  //验证路径有效性
                ofd.CheckPathExists = true; //验证文件有效性
                string strName = string.Empty;
                if (ofd.ShowDialog() == DialogResult.OK)
                {
                    strName = ofd.FileName;
                }            if (strName == "")
                {
                    MessageBox.Show("没有选择Excel文件!无法进行数据导入");
                    return;
                }
                //调用导入数据方法
                EcxelToDataGridView(strName, this.hpGridView1);
            }Excel数据导入方法 /// <summary>
            /// Excel数据导入方法
            /// 作者:lhxhappy
            /// </summary>
            /// <param name="filePath"></param>
            /// <param name="dgv"></param>
            public void EcxelToDataGridView(string filePath,DataGridView dgv)
            {
                //根据路径打开一个Excel文件并将数据填充到DataSet中
                string strConn = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source = " + filePath + ";Extended Properties ='Excel 8.0;HDR=NO;IMEX=1'";//导入时包含Excel中的第一行数据,并且将数字和字符混合的单元格视为文本进行导入
                OleDbConnection conn = new OleDbConnection(strConn);
                conn.Open();
                string strExcel = "";
                OleDbDataAdapter myCommand = null;
                DataSet ds = null;
                strExcel = "select  * from   [sheet1$]";
                myCommand = new OleDbDataAdapter(strExcel, strConn);
                ds = new DataSet();
                myCommand.Fill(ds, "table1");            //根据DataGridView的列构造一个新的DataTable
                DataTable tb = new DataTable();
                foreach (DataGridViewColumn dgvc in dgv.Columns)
                {
                    if (dgvc.Visible && dgvc.CellType != typeof(DataGridViewCheckBoxCell))
                    {
                        DataColumn dc = new DataColumn();
                        dc.ColumnName = dgvc.DataPropertyName;
                        //dc.DataType = dgvc.ValueType;//若需要限制导入时的数据类型则取消注释,前提是DataGridView必须先绑定一个数据源那怕是空的DataTable
                        tb.Columns.Add(dc);
                    }
                }            //根据Excel的行逐一对上面构造的DataTable的列进行赋值
                foreach (DataRow excelRow in ds.Tables[0].Rows)
                {
                    int i = 0;
                    DataRow dr = tb.NewRow();
                    foreach (DataColumn dc in tb.Columns)
                    {
                        dr[dc] = excelRow[i];
                        i++;
                    }
                    tb.Rows.Add(dr);
                }
                //在DataGridView中显示导入的数据
                dgv.DataSource = tb;
            }
    本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/www_sw/archive/2009/03/26/4026811.aspx这个我贴出来 ,问下
    string strConn = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source = " + filePath + ";Extended Properties ='Excel 8.0;HDR=NO;IMEX=1'";//导入时包含Excel中的第一行数据,并且将数字和字符混合的单元格视为文本进行导入
    啥意思?看不懂?
      

  3.   

    并且运行到
    OleDbConnection conn = new OleDbConnection(strConn);
    报错 
    Provider 有问题
      

  4.   

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

  5.   


    zl, 你的连接字符串有问题,也就你本地没有装8.0的EXcel 库,换个低版本的吧 。
      

  6.   

     SqlConnection conn = new SqlConnection(strConn);报错 
    不支持关键字: “provider”。
      

  7.   

         /// <summary>
            /// 打开选择所要的Excel文件
            /// </summary>
            /// <param name="sender"></param>
            /// <param name="e"></param>
            private void btnOpen_Click(object sender, EventArgs e)
            {
                try
                {
                    OpenFileDialog ofd = new OpenFileDialog();
                    ofd.Title = "Excel文件";
                    ofd.FileName = "";
                    ofd.InitialDirectory = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments);
                    ofd.Filter = "Excel2003文件(*.xls)|*.xls|Excel2007文件(*.xlsx)|*.xlsx|所有文件(*.*)|*.*";
                    ofd.ValidateNames = true;
                    ofd.CheckFileExists = true;
                    ofd.CheckPathExists = true;
                    string strName = string.Empty;
                    if (ofd.ShowDialog() == DialogResult.OK)
                    {
                        strName = ofd.FileName;
                    }                if (strName == "")
                    {
                        SkynetMessage.MsgInfo("没有选择Excel文件!无法进行数据导入");
                        return;
                    }
                    //调用导入数据方法
                    if (this.cmbRelation.SelectedIndex == 1)
                    {                    EcxelToDataGridView(strName, this.dgvExcel);                }
                    else if (this.cmbRelation.SelectedIndex == 2)
                    {                    EcxelToDataGridView(strName, this.dgvExcel);
                    }
                    else if (this.cmbRelation.SelectedIndex == 3)
                    {                    EcxelToDataGridView(strName, this.dgvExcel);
                    }
                }
                catch (Exception ex)
                {
                    SkynetMessage.MsgInfo(ex.Message);            }        }
            /// <summary>
            /// 导入Excel的方法
            /// </summary>
            /// <param name="filePath">Excel所存放的路径</param>
            /// <param name="dgv">所要存放的DataGridView的名称</param>
            /// <param name="excelName">Excel表中SHEET的名字</param>
            public void EcxelToDataGridView(string filePath, DataGridView dgv)
            {            string strConn = "Provider=Microsoft.JET.OLEDB.4.0;Data Source = " + filePath + ";Extended Properties ='Excel 8.0;HDR=YES;IMEX=1'";
                OleDbConnection conn = new OleDbConnection(strConn);
                conn.Open();
                DataTable schemaTable = conn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables,
                                       new object[] { null, null, null, "TABLE" });            string excel = "select  * from [" + schemaTable.Rows[0]["TABLE_NAME"].ToString() + "]";
                OleDbDataAdapter dataAdaper = new OleDbDataAdapter(excel, conn);
                try
                {
                    dataAdaper.Fill(ds, "[" + schemaTable.Rows[0]["TABLE_NAME"].ToString() + "]");
                }
                catch (Exception)
                {            }
                conn.Close();
                dgvExcel.DataMember = "[" + schemaTable.Rows[0]["TABLE_NAME"].ToString() + "]";
                dgvExcel.DataSource = ds;
            }
    用我这个 试试 上面的3个IF语句 你不用管, 你只管调方法写你的就行了,我这个不用管EXCEL中的SHEET的名字,什么名字都能打开。需要注意的是 我这个只能打开2003 ,如果要2007或者2010 的 话 你可以把连接字符串修改一下,2007貌似是12.0 你网上搜下吧 我也忘了 楼主给分吧。。
      

  8.   

    自定义一个将DataGridView控件中数据导出到Excel函数   
    /// <summary>
      /// 将DataGridView控件中数据导出到Excel
      /// </summary>
      /// <param name="gridView">DataGridView对象</param>
      /// <param name="isShowExcle">是否显示Excel界面</param>
      /// <returns></returns>
      public bool ExportDataGridview(DataGridView gridView,bool isShowExcle)
      {
      if (gridView.Rows.Count == 0)
      return false;
      //建立Excel对象
      Excel.Application excel = new Excel.Application();
      excel.Application.Workbooks.Add(true);
      excel.Visible = isShowExcle;
      //生成字段名称
      for (int i = 0; i < gridView.ColumnCount; i++)
      {
      excel.Cells[1, i + 1] = gridView.Columns[i].HeaderText;
      }
      //填充数据
      for (int i = 0; i < gridView.RowCount-1; i++)
      {
      for (int j = 0; j < gridView.ColumnCount; j++)
      {
      if (gridView[j, i].ValueType == typeof(string))
      {
      excel.Cells[i + 2, j + 1] = "'" + gridView[j, i].Value.ToString();
      }
      else
      {
      excel.Cells[i + 2, j + 1] = gridView[j, i].Value.ToString();
      }
      }
      }
      return true;
      } 
      

  9.   

    你换个低版本的EXECL库 试试
      

  10.   

    ds 没找到,自己建好了

     dgvExcel.DataMember = "[" + schemaTable.Rows[0]["TABLE_NAME"].ToString() + "]";
    报错  无法创建字段 ['11$'] 的子列表。
      

  11.   

    []里面写的是你要查询的Excel的sheet名,一般默认是Sheet1,不知道你的是什么?记得要加$
      

  12.   

    []里面写的是你要查询的Excel的sheet名,一般默认是Sheet1,不知道你的是什么?记得要加$
    这个怎么说我的为什么
    'Sheet1'不是一个有效名称。请确认它不包含无效的字符和标点,且名称不太张
      

  13.   

    strExcel = "select  * from   [sheet1$]";红字的地方改成你的Excel中左下方的sheet名!
      

  14.   

    conn.Open();错误行
    错误提示:外部表不是预期格式。获取的这个Excel是我用datagridview 导入的,怎么还有这样的错i?
      

  15.   


    public void EcxelToDataGridView(string filePath, DataGridView dgv)
            {            //根据路径打开一个Excel文件并将数据填充到DataSet中
                string strConn = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source = " + filePath + ";Extended Properties ='Excel 8.0;HDR=NO;IMEX=1'";//导入时包含Excel中的第一行数据,并且将数字和字符混合的单元格视为文本进行导入
                OleDbConnection conn = new OleDbConnection(strConn);
                conn.Open();
                string strExcel = "";
                OleDbDataAdapter myCommand = null;
                DataSet ds = null;
                strExcel = "select  * from   [sheet1$]";
                myCommand = new OleDbDataAdapter(strExcel, strConn);
                ds = new DataSet();
                myCommand.Fill(ds, "table1");            //根据DataGridView的列构造一个新的DataTable
                DataTable tb = new DataTable();
                foreach (DataGridViewColumn dgvc in dgv.Columns)
                {
                    if (dgvc.Visible && dgvc.CellType != typeof(DataGridViewCheckBoxCell))
                    {
                        DataColumn dc = new DataColumn();
                        dc.ColumnName = dgvc.DataPropertyName;
                        dc.DataType = dgvc.ValueType;//若需要限制导入时的数据类型则取消注释,前提是DataGridView必须先绑定一个数据源那怕是空的DataTable
                        tb.Columns.Add(dc);
                    }
                }            //根据Excel的行逐一对上面构造的DataTable的列进行赋值
                foreach (DataRow excelRow in ds.Tables[0].Rows)
                {
                    int i = 0;
                    DataRow dr = tb.NewRow();
                    foreach (DataColumn dc in tb.Columns)
                    {
                        dr[dc] = excelRow[i];
                        i++;
                    }
                    tb.Rows.Add(dr);
                }
                //在DataGridView中显示导入的数据
                dgv.DataSource = tb;
                
            }
    在这段代码里