代码之家  ›  专栏  ›  技术社区  ›  Dan McClain

以编程方式检索Excel库的版本

  •  3
  • Dan McClain  · 技术社区  · 16 年前

    有没有一种方法可以通过编程检索与C#一起使用的Excel互操作库的版本?

    我知道当您引用库时,这些信息包含在VisualStudio中,但在运行时我看不到这些信息。

    我这样问是因为它在保存工作簿时指定了文件扩展名,如果使用“.xls”保存2007工作簿,2007会抱怨扩展名不正确。

    3 回复  |  直到 16 年前
        1
  •  7
  •   Mike Rosenblum    16 年前

    简单的回答是:您不需要知道加载了哪个PIA版本来解决您的问题。您想知道的是Excel的实际运行版本。尽管正在运行的Excel版本和PIA版本 同样,它们也不一定是,在这种情况下,您关心的是Excel版本,而不是PIA版本。

    确定哪个Excel版本正在运行并不困难,但这并不像应该的那么容易,因为 Excel.Application.Version 属性可以返回诸如“11.0”或“9.0a”之类的字符串,因此不必直接将其解析为整数值。但是,您可以相信小数点(“.”)左侧的所有内容都是版本号,因此以下代码适用于所有版本:

    Excel.Application excelApp = new Excel.Application();
    
    string versionName = excelApp.Version;
    int length = versionName.IndexOf('.');
    versionName = versionName.Substring(0, length);
    
    // int.parse needs to be done using US Culture.
    int versionNumber = int.Parse(versionName, CultureInfo.GetCultureInfo("en-US"));
    
    if (versionNumber >= 12)
    {
        // Excel 2007 or above.
    }
    else
    {
        // Excel 2003 or below.
    }
    

    至于PIA与Excel对象模型问题,在开发时程序集引用的主互操作程序集(PIA)与在目标计算机上运行时实际加载的PIA可能有所不同。例如,如果您引用Excel2002PIA,并且目标计算机正在使用Excel2007,则(通常)将加载Excel2007PIA。规则是在运行时加载目标计算机上可用的最高版本的Office PIA。

    它变得更加复杂,因为目标机器可能(尽管,绝对不可能)在目标机器上加载Excel 2007,但可用的最高PIA是Excel 2003。在本例中,将加载Excel2007,但您的代码将针对Excel2003PIA工作。相反的情况也可能发生:Excel 2007 PIA可用,但计算机上实际安装的最高版本是Excel 2003——在本例中,将加载Excel 2003,但您的代码将针对Excel 2007 PIA工作。

    这些场景在标准设置中不太可能出现。这很可能发生在开发人员的计算机上,其中(1)计算机上同时存在多个Excel版本,或者(2)添加和删除了Excel版本,但没有删除PIA(这本身也不太可能,因为我相信PIA是自动卸载的,但我可能错了)。

    有关这方面的更多信息,请参阅Andrew Whitechapel的文章 Why is VS development not supported with multiple versions of Office?

    编辑:phsr评论的后续行动:

    当我保存工作簿时,我 PIA的版本,我可以给出 将文件名改为正确的扩展名(“xls” vs“xlsx”)。即使2007工作簿是 关于使用不同格式的警告 而不是由文件扩展名指定的。 使用正确的扩展名。你的 仍将打开)但在某些情况下 实例(如本例)确实如此。

    为了澄清这一点,PIA只指定了涉及的接口,而不是功能。这个 Excel 2003 SaveAs method 具有与 Excel 2007 SaveAs method ,因此PIA在这里没有区别。怎么 SaveAs 实际运行

    要解决您的问题,我建议您采取以下两种可能的行动方案之一:

    (1) 请尝试我上面给出的代码,以确定正在运行的Excel版本。如果你这样做,并相应地调整你的代码,它将工作,我保证。如果失败了,展示你的代码,我相信我们可以让它工作。

    Excel.Application excelApp = new Excel.Application();    
    Excel.Workbook workbook = excelApp.Workbooks.Add(Type.Missing);
    
    workbook.SaveAs(
        "MyWorkbook", Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, 
         Excel.XlSaveAsAccessMode.xlNoChange, Type.Missing, Type.Missing, Type.Missing, 
         Type.Missing, Type.Missing);
    

    上述操作的结果是一个名为“MyWorkbook.xls”或“MyWorkbook.xlsx”的工作簿,具体取决于运行的Excel版本。简而言之,让Excel为您完成这项工作,这样您就不必担心了。

        2
  •  2
  •   KB22    16 年前

    我认为windows注册表在这方面是一个很好的信息来源。 识别相关键并在运行时获取它们的值。

    Getting the office version

        3
  •  0
  •   Yuriy Shinbuev    13 年前

    将此代码放在类声明中的某个位置:

    [DllImport("XLCALL32.DLL")]
    public static extern int XLCallVer();
    

    在需要时调用此函数:

    int version = XLCallVer() / 256;
    

    double version = ExcelDnaUtil.ExcelVersion;
    
    推荐文章