2017-10-02 1 views
1

ich die Bibliothek verwiesen haben Microsoft.Office.Interop.Excel‚Keine Überlast für Verfahren ...‘ Fehler beim Verfahren über CodeDom mit interop.excel

und mit Hilfe der einfachen Stück Code folgen, kann ich eine Arbeitsmappe öffnen und das erste Arbeitsblatt :

Microsoft.Office.Interop.Excel.Application app = new Microsoft.Office.Interop.Excel.Application(); 
Workbook wb = app.Workbooks.Open(fileName, false); 
Worksheet ws = (Worksheet)wb.Worksheets.get_Item(1); 

ws.Select(); 

//do stuff with worksheet 

wb.Close(false); 
app.Quit(); 

Dies läuft wie erwartet ohne Fehler. Wenn ich jedoch den oben genannte Code dynamisch zu gestalten und kompilieren Sie das obige Snippet des CodeDom.Compiler verwendet, dann tritt ein Fehler auf der select-Methode:

„Keine Überladung für Methode‚Auswählen‘nimmt‚0‘Argumente“

ich kann dieses Problem umgehen, indem Sie eine geringfügige Änderung der Auswahl Anweisung machen als so:

ws.Select(Missing.Value) 

Aber ich verstehe nicht ganz, warum ich das dies tun müssen, um?

Ich habe hinzugefügt, die bereits diese Verweise auf den dynamischen Code:

using System; 
using System.Windows.Forms; 
using System.Reflection; 
using Microsoft.Office.Interop.Excel; 

und haben den CodeDom Compiler wie so ein:

CompilerParameters compilerParams = new CompilerParameters(); 
compilerParams.GenerateInMemory = true; 
compilerParams.GenerateExecutable = false; 
compilerParams.ReferencedAssemblies.Add("System.Windows.Forms.Dll"); 
compilerParams.ReferencedAssemblies.Add(@"J:\Visual Studio 2015\Projects\TestProgram\packages\Microsoft.Office.Interop.Excel.15.0.4795.1000\lib\net20\Microsoft.Office.Interop.Excel.dll"); 

aber gibt es etwas anderes/eine andere Einstellung, Ich vermisse dich bitte?

+0

Was wählen Sie die "Select" -Anweisung zu tun? Übergeben von Null an die Auswahl funktioniert, aber Sie wissen, dass es das Blatt nicht auswählt, https://msdn.microsoft.com/en-us/vba/excel-vba/articles/worksheet-select-method-excel – BugFinder

+1

CodeDom bekam nie ein viel Liebe. Ich vermute, dass der C# -CodeDom-Anbieter nie aktualisiert wurde, um C# 4 zu verstehen (einschließlich der benannten und optionalen Parameter) –

+1

Vielen Dank für Ihre Antwort. Es löscht dann auch einige Zeilen, führt weitere Aufräumarbeiten durch und agiert dann als CSV erneut, bevor die Arbeitsmappe tatsächlich geschlossen wird. Im regulären (nicht dynamischen) Code funktioniert diese Zeile, ich kann die darüber liegende Blattauswahlzeile auf 1, 2 oder was auch immer ändern, und die "ws.Select;" line wird das Arbeitsblatt auswählen, für das ws festgelegt wurde. Im dynamischen Code funktioniert das jedoch nicht. –

Antwort

1

Ich habe das jetzt arbeiten ...

Damien - Sie hat mir denken, und ich sah in den CodeDom Provider Dokumentation ein bisschen mehr. Ich konnte nichts über Versionen als solche finden, bemerkte aber, dass Microsofts Methode zur Einrichtung des Anbieters sich etwas von den Beispielen unterschied, die ich normalerweise von anderen gesehen habe.

Dies war, wie der Anbieter vor eingerichtet wurde:

Dictionary<string, string> providerOptions = new Dictionary<string, string> 
    { 
     {"CompilerVersion", "v3.5"} 
    }; 
CSharpCodeProvider provider = new CSharpCodeProvider(providerOptions); 

Und das ist, wie Microsoft es von https://docs.microsoft.com/en-us/dotnet/api/microsoft.csharp.csharpcodeprovider?view=netframework-4.7

CodeDomProvider provider = CodeDomProvider.CreateProvider("CSharp"); 

erlaubt Diese einfache Änderung zu kompilieren den Code eingerichtet in ihrem Beispiel hat ohne Fehler und scheinbar die gleiche Version von C# verwendet.

+0

Also geben Sie sich die "Antwort" (Häkchen auf der linken Seite), so dass wir das nicht mehr sehen müssen :) – SlapY

+1

Danke SlapY. Ich werde es tun - ich habe es bereits versucht, aber es sagt, dass ich 2 Tage warten muss, bevor ich meine eigene Antwort als die akzeptierte markieren kann!Beobachte diesen Raum! :) –