excel2000和excel2003打开excel文件的方法参数不同,所以需要在程序里判断安装环境是2000还是2003,然后调用不同的方法.
问题有2个:
1.如何在C#中判断安装环境的excel版本;
2.如何让C#编译时忽略调用不同方法导致参数不匹配错误,如本机装2000,则编译时2003的方法肯定不能通过;

解决方案 »

  1.   

    1 通过读注册表 找到安装目录
    2 找到execl的组件或者.exe
    3 通过Fileversion.getversion方法获取版本
    4 通过判断版本调用不同方法
      

  2.   

    新建Excel实例以后, 检查.Version属性就可以了
      

  3.   

    com 应该是向下兼容的尤其是ms 的
    你因用 2000 的在 2003 下应该不会出问题
    但是如果引用 2003 的就不好说了就像用 ado1.5 的编译完vb程序现在还好用一样!
      

  4.   

    做一个中间层,根据不同的excel版本,调用不同的接口。
      

  5.   

    为每个版本做一个dll,然后在程序里,根据版本,使用动态加载程序集的方法。
      

  6.   

    请问:
    Excel._Application xlApp=new Excel.ApplicationClass();
    object missing=Type.Missing;
    Excel._Workbook xlBook=xlApp.Workbooks.Open(filename,missing,missing,missing,missing,missing,missing,missing,missing,missing,missing,missing,missing,missing,missing);
    这段代码如何用反射来做?
    跟下面差不多,但因为Open方法并不是xlApp的直接成员,不知道如何调用它?Type t = typeof(Excel.ApplicationClass);
    Object xlApp=t.InvokeMember(null,BindingFlags.DeclaredOnly|BindingFlags.Public|BindingFlags.NonPublic|BindingFlags.Instance|BindingFlags.CreateInstance,null,null,null);
    Object[] args = new Object[]{filename,missing,missing,missing,missing,missing,missing,missing,missing,missing,missing,missing,missing,missing,missing};
    Excel._Workbook xb=(Excel._Workbook)t.InvokeMember("Open",BindingFlags.Default|BindingFlags.InvokeMethod,null,xlApp,args);解决上面问题马上给分,谢谢!
      

  7.   


    纯C#代码的Excel读取源代码
    2007-12-8 21:31:01
    本代码使用纯C#编写,不需要Office Excel Com组件的支持,它的功能包括:读出在工作簿(workbook)中的所有Worksheet,读出所有WorkSheet中的单元,读取单元的内容(文本,数字,日期或错误),读取单元的格式(字体,对齐,线条类型,背景等),够读取文件中的图片,获取图象的大小,位置,数据和格式 
      

  8.   

    Excel._Workbook   xlBook=xlApp.Workbooks.Open(filename,missing,missing,missing,missing,missing,missing,missing,missing,missing,missing,missing,missing,missing,missing); 
    这段代码如何用反射来做? 
    跟下面差不多,但因为Open方法并不是xlApp的直接成员,不知道如何调用它? 
    -----------------分割線---------------------
    object Workbooks = xlApp.GetType().GetProperty("Workbooks").GetValue(xlApp, null);
    MethodInfo method = Workbooks.GetType().GetMethod("Open");
    Excel._Workbook xlBook = (Excel._Workbook)method.Invoke(Workbooks, new object[]{"filename", 
        Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value,
        Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, 
        Missing.Value, Missing.Value, Missing.Value, Missing.Value,});
      

  9.   

    可以考虑动态调用Excel,从而避免因为版本不同而使用程序无法编辑或调试。可以参考下面的代码来动态的调用Excel功能:
    private void button1_Click(object sender, EventArgs e)
    {
    object objApp;
    object objBook;
    object objBooks;
    object objSheets;
    object objSheet;
    object objRange;
    object objCells;
    object[] Parameters; try
    {
    // 获取Excel类型并建立其实例
    Type objExcelType = Type.GetTypeFromProgID("Excel.Application");
    if (objExcelType == null)
    {
    return;
    }
    objApp = Activator.CreateInstance(objExcelType);
    if (objApp == null)
    {
    return;
    }
    //获取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); try
    { //获取操作范围
    for (int i = 1; i < 100; i++)
    {
    Parameters = new Object[2] { 1, i };
    objCells = objSheet.GetType().InvokeMember("Cells", BindingFlags.GetProperty, null, objSheet, Parameters);
    //向指定单元格填写内容值
    Parameters = new Object[1] { "Hello, World!" };
    objCells.GetType().InvokeMember("Value", BindingFlags.SetProperty, null, objCells, Parameters);
    } }
    catch (Exception operException)
    {
    MessageBox.Show(operException.Message);
    }
    finally
    {
    //不提示保存
    Parameters = new Object[1] { false };
    objApp.GetType().InvokeMember("DisplayAlerts", BindingFlags.SetProperty, null, objApp, Parameters); //保存文件并退出
    Parameters = new Object[1] { @"D:\a.xls" };
    objBook.GetType().InvokeMember("SaveAs", BindingFlags.InvokeMethod, null, objBook, Parameters);
    objApp.GetType().InvokeMember("Quit", BindingFlags.InvokeMethod, null, objApp, null);
    GC.Collect();
    }
    }
    catch (Exception theException)
    {
    String errorMessage;
    errorMessage = "Error: ";
    errorMessage = String.Concat(errorMessage, theException.Message);
    errorMessage = String.Concat(errorMessage, " Line: ");
    errorMessage = String.Concat(errorMessage, theException.Source); MessageBox.Show(errorMessage, "Error");
    }
    }
      

  10.   

    非常感谢laoshi10 & hbxtlhx !