これらのファイルの作成に使用したバージョンの 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ファイルがこれを保存していないように見えるという問題を修正しようとしているので、ファイルのbofがExcel 97(出力8)または他のバージョンであることを教えてくれるかどうかを判断するために使用されるこのC ++があります(出力 0)。計画はこれを実行することであり、それが私に与えられた場合0
は を取得します。それ以外の場合は、CalculationVersion
その Excel 97がエラー-1
であることがわかっています。これが機能する場合の次のステップは、可能であれば C++ を C# に「変換」し、プログラムに統合することです。-2
-3
ドイツ語のコメントで申し訳ありませんが、私の英語はあまり上手ではありません。