大家好,我想问一下怎么实现C#读取excel指定行的某些数据到datagirdview问题?
我有一个想法,分2步:
(1)首先定位要读取的是哪行,比如excel表里有一个列名为  A,我想定位到A列里值为 220的这一行...用语句怎么实现?
(2)读取上述指定行的某些数据,用FOR循环?
    for (开始到结束)  //怎么开始,到何处结束?
             {
                if (读取的内容) read;  // 读取的内容为"与指定的列号相同"  比如要读取列名分别为B,C的内容..
                else continue;
             }
   这样可行不?用C#语句我不会写,大家可否花一点时间帮我写一下,谢谢了...btw:正在看VBA,从图书馆借了一本书,看不懂,晕...

解决方案 »

  1.   

    还有再问一下我已引用了引用   Microsoft   Excel   Object   Library   Excel.Application   ObjApp=new   Excel.ApplicationClass();//创建一个Excel对象 上面这句还有错误:The type or namespace name 'Excel' could not be found (are you missing a using directive or an assembly reference?)我已经用了这样的语句
    using Microsoft.Office.Core;
    using Microsoft.Office.Interop.Excel;为什么?
      

  2.   

    把excel数据读取到dataset,在dataset离就好定位行数列数了
      

  3.   

    方法有甲乙两种,一种是用vba的方法,一种是用ado的方法   
        
      例子不太好,随便写的,这个不难   
        
      可用   AddComment   方法为一个区域添加批注。下例为第一张工作表的   E5   单元格添加批注。   
        
      With   Worksheets(1).Range("e5").AddComment   
              .Visible   =   False   
              .Text   "reviewed   on   "   &   Date   
      End   With   
     
      vba的方法是用     
        
      set   excellvba=server.createobject("excel.application")   
      

  4.   

    最近的系统需要在SQL数据库与Execl之间互导数据,找了一些资料,ADO.NET可以使用使用Microsoft.Jet.OleDb访问访问Excel,网上已经有很多类似的资源,俺整理了两种方法,第一种方法可以从Excel中批量导入数据到SQL中,实现如下:
    ' 连接字符串 
    Dim xlsPath As String = Server.MapPath("~/app_data/ExcelFile.xls") ' 绝对物理路径
    Dim connStr As String = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & xlsPath & "; Extended Properties=Excel 8.0;"
    ' 查询语句
    Dim sql As String = "SELECT * FROM [Sheet1$]"Dim ds As DataSet = New DataSet()
    Dim da As OleDb.OleDbDataAdapter = New OleDb.OleDbDataAdapter(sql, connStr)
    da.Fill(ds) ' 填充DataSet' 在这里对DataSet中的数据进行操作 ' 输出,绑定数据
    GridView1.DataSource = ds.Tables(0)
    GridView1.DataBind()
    俺只整理了绑定到GridView中的代码。
     
    第二种方法针对自定义Excel数据表的导入,此方法在读取Excel文件时系统自动会打开一个Excel.exe进程,使用myExcel.Workbooks.Close无法关闭,俺也整理了如何关闭Excel.exe进程的代码,HTML代码如下:
    <%@ Page Language="VB" AutoEventWireup="false" CodeFile="Excel.aspx.vb" Inherits="_Excel" %>
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml" >
    <head runat="server">
    <title>读取Excel数据</title>
    </head>
    <body>
    <form id="form1" runat="server">
    <div>
    第<asp:TextBox ID="TextBox3" runat="server" Width="60px" Text="1" />工作表 
    第<asp:TextBox ID="TextBox1" runat="server" Width="60px" Text="1" />行 
    第<asp:TextBox ID="TextBox2" runat="server" Width="60px" Text="1" />列<br />
    Excel数据:<input id="File1" runat="server" name="File1" size="30" type="file" />
    <asp:Button ID="BtnRExcel" runat="server" Text="读取Excel的某行某列" /></div>
    </form>
    </body>
    </html>
    VB.NET代码:
    Imports Microsoft.Office.InteropPartial Class _Excel
    Inherits System.Web.UI.PageProtected Sub BtnRExcel_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles BtnRExcel.Click
    Dim strPath As String = File1.PostedFile.FileName
    If strPath = "" Then
    Me.Response.Write("请选择要导入的Excel数据文件!")
    ElseDim excelFilePath As String = strPath
    Dim myExcel As Excel.Application = New Excel.ApplicationClass() '创建一个Excel对象
    Dim oMissing As Object = System.Reflection.Missing.Value
    myExcel.Application.Workbooks.Open(excelFilePath, oMissing, oMissing, oMissing, oMissing, oMissing, oMissing, oMissing, oMissing, oMissing, oMissing, oMissing, oMissing, oMissing, oMissing)
    Dim myBook As Excel.Workbook = myExcel.Workbooks(1) '定义一个工作表组
    Dim mySheet As Excel.Worksheet = CType(myBook.Worksheets(CInt(TextBox3.Text)), Excel.Worksheet) '定义一个工作表Dim r As Excel.Range = CType(mySheet.Cells(CInt(TextBox1.Text), CInt(TextBox2.Text)), Excel.Range)Me.Response.Write("Excel中第" & TextBox1.Text & "行 第" & TextBox2.Text & "列的值:" & (r.Value).ToString)
    ExcelGC(myExcel, myBook, mySheet, r)End IfEnd Sub'关闭Excel进程 
    Private Shared Sub ExcelGC(ByRef myExcel As Excel.Application, ByRef myBook As Excel.Workbook, ByRef mySheet As Excel.Worksheet, ByRef r As Excel.Range)
    myBook.Close(False, Type.Missing, Type.Missing)
    myExcel.Quit()
    System.Runtime.InteropServices.Marshal.ReleaseComObject(r)
    System.Runtime.InteropServices.Marshal.ReleaseComObject(myExcel)
    System.Runtime.InteropServices.Marshal.ReleaseComObject(mySheet)
    System.Runtime.InteropServices.Marshal.ReleaseComObject(myBook)
    mySheet = Nothing
    myBook = Nothing
    myExcel = Nothing
    r = Nothing
    GC.Collect()
    End Sub
    End Class
      

  5.   

    三种方法操作excel文档
    1:使用Microsoft.Office.Interop.Excel,调用EXCEL COM组件,操作EXCEL文件 
      2:使用OleDb 操作EXCEL数据源,进而利用ADO.net。 
      3:使用OPEN XML,访问EXCEL zip文件并使用DOM。
      

  6.   

    试下OleDB
    OleDbConnection objConn = null;
    DataSet data = new DataSet();
    try
    {
    string strConn = @"Provider=Microsoft.ACE.OleDb.12.0;Data Source=c:"待发工资.xlsx;Extended Properties='Excel 12.0;HDR=YES'";//IMEX=1为只读
    //"Provider=Microsoft.Jet.OleDb.4.0;data source=c:"待发工资.xlsx;Extended Properties=""Excel 12.0;HDR=YES;IMEX=1""";
                    objConn = new OleDbConnection(strConn);
    objConn.Open();
    //System .Data . DataTable schemaTable = objConn.GetOleDbSchemaTable(System.Data.OleDb.OleDbSchemaGuid.Tables, null);
    //int SheetIndex = 0;
    //string tableName = schemaTable.Rows[SheetIndex][2].ToString().Trim();string strSql = "Select   *   From   [Sheet1$]";
    OleDbCommand objCmd = new OleDbCommand(strSql, objConn);
    OleDbDataAdapter sqlada = new OleDbDataAdapter();
    sqlada.SelectCommand = objCmd;
    sqlada.Fill(data);
    string str = "";
    for (int i = 0; i < data.Tables[0].Rows[0].ItemArray.Length; i++)
    {
    str += data.Tables[0].Rows[0].ItemArray[i].ToString() + ".";
    }
    MessageBox.Show(str);
    objConn.Close();
    }
    catch (Exception ex)
    {
    objConn.Close();
    Console.WriteLine(ex.Message.ToString());
    }
      

  7.   

    谢谢zzxap先...可是我看不懂..这些不能直接用C#语句吗? 一定要用VBA,我不会VBA,很惨...我是这样想的,后正工作量不多,能尽快解决就尽快解决.所以不是很情愿的去看VBA,我做这些都是中午,下午的一点点时间在宿舍对着电脑做的,其他时间我一般在图书馆,学一些基础知识..你在三楼说:把excel数据读取到dataset,在dataset离就好定位行数列数了...
    我是这样做的:string MyExcel = "2008毕业生档案投递正稿.xls";
                string MySheet = "Sheet1";
                OleDbConnection MyConnection = new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data source=" + MyExcel + ";Excel 8.0;HDR=YES");
                string MySQL = "SELECT * FROM ["+MySheet+"$]";  //"SELECT * FROM ["+MySheet+"$]";
                OleDbCommand MyCommand = new OleDbCommand(MySQL, MyConnection);
                OleDbDataAdapter MyAdapter = new OleDbDataAdapter(MyCommand);
                DataSet MySet = new DataSet();
                MyAdapter.Fill(MySet);
               this.dataGridView1.DataSource = MySet.Tables[0];这样做是把整个excel表弄到datagirdview里了,那这样我该怎样在datagirdview里读取我想要的数据里,比如某一行
    的某些数据..
    谢谢大家帮忙...麻烦大家了..
      

  8.   

    using   Excel=Microsoft.Office.Interop.Excel;   
      .......   
        
        Object   refmissing   =   System.Reflection.Missing.Value;   
            Excel._Application   exc   =   new   Excel.ApplicationClass();   
            exc.Visible   =   true;   
            Excel.Workbooks   workbooks   =   exc.Workbooks;   
                              workbooks._Open("c:\\test.xls",refmissing,refmissing,refmissing,refmissing,refmissing,refmissing,refmissing,refmissing,refmissing,refmissing,refmissing,refmissing);   
        
            Excel.Worksheet   sheet   =   (Excel.Worksheet)exc.Worksheets.get_Item(1);   
        
            MessageBox.Show(sheet.Cells[1,   1]);  //显示某个cell的数据 
      

  9.   


    回复sunshine_anycall,你帮我写的这个循环只是读取第0行的内容,不是寻找特定行的啊...
    我的意思是我想通过查找,然到特定行(比如我有一列名为:学号,我想找学号为10001的学生),然后再读取那行的某些内容,把读到内容分别保存起来,比如保存到一个数组里,这样方便我以后读取内容...我上面没说清,不好意思..
    可不可以麻烦sunshine_anycall或大家再帮我写一下..非常感谢谢谢zzxap11楼的回复,读取指定单元格我懂一点点了,呵呵...不过这句通不过编译
    MessageBox.Show(sheet.Cells[1,  1]);  //显示某个cell的数据 
    我想应该是类型不匹配吧?再次谢谢大家帮忙...
      

  10.   

    谢谢,能否给几句代码?比如我在一个textbox输入查找的学号,然后找到该学号所在行读取数据...大家不要怪我开口闭口要代码啊,说实话,C#我很菜,可面对这么严峻的就业形势,我不敢对我并不擅长的东西花太多时间,所以才想在这,希望通过大家的力量来解决...如果我的观点不对,大家也可以说出来,学习嘛,能进步是最重要的..
    谢谢大家..
      

  11.   

    DataTable dt = new DataTable();
    string strConnection = "Provider=Microsoft.Jet.OLEDB.4.0;Extended Properties='Excel 8.0;HDR=YES;IMEX=1;';"+ "Data Source=" + strFileName + ";";
    OleDbConnection connection = new OleDbConnection(strConnection);
    connection.Open();
    try
      {
           string str = "Select * from [Sheet1$] where F1='220'";
           OleDbDataAdapter adapter = new OleDbDataAdapter(str, connection);
           adapter.Fill(dt);
       }
    catch
       {
            dt = null;
       }
    finally
       {
           connection.Close();
        }DataRow[] dr = dt.Select(" F1='220'");//找到你需要的行
      

  12.   

    谢谢lsj_zrp的回答,可是这句会在调试是有错误:
    DataRow[] dr = dt.Select(" F1='220'");//找到你需要的行
    错误信息:Object reference not set to an instance of an object.请问是什么原因,如果上述没错的话,那我要怎样使用这个已确定的行.
    你能帮我确定了是哪行,但我却仍不会用 DataRow[] dr 这个对象来访问那行的内容,调试了一下午,还是不行..我C#菜得没话说,痛苦中...可否再明示一下,感激不尽...也请大家帮我看一下,谢谢...
      

  13.   

    我又想了一下,根据这个循环
    for (int i = 0; i < data.Tables[0].Rows[0].ItemArray.Length; i++) 

    str += data.Tables[0].Rows[0].ItemArray[i].ToString() + "."; 

    读取第0行的内容...我就可以用16楼的方法确定行,赋给上面循环中的rows[i],i就是我要的行数,这样可不可以,如果可以,C#语句怎样写,只是一唏代码,大家就帮我写一下啦,谢谢了啊...
      

  14.   

    最笨的方法就是先读到dataset中.然后就方便了....
      

  15.   


    我看那语句是定位到特定行,但并没有告诉我怎样读那行的数据,原谅我的愚蠢吧,你也知道,写程序一个类型没搞懂,就不可能写出正确的程序,所以我不会用
    DataRow[] dr = dt.Select(" F1='220'");//找到你需要的行
    这一行中的DataRow[] dr来读取一行中的指定数据...因为我不懂他是什么类型,怎样转为string?  (强制吗?)而且我上面也说过,    DataRow[] dr = dt.Select(" F1='220'");//找到你需要的行
    这一行编译没错,但调试的时候有错,错误信息:  Object reference not set to an instance of an object. 
    还有  Object reference not set to an instance of an object. 
    这一行中的  "F1"是列名吗?  我可以换成我excel表里的学号吗?  (学号是我EXCEL表里一个列的列名..)请大家解释一下,谢谢了...
      

  16.   


    string MyExcel = "2008毕业生档案投递正稿.xls";
                DataTable dt = new DataTable();
                string strConnection = "Provider=Microsoft.Jet.OLEDB.4.0;Extended Properties='Excel 8.0;HDR=YES;IMEX=1;';" + "Data Source=" + MyExcel + ";";
                OleDbConnection connection = new OleDbConnection(strConnection);
                connection.Open();
                try
                {
                    string str = "Select * from [Sheet1$] where F1='220'";
                    OleDbDataAdapter adapter = new OleDbDataAdapter(str, connection);
                    adapter.Fill(dt);
                }
                catch
                {
                    dt = null;
                }
                finally
                {
                    connection.Close();
                }
                DataRow[] dr = dt.Select(" F1='220'");//找到你需要的行
    DataRow[] dr = dt.Select(" F1='220'");  这句调试时有错,
    Object reference not set to an instance of an object. 
    有谁愿意解释下吗?
    谢谢...
      

  17.   

    DataRow[] dr = dt.Select(" F1='220'");  这句调试时有错, 
    Object reference not set to an instance of an object. 
    有谁愿意解释下吗? 是这句本身有错,还是我自已的原因...
    谢谢...