2009-04-22 10 views
1

ich programmatisch am Öffnen eines Excel-Arbeitsmappe unter einem Ordnerbaum für einige Projektreferenzen zu überprüfen, mit dem folgenden Code -Excel-Blatt Projektreferenzen

workbook = app.Workbooks.Open(fileName,false,true,Missing,Missing,.....); 
foreach(Reference r in workbook.VBProject.References) 
{ 
     //check for a specific reference here 
} 

Dies funktioniert gut, aber meine Ordnerstruktur ist sehr tief, und ich habe mehr als 20.000 Tabellen gespeichert in ihnen. Abhängig von der Größe der Excel-Datei dauert der Aufruf von Workbooks.Open() manchmal sehr lange (bei einigen Dateien mehr als 5 Minuten pro Aufruf). Gibt es dafür einen schnelleren und effizienteren Weg?

Danke für die Hilfe

Antwort

0

Ich glaube nicht, dass Sie die Workbooks.Open Leistung erhöhen kann. Wenn Sie jedoch nur überprüfen möchten, ob eine bestimmte Referenz von der Kalkulationstabelle verwendet wird, sollten Sie die Excel-Datei im Binärmodus öffnen und nach der DLL-Zeichenfolge suchen (der Pfad der DLL, der die Funktionalität bereitstellt) im Bereich "Standort" des Fensters "Referenzen" angezeigt).

Das wäre sehr grobe Art und Weise, aber wenn die Workbook.Open-Leistung wirklich ein Flaschenhals ist, dann können Sie es auf jeden Fall versuchen.

+0

Danke. Ich habe die binäre Option noch nicht getestet, da es nicht sehr einfach ist und es mit den WorkBooks.Open vorerst geschafft hat. –

1

Es scheint wie immer, wenn Sie das Excel-Objektmodell treffen müssen, werden Sie einen Leistungseinbruch machen. Ich stimme dem vorherigen Poster zu, dass Sie die Excel-Dateien direkt lesen müssen, wenn Sie die Leistung beschleunigen möchten.

Da Excel 2007-Dateien (* .xlsm, * .xltm) im Wesentlichen * .zip-Dateien sind, müssen Sie die Datei vbaProject.bin direkt finden und darauf zugreifen. Ein kurzer Blick zeigt auf den Pfad als (ich die Erweiterung geändert, so konnte ich die Datei sehen):

..\Book1.zip\xl\vbaProject.bin 

Offensichtlich könnten Sie manuell diesen Behälter Datei graben und besondere Referenzen finden (wie vom vorherigen Plakate vorgeschlagen), Wenn Sie jedoch alle Referenzen in einem Projekt durchlaufen möchten, müssen Sie die API-Aufrufe IStream/IStorage verwenden. Es gibt einen tollen Artikel über das Reverse Engineering der Office BIN-Dateien hier: http://www.codeproject.com/KB/cs/office2007bin.aspx. Um auf Referenzen in vbaProject.bin zuzugreifen, suchen Sie nach dem Abschnitt "Lesen oder Aktualisieren von vbaProject.bin-Teilen". Es gibt auch ein Beispiel-C# -Code-Projekt, das veranschaulicht, wie ein Ole-Container gelesen wird. Ich habe gerade einen Höhepunkt bei der Codebeispiel genommen, also kann ich seine Wirksamkeit nicht bestätigen, aber es scheint in Ordnung zu sein.

Hoffe, dass hilft!

+0

Es stimmt, dass Office 2007 erst später im Jahr veröffentlicht wird. Daher behalte ich den bestehenden Code vorerst bei, aber Office 2007 würde es besser machen, diesen Vorgang durchzuführen. Danke für den Tipp. –

Verwandte Themen