确定使用哪个版本的Excel创建.xls或.xlsx

时间:2012-09-15 15:22:47

标签: c# excel

我即将编写一个应用程序来启动.xls,.xlsx和.xlsm以及用于创建这些文件的Excel版本。 原因是它们包含许多VBA脚本,这些脚本在不同版本的Excel中的工作方式不同(感谢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,{{1是错误。如果可行,下一步是将C ++“翻译”为C#,并将其集成到我的程序中。

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

0 个答案:

没有答案