我即将编写一个应用程序来启动.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#,并将其集成到我的程序中。
对不起德国人的评论,但我的英语不太好。