object hrexcel;Type excelType = Type.GetTypeFromProgID("Excel.Application");
hrexcel = Activator.CreateInstance(excelType);
SetObjPeoperty(hrexcel,"Visible","true");
SetObjPeoperty(hrexcel,"UserControl","true");
object workbooks=GetObjPeoperty(hrexcel,"Workbooks");
object xBk =CallObjMethod(workbooks,"Add",new object[]{true});
object excelSheet=GetObjPeopertyWithParam(xBk,"Worksheets",new object[]{1});
object[] agr2 = new object[2] { 1, 1 };
object excelcellcell=GetObjPeopertyWithParam(excelSheet,"Cells",agr2);为什么最后这个方法一直提示 未知的名称 ?请大家帮忙

解决方案 »

  1.   

    我很莫名,你已经引用了Excel的com了,为什么还要反射.....
    哪个方法? GetObjPeopertyWithParam? 你当前的类里定义过这个函数了?
      

  2.   

    private  static object GetObjPeopertyWithParam(object Obj, string member,object Params) 

    // Assumes a using statement in the file:
    // using System.Reflection;
    Type objType = Obj.GetType(); 
    return objType.InvokeMember(member, 
    BindingFlags.Default | 
    BindingFlags.GetProperty, 
    null, Obj, new object[] {Params}); 
    }
    没有引用啊 需要用反射
      

  3.   

    private  static object GetObjPeopertyWithParam(object Obj, string member,object Params) 

    // Assumes a using statement in the file:
    // using System.Reflection;
    Type objType = Obj.GetType(); 
    return objType.InvokeMember(member, 
    BindingFlags.Default | 
    BindingFlags.GetProperty, 
    null, Obj, new object[] {Params}); 
    }
    没有引用啊 需要用反射
      

  4.   

    如二楼为什么不直接用呢?WorkSheets.Cells 返回
    public interface Range
        Member of Microsoft.Office.Interop.Excel
    .net提示 无法解析这个类型!
      

  5.   

    由于考虑到不同的版本 所以想用反射来实现 object objApp; 
    object objBook; 
    object objBooks; 
    object objSheets; 
    object objSheet; 
    //object objRange; 
    object objCells; 
    object[] Parameters;
    object Cells1;
    object Cells2;
    object range; Type objExcelType = Type.GetTypeFromProgID("Excel.Application"); 
    if (objExcelType == null) 

    return; 

    objApp = Activator.CreateInstance(objExcelType); 
    if (objApp == null) 

    return; 
    }

    //设置属性

    SetObjPeoperty(objApp,"Visible","true");
    SetObjPeoperty(objApp,"UserControl","true");
    //获取Workbook集 
    objBooks = objApp.GetType().InvokeMember("Workbooks", BindingFlags.GetProperty, null, objApp, null); 
    //添加一个新的Workbook 
    objBook = objBooks.GetType().InvokeMember("Add", BindingFlags.InvokeMethod, null, objBooks, null); 

    //获取Sheet集 
    objSheets = objBook.GetType().InvokeMember("Worksheets", BindingFlags.GetProperty, null, objBook, null); 

    //获取第一个Sheet对象 
    Parameters = new Object[1] { 1 }; 
    objSheet = objSheets.GetType().InvokeMember("Item", BindingFlags.GetProperty, null, objSheets, Parameters);
    for (int  j=0; j<dataArray.GetLength(1);j++)
    {
    switch(dt.Columns[j].DataType.ToString())
    {
    case "System.String":
    formatstring="@";
    break;
    case "System.DateTime":
    formatstring="yyyy-mm-dd";
    break;
    default:
    formatstring="G/通用格式";
    break;
    }
    for(int k=0;k<dataArray.GetLength(0);k++)
    {
    Parameters = new Object[2] { startRow+k, startCol+j}; //test
    Cells1= objSheet.GetType().InvokeMember("Cells",BindingFlags.GetProperty, null, objSheet, Parameters); 
    SetObjPeoperty(Cells1,"NumberFormatLocal",formatstring);
    SetObjPeoperty(Cells1,"Value2",dataArray[k,j]);

    }
    }这样是可以的 但是有个问题 为什么的worksheet的get_Range方法通过反射不能调用?msdn 说不适合写代码 不明白具体原因 cell 填充太慢了
      

  6.   

    object excelcellcell=GetObjPeopertyWithParam(excelSheet,"Cells",agr2);改成object excelcellcell=GetObjPeopertyWithParam(hrexcel,"Cells",agr2);
      

  7.   


                Type oType = null;            object hrexcel;            Type excelType = Type.GetTypeFromProgID("Excel.Application");
                hrexcel = Activator.CreateInstance(excelType);            oType = hrexcel.GetType();            //SetObjPeoperty(hrexcel, "Visible", "true");
                oType.InvokeMember("Visible", System.Reflection.BindingFlags.SetProperty | BindingFlags.Default, null, hrexcel, new object[] { true });            //SetObjPeoperty(hrexcel, "UserControl", "true");
                oType.InvokeMember("UserControl", System.Reflection.BindingFlags.SetProperty | System.Reflection.BindingFlags.Default, null, hrexcel, new object[] { true });            //object workbooks = GetObjPeoperty(hrexcel, "Workbooks");
                object workbooks = oType.InvokeMember("Workbooks", System.Reflection.BindingFlags.GetProperty | System.Reflection.BindingFlags.Default, null, hrexcel, null);
                
                //object xBk = CallObjMethod(workbooks, "Add", new object[] { true });
                oType = workbooks.GetType();
                object xBk = oType.InvokeMember("Add", System.Reflection.BindingFlags.InvokeMethod | System.Reflection.BindingFlags.Default, null, workbooks, new object[] { true });            //object excelSheet = GetObjPeopertyWithParam(xBk, "Worksheets", new object[] { 1 });
                oType = xBk.GetType();
                object excelSheet = oType.InvokeMember("Worksheets",
                            System.Reflection.BindingFlags.GetProperty | System.Reflection.BindingFlags.Default,
                            null, xBk, new object[] { 1 });
                object[] agr2 = new object[2] { 1, 1 };            //该方法可以正常执行
                //object excelcellcell = GetObjPeopertyWithParam(excelSheet, "Cells", agr2); 
                object excelcellcell = oType.InvokeMember("Cells",
                            System.Reflection.BindingFlags.GetProperty | System.Reflection.BindingFlags.Default,
                            null, excelSheet, agr2);            //如果用反射的话,没有get_Range方法,只有Range方法
                object execelRange = oType.InvokeMember("Range",
                            System.Reflection.BindingFlags.GetProperty | System.Reflection.BindingFlags.Default,
                            null, excelSheet, new object[] { "A1:A3" });            //选择
                oType = execelRange.GetType();
                oType.InvokeMember("Select",
                            System.Reflection.BindingFlags.GetProperty | System.Reflection.BindingFlags.Default,未发现楼主最后一行代码不能执行
    然后
    如果用反射的话,没有get_Range方法,只有Range方法
      

  8.   

    接上面            //选择
                oType = execelRange.GetType();
                oType.InvokeMember("Select",
                            System.Reflection.BindingFlags.GetProperty | System.Reflection.BindingFlags.Default,
                            null, execelRange, null);