2

我即将编写一个应用程序来使用用于创建这些文件的 Excel 版本启动 .xls、.xlsx 和 .xlsm。原因是它们包含许多在不同版本的 Excel 中工作方式不同的 VBA 脚本(感谢 Microsoft!)。我正在寻找一种方法来确定用于创建此类文件的版本。

我尝试过后期绑定 Excel 并读取CalculationVersion属性,但这仅向我显示了用于编辑文件的最后一个版本。.xlsx 中 app.xml 中的版本号相同。在编辑和保存文件后,文件二进制文件中的标记似乎也在发生变化,尽管我不确定所有这些标记都会发生变化。

有谁知道提供创建文件的版本的标记或属性?

如果它仅适用于 .xls 或仅适用于 .xlsx,请同时回答。这将使我更接近我的目标。

编辑:获取计算版本:

  private string CalculationVersion()

    {   //Variablen

        string version = String.Empty;

        object Object_Excel_Application = null;

        object Object_WorkBooks = null;

        object Object_WorkBook = null;

        object[] Parameters;

        Type Type_of_Programm;



        //Typ der Excel.Application bestimmen

        Type_of_Programm = Type.GetTypeFromProgID("Excel.Application");



        //Eine Excel instanz erstellen und in Object_Excel_Application speichern

        Object_Excel_Application = Activator.CreateInstance(Type_of_Programm);



        try //Versuche

        {

            //Excel unsichtbar machen

            Parameters = new Object[1];

            Parameters[0] = 0;

            Object_Excel_Application.GetType().InvokeMember("Visible", BindingFlags.SetProperty, null, Object_Excel_Application, Parameters);



            //Interaktion mit dem User unterbinden

            Parameters = new Object[1];

            Parameters[0] = 0;

            Object_Excel_Application.GetType().InvokeMember("Interactive", BindingFlags.SetProperty, null, Object_Excel_Application, Parameters);



            //Workbooks erstellen

            Object_WorkBooks = Object_Excel_Application.GetType().InvokeMember("Workbooks", BindingFlags.GetProperty, null, Object_Excel_Application, null);



            //Die angegebene Datei öffnen

            Parameters = new Object[15];

            Parameters[0] = dateiPfad;

            for(int i = 1; i <= 13; i++)

            {

                Parameters[i] = Missing.Value;

            }

            Parameters[14] = true;

            Object_WorkBook = Object_WorkBooks.GetType().InvokeMember("Open", BindingFlags.InvokeMethod, null, Object_WorkBooks, Parameters);



            //Letzte Calculations Version auslesen

            version = Object_WorkBook.GetType().InvokeMember("CalculationVersion", BindingFlags.GetProperty, null, Object_WorkBook, null).ToString();

            MessageBox.Show(version);



            //Wieder schließen

            //Workbook zumachen

            Parameters = new Object[3];

            Parameters[0] = true;

            Parameters[1] = Missing.Value;

            Parameters[2] = Missing.Value;

            Object_WorkBook.GetType().InvokeMember("Close", System.Reflection.BindingFlags.InvokeMethod, null, Object_WorkBook, Parameters);



            //Excel schließen

            Object_Excel_Application.GetType().InvokeMember("Quit", System.Reflection.BindingFlags.InvokeMethod, null, Object_Excel_Application, null);



            //Version in gekürtzter Form zurückgeben

            return version_long_to_version_short(version); //Die Hauptversionsnummer zurückgeben

        }//-try

        catch (Exception e) //bei Fehler

        {

            MessageBox.Show("Error: " + e.Message, "Error"); //Fehler anzeigen

            return String.Empty; //Leeren String zurückgeben

        }//-catch

        finally //Schlussendlich

        {

            //Die objecte wieder freigeben

            Object_freigeben(Object_WorkBook);

            Object_freigeben(Object_WorkBooks);

            Object_freigeben(Object_Excel_Application);

        }//-finally

    }//-CalculationVersion

现在我正在尝试解决 Excel 97 文件似乎没有存储这个的问题,所以我有这个 C++ 用于确定文件的 bof 是否告诉我它是 Excel 97(输出 8)或任何其他版本(输出 0)。计划是执行这个,如果它给我一个0我会得到CalculationVersion,否则我知道它的 Excel 97. -1, -2,-3是错误的。如果可行,下一步是尽可能将我的 C++“翻译”为 C#,并将其集成到我的程序中。

对不起德国人的评论,但我的英语不太好。

4

0 回答 0