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

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

我已经尝试了迟绑定Excel并阅读CalculationVersion属性,但是这只显示了我用来编辑文件的最后一个版本。 .xlsx中app.xml中的版本号相同。 编辑和保存文件后,似乎文件的二进制文件中的标记也在改变,但我不确定所有这些标记是否改变。

有谁知道一个标记或属性,给出了创build该文件的版本?

如果仅适用于.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#,并尽可能将其整合到我的程序中。

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