xlApp = new Excel.ApplicationClass();
xlBook = xlApp.Application.Workbooks.Open(path,null,null,null,null,null,null,null,null,null,null,null,null,null,null);我在调用Workbooks.Open的时候报了一个{System.Runtime.InteropServices.COMException}的错:Exception from HRESULT: 0x800A03EC.大家知道该怎么解决吗?

解决方案 »

  1.   

    給你一段調用Excel的源碼﹕
    Excel.ApplicationClass  exec= new Excel.ApplicationClass();
    exec.Visible = true ;
    Excel.Workbooks works= exec.Workbooks ;
    Excel._Workbook workbook = works.Add (Excel.XlWBATemplate.xlWBATWorksheet); 
    Excel._Worksheet worksheet = (Excel._Worksheet)workbook.ActiveSheet;
    具體內容﹐可參考﹕
    http://dev.csdn.net/develop/article/79/79507.shtm
      

  2.   

    用OLEDB打开:
    OleDbConnection objConn=null;

    DataSet data=new DataSet();
    try
    {
    string strConn= "Provider=Microsoft.Jet.OleDb.4.0;" + "data source="+FileName+ ";Extended Properties=Excel 8.0;";
    objConn=new OleDbConnection(strConn);
    objConn.Open();
    DataTable schemaTable = objConn.GetOleDbSchemaTable(System.Data.OleDb.OleDbSchemaGuid.Tables,null);
    int  SheetIndex =0;
    try{ SheetIndex =Convert.ToInt32( textBox1.Text.Trim())-1;}
    catch
    {
    SheetIndex =0;
    }
    string tableName=schemaTable.Rows[SheetIndex][2].ToString().Trim();
    label2.Text =tableName; string strSql= "Select * From ["+tableName+"]";
    OleDbCommand objCmd=new OleDbCommand(strSql, objConn);
    OleDbDataAdapter sqlada=new OleDbDataAdapter();
    sqlada.SelectCommand=objCmd;
    sqlada.Fill(data,"BuyPrice");
    objConn.Close();
    }
    catch

    objConn.Close();
    throw;
    }
    相关部分自己修改.
      

  3.   

    如果读取的话用上面的OLEDB方法,操作的话,用下方法
    Object oMissing =System.Reflection.Missing.Value ;
    Excel.Application excel =new Excel.ApplicationClass();
    Excel.Workbook workBook;
    Excel.Worksheet workSheet1;
    excel.Visible=false;
    workBook=excel.Workbooks.Add(oMissing); workSheet1 =(Excel.Worksheet)workBook.Worksheets .get_Item(1);
    Excel.Range rangeTitle,range,rangeHeader;
    range =workSheet1.get_Range("a2",oMissing);
      

  4.   

    多谢二位
    不过我要实现的功能是把excel文件的数据读到dataset
    所以会传一个文件的路径进来,然后打开这个文件,读到dataset
      

  5.   

    Dim strCon As String
            strCon = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + myFile.PostedFile.FileName + ";Extended Properties=Excel 8.0;"        Dim dt_excel As DataTable        Dim conn As OleDb.OleDbConnection        Try
                conn = New OleDb.OleDbConnection(strCon)
                Dim myAdap As OleDb.OleDbDataAdapter
                myAdap = New OleDb.OleDbDataAdapter("select * from [Sheet1$]", conn)            Dim myDs As New DataSet
                myAdap.Fill(myDs, "T_GZB")
                dt_excel = myDs.Tables(0)
      

  6.   

    那你用OLEDB打开就最方便了.
    string strConn= "Provider=Microsoft.Jet.OleDb.4.0;" + "data source="+FileName+ ";Extended Properties=Excel 8.0;";
    FILENAME用你的文件路径就行了
      

  7.   

    但我如何知道这个文件里sheet1的名字呢?
      

  8.   

    string aaa="";
    for(int i=0;i<schemaTable.Rows.Count;i++)
     aaa+=schemaTable.Rows[i][2].ToString();
    所有表名都在这了
      

  9.   

    可是schemaTable中的rows是按照sheet的名字的字母排序的
    我只是想第一个sheet,应该怎么办呢
      

  10.   

    比如现在文件里有3个sheet,名字分别是:UserID,Agency,Application
    schemaTable里的Rows[0]就是Agency,Rows[1]是Application,Rows[2]才是真正的第一个sheet:UserID所以Rows[0]取到的就不一定是文件里的sheet1
      

  11.   

    还有就是怎么排除掉restrictions的字段
    因为如果有一个restrictions的字段,其中有三个选项,那么在schemaTable.Rows中就会多出三条记录
      

  12.   

    最简单的方法,你把后面所有的null参数值改成1,就好了,呵呵
      

  13.   

    shengjie3017(心柔) ( ) 信誉:99  2005-11-16 12:21:00  得分: 0  
       可是schemaTable中的rows是按照sheet的名字的字母排序的
    我只是想第一个sheet,应该怎么办呢
    //*************************************************************
     
    //創建一個數據Excel連接******************************************************************
    string strCon = "Provider = Microsoft.Jet.OLEDB.4.0 ; Data Source = "+FilePath+";Extended Properties=Excel 8.0" ;
    OleDbConnection myConn = new OleDbConnection ( strCon ) ;
    string strCom = " SELECT * FROM [COQ$]" ;
                                         //COQ是sheet名字
    myConn.Open ();
      

  14.   

    楼上的,问题是我不知道这个文件第一个sheet的名字啊  
    名字不是固定的,不可以hardcode啊
      

  15.   

    Cnapollo(旁痞),你怎么还没醒啊
      

  16.   

    SORRY,我没试出OLEDB打开后正确取出表名的,不过interop.Excel打开是可以正常取出表名,
    Object oMissing =System.Reflection.Missing.Value ;
    Excel.Application excel =new Excel.ApplicationClass();
    //excel.Application.Workbooks.Open(FileName,oMissing,oMissing,oMissing,oMissing,oMissing,oMissing,oMissing,oMissing,oMissing,oMissing,oMissing,oMissing);
    Excel.Workbook work =excel.Application.Workbooks.Open(FileName,oMissing,oMissing,oMissing,oMissing,oMissing,oMissing,oMissing,oMissing,oMissing,oMissing,oMissing,oMissing);
    string aaa="";
    foreach(Excel.Worksheet ws in work.Worksheets)
    {
    aaa+=ws.Name;
    }
      

  17.   

    你先用这个方法取表名吧,OLE的方法我再试试看,
      

  18.   

    只能这样吗?
    调用Excel.Application excel =new Excel.ApplicationClass();
    很慢的,有performance的问题的
    而且还要回收Excel
      

  19.   

    还有个郁闷的问题哦
    当excel文件中有restrictions的字段的时候,调用sqlada.Fill(data)的时候,restrictions的字段没有fill进DataSet
    :(
      

  20.   

    还有个郁闷的问题哦
    当excel文件中有restrictions的字段的时候,调用sqlada.Fill(data)的时候,restrictions的字段没有fill进DataSet
    :(
    我也不懂;(
      

  21.   

    看看这个
    http://www.51team.com/document/DocumentDetail.aspx?ID=_ed75a587-429b-4ec3-a6da-9dcd6eb&doctype=0--------------------------------
    www.51team.com
      

  22.   

    没办法了,OLEDE取出的DATATABLE中worksheet名自动排序的,他把excel当着关系数据库处理,数据库表名都是按名称来排序的.
      

  23.   

    呵呵 谢谢大家的帮忙 小女子感激万分啊
    我已经说服了designer,sheet name可以hard code了
    再次谢谢各位啦
    还有个问题,就是当excel中有cell的format是Number时,这个cell的值读到dataset就是null。
    各位知道改怎么解决吗?
      

  24.   

    excel中cell改为字符类型是最方便的,不用改程序。方法是在excel中数字前加'号