Warum bin ich immer ein Out of Memory " - Fehlermeldung zu tun ASP .NET Excel-Interop?
Diese war arbeiten..und ich zog die Entsorgung code des finally-Blocks, und jetzt scheitert es jedes mal.
Ich habe eine test Tabelle mit 4 records, 6 Spalten lang. Hier ist der code, den ich verwende, um es in. Das ist ASP .Net 3.5 auf IIS 5 (mein pc) und auf IIS 6 (web-server).
Bläst er bis auf die Zeile rechts, bevor der Haken: "values = (object [,]) - Bereich.Wert2;" mit der folgenden Fehlermeldung:
11/2/2009 8:47:43 AM :: Not enough storage is available to complete this operation. (Exception from HRESULT: 0x8007000E (E_OUTOFMEMORY))
Irgendwelche Ideen? Vorschläge? Ich habe die meisten dieser code von codeproject, also ich habe keine Ahnung, ob dies der richtige Weg, um die Arbeit mit Excel. Vielen Dank für jede Hilfe können Sie zur Verfügung stellen.
Hier ist mein code:
Excel.ApplicationClass app = null; Excel.Workbook book = null; Excel.Worksheet sheet = null; Excel.Range Range = null; object[,] Werte = null; versuchen { //Konfigurieren Von Excel app = new Excel.ApplicationClass(); app.Sichtbar = false; app.ScreenUpdating = false; app.DisplayAlerts = false; //Öffnen Sie eine neue Instanz von excel mit der hochgeladenen Datei Buch = app.Arbeitsmappen.Open(Pfad); //Den ersten Arbeitsblatt im Buch Blatt = (Excel.Worksheet)book.Worksheets[1]; //Beginnen mit der ersten Zelle der zweiten Zeile range = sheet.get_Range("A2", Missing.Wert); //Alle Zellen in die richtige range = range.get_End(Excel.XlDirection.xlToRight); //Alle Zellen nach unten range = range.get_End(Excel.XlDirection.xlDown); //Adresse der unteren rechten Zelle string downAddress = range.get_Address(false, false, Excel.XlReferenceStyle.xlA1, Type.Fehlt, Geben.Fehlt); //Holen Sie sich die vollständige Palette an Daten range = sheet.get_Range("A2", downAddress); //2d-array mit allen Daten values = (object [,]) - Bereich.Wert2; } catch (Exception e) { LoggingService.log(e.Message); } schließlich { //Aufräumen range = null; sheet = null; if (book != null) Buch.Close(false, Missing.Wert Fehlt.Wert); Buch = null; if (app != null) app.Quit(); app = null; } return Werte;
Oder irgendwelche server-Umgebung für diese Angelegenheit. Office-interop-office-Makros auf Steroide - Sie kann verwendet werden, für den programmgesteuerten Zugriff auf office-Dokumente, aber es ist nicht eine sehr robuste Art und Weise, es zu tun.
Fair genug. Dies erfordert möglicherweise eine andere Frage, aber wie würden Sie gehen zu lassen, ein Benutzer hochladen .xls-Dokument abrufen der Werte aus? Ich würde denken, es wäre schwer, um Sie in ein flat file...
dies ist leicht erreichbar mit ADO.NET und OleDb - mein internet ist ein bisschen schlecht atm, aber dies sollte Ihnen eine Vorstellung- davidhayden.com/blog/dave/archive/2006/05/26/2973.aspx
Wiert Pluimers. Leider nicht - das könnte nützlich sein, wenn: support.microsoft.com/kb/316934/en-us#12
InformationsquelleAutor IronicMuffin | 2009-11-02
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich bin mir nicht sicher, ob dies Ihr Problem ist oder nicht, aber es sehr gut sein kann. Sie sind nicht bereinigen der excel-Objekte richtig. Sie sind nicht verwalteten code und kann schwierig sein, zu bereinigen. Schließlich sollte in etwa so Aussehen: Und die Kommentare gemerkt haben, arbeiten mit excel aus asp.net ist es nicht eine gute Idee. Dieser cleanup-code ist aus einem winform-app:
BEARBEITEN
Wäre eine alternative zu verwenden ado.net um die Arbeitsmappe zu öffnen.
Danke, ich habe ein einfaches Beispiel
Danke, ich werde ihm eine Chance geben. Alles zu vermeiden, interop, macht mich glücklich. Ich nehme an, der Anbieter die mit office installiert werden? Ich habe um sicherzustellen, dass diese vorhanden sind, auf unsere prod-box. Bezüglich der Bereinigung habe ich versucht, indem Sie die garbage collection, aber nicht fügen Sie die FinalRelease-Aufrufe. Ich werde versuchen, diese zuerst zu sehen, wenn Sie den job zu erledigen.
Sie sind besser dran mit ado.net Wenn alles, was Sie tun müssen, ist die Daten abrufen und aktualisieren nicht würde ich diesen Weg gehen. Auch der connection-string ist für excel 2007
Ja, ich sehe das. Ich habe die 2000-Verbindungszeichenfolge irgendwo aus einem anderen Projekt. Nochmals vielen Dank.
InformationsquelleAutor Gratzy
Erstellen/zerstören, excel-auf jede Anfrage wird absolut schlechte performance, egal, was Sie tun. Im Allgemeinen laufen alle Office-app mithilfe der Automatisierung ist ein hartes Geschäft für eine Menge von Gründen (siehe hier). Der einzige Weg, ich habe es auf der Arbeit ist es, eine einzelne Instanz der app (in meinem Fall Word), die einmal initialisiert, und dann Anfragen sind in der Warteschlange-Instanz für die Verarbeitung
Wenn Sie können, bleiben Sie Weg von den apps und Parsen der Datei selbst (mit Hilfe von MS-Bibliotheken, der nur XML)
+1 in der Tat, halten Weg von der Interop-und Automatisierung ist ein guter Schritt. Spätere Versionen von windows, die mit Office 2007 einfach nicht funktionieren ohne hacks OS, das ist nicht realistisch für eine kommerzielle app. Kasse mein Beitrag stackoverflow.com/questions/1273116/... für eine übersicht der 3rd-party-Bibliotheken, um die Arbeit für Sie erledigen.
InformationsquelleAutor mfeingold
Du gehst zu laufen in eine Menge ärger mit interop von ASP.NET. Es sei denn, dies ist dafür gedacht, kleine in-house-Anwendung wäre es ratsam, nicht vorwärts zu gehen mit es.
Office Interop ist keine Programmier-API im herkömmlichen Sinne - es ist die Office-makro-system genommen, um seine maximale, mit der Fähigkeit zu arbeiten, interprocess - beispielsweise ein Excel-makro könnte mit Outlook interagieren.
Einige Folgen der Verwendung von interop sind:
All dies macht interop etwas zu vermeiden für reguläre desktop-Anwendung, und etwas, das sollte nur als letzten Ausweg verwendet für server-Anwendungen, da ein GUI popup, die eine Aktion erfordern oder ein Skript, dass Leckagen Prozess ist Mord auf einem server-Umgebung.
Einige alternativen sind:
InformationsquelleAutor David
Den Fehler ist wahrscheinlich genau das, was es sagt, sind Sie immer eine " out of memory Fehler. Versuchen, teilen Sie das laden der Werte aus array in mehrere kleinere Stücke, anstatt die gesamte Palette auf einmal. Ich habe versucht deinen code in C# und hatte keine Probleme, aber meine Tabelle war ich dem laden fast leer war.
Bemerkte ich, dass das Spektrum der gesamten Tabelle (A2 bis IV65536 oder so). Ich bin mir nicht sicher, ob das beabsichtigt ist.
Eine Sache, die Sie könnten versuchen, mit Blatt.UsedRange,, das wird reduzieren auf die Anzahl der Zellen die Sie laden.
Ein paar zusätzliche kleine Dinge, die ich gelernt habe, die Sie nützlich finden können:
InformationsquelleAutor David Dietrich