我即将编写一个应用程序来使用用于创建这些文件的 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#,并将其集成到我的程序中。
对不起德国人的评论,但我的英语不太好。