Frage

Das liegt bei working..and Ich zog die Entsorgung Code finally-Block, und jetzt schlägt es jedes Mal.

Ich habe eine Test-Tabelle mit 4 Aufzeichnungen, 6 Spalten lang. Hier ist der Code, den ich es bin mit in bringen. Dies ist ASP .NET 3.5 auf IIS 5 (mein pc) und auf IIS 6 (Web-Server).

Es weht auf der Linie direkt vor dem Aufholen: "Werte = (object [,]) range.Value2;" mit dem folgenden Fehler:

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 aus Codeproject, so ich habe keine Ahnung, ob dies der richtige Weg ist, mit Excel zu arbeiten. Vielen Dank für jede Hilfe, die Sie anbieten können.

Hier ist mein Code:

Excel.ApplicationClass app = null;
Excel.Workbook book = null;
Excel.Worksheet sheet = null;
Excel.Range range = null;

object[,] values = null;

try
{
    // Configure Excel
    app = new Excel.ApplicationClass();
    app.Visible = false;
    app.ScreenUpdating = false;
    app.DisplayAlerts = false;

    // Open a new instance of excel with the uploaded file
    book = app.Workbooks.Open(path);

    // Get first worksheet in book
    sheet = (Excel.Worksheet)book.Worksheets[1];

    // Start with first cell on second row
    range = sheet.get_Range("A2", Missing.Value);

    // Get all cells to the right
    range = range.get_End(Excel.XlDirection.xlToRight);

    // Get all cells downwards
    range = range.get_End(Excel.XlDirection.xlDown);

    // Get address of bottom rightmost cell
    string downAddress = range.get_Address(false, false, Excel.XlReferenceStyle.xlA1, Type.Missing, Type.Missing);

    // Get complete range of data
    range = sheet.get_Range("A2", downAddress);

    // get 2d array of all data
    values = (object[,])range.Value2;
}
catch (Exception e)
{
    LoggingService.log(e.Message);
}
finally
{
    // Clean up
    range = null;
    sheet = null;

    if (book != null)
        book.Close(false, Missing.Value, Missing.Value);

    book = null;

    if (app != null)
        app.Quit();

    app = null;
}

return values;
War es hilfreich?

Lösung

Ich bin mir nicht sicher, ob dies Ihr Problem ist oder nicht, aber es kann sehr gut sein. Sie reinigen nicht auf Ihre Excel-Objekte richtig. Sie sind nicht verwalteten Code und kann schwierig sein, bis zu reinigen. Schließlich sollte wie folgt aussehen: Und wie die Kommentare mit Excel von asp.net gearbeitet haben zur Kenntnis genommen, ist keine gute Idee. Dieser Bereinigungscode ist von einer winform App:

 GC.Collect();
 GC.WaitForPendingFinalizers();


 System.Runtime.InteropServices.Marshal.FinalReleaseComObject(range);
 System.Runtime.InteropServices.Marshal.FinalReleaseComObject(sheet);
 System.Runtime.InteropServices.Marshal.FinalReleaseComObject(book);

 WB.Close(false, Type.Missing, Type.Missing);

 Excel.Quit();
 System.Runtime.InteropServices.Marshal.FinalReleaseComObject(Excel);

Bearbeiten

Eine Alternative wäre ado.net zu verwenden, um die Arbeitsmappe zu öffnen.

            DataTable dt = new DataTable();

            string connectionString;
            System.Data.OleDb.OleDbConnection excelConnection;
            System.Data.OleDb.OleDbDataAdapter da;
            DataTable dbSchema;
            string firstSheetName;
            string strSQL;

            connectionString = @"provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + filename + @";Extended Properties=""Excel 12.0;HDR=YES;IMEX=1""";
            excelConnection = new System.Data.OleDb.OleDbConnection(connectionString);
            excelConnection.Open();
            dbSchema = excelConnection.GetOleDbSchemaTable(System.Data.OleDb.OleDbSchemaGuid.Tables, null);
            firstSheetName = dbSchema.Rows[0]["TABLE_NAME"].ToString();
            strSQL = "SELECT * FROM [" + firstSheetName + "]";
            da = new OleDbDataAdapter(strSQL, excelConnection);
            da.Fill(dt);

            da.Dispose();
            excelConnection.Close();
            excelConnection.Dispose();

Andere Tipps

Erstellen / Excel zu zerstören bei jeder Anfrage wird absolut schrecklich Leistung egal, was Sie tun. Im Allgemeinen eine beliebige Office-Anwendung mit Hilfe der Automatisierung ausgeführt wird, ein schmutziges Geschäft für eine Vielzahl von Gründen (siehe hier ). Der einzige Weg, habe ich es zu arbeiten, um eine einzelne Instanz der App haben (in meinem Fall Word), die einmal initialisiert wird, und dann werden die Anforderungen an diese Instanz der Warteschlange für die Verarbeitung von

Wenn Sie von den apps bleiben weg und analysieren die Datei selbst (MS-Bibliotheken verwenden, nur XML)

Sie werden in eine Menge Ärger laufen Interop von ASP.NET verwenden. Es sei denn, dies für einige winzige im Haus Anwendung gemeint ist, wäre es ratsam, nicht darauf, mit ihm zu gehen.

Office-Interop ist keine Programmierung API im herkömmlichen Sinne - es ist das Office-Makrosystem auf seinen maximalen genommen ist, mit der Fähigkeit, Inter zu arbeiten - z. B. ein Excel-Makro mit Outlook interagieren könnte

Einige Folgen der Interop verwenden, sind:

  • Sie eine vollständige Kopie der Office-Anwendung tatsächlich öffnen.
  • Ihre Aktionen, die von der Anwendung ausgeführt werden, als ob ein Benutzer initiiert hat -., Die statt Fehler bedeutet, Nachrichten in Code zurückgegeben werden, werden sie in der GUI angezeigt werden
  • Ihre Kopie der Anwendung schließt nur, wenn Sie es ausdrücklich befehlen - und selbst dann können Fehler verhindern, dass aus tatsächlich passiert (die Anwendung präsentieren kann ein „möchten Sie speichern“ -Dialog, wenn Sie nicht programmierbar haben Excel sagen, dass die Änderungen nicht gespeichert werden müssen). Dies führt in der Regel viele versteckte Kopien von Excel gelassen zu werden auf dem System ausgeführt -. Öffnen Sie den Task-Manager und sehen, wie viele excel.exe Prozesse ausgeführt werden

All dies macht Interop etwas für normale Desktop-Anwendung zu vermeiden, und etwas, das nur als letztes Mittel für Server-Anwendungen verwendet werden soll, da ein Popup-GUI erfordern Aktion oder Skript, das Verfahren ist Mord auf einer Server-Umgebung austritt.

Einige Alternativen sind:

  • Verwenden von Microsoft Office 2007 XML-basierten Formaten, so dass Sie die XML schreiben können Dateien selbst.
  • Verwenden von SpreadsheetGear.Net , die eine .NET binäre Excel-Datei-Leser / Schreiber ist (Sie don‘ t Notwendigkeit Excel installiert, da es ganz allein stehen). SpreadsheetGear Modelle selbst nach dem Intertop Schnittstellen einfachen Konvertierung älteren Code zu machen.

Der Fehler ist wahrscheinlich genau das, was es sagt, Sie nicht genügend Arbeitsspeicher Fehlermeldung erhalten. Versuchen Sie das Laden der Werte-Array in mehrere kleinere Stücke aufzuteilen, anstatt den gesamten Bereich auf einmal zu bekommen. Ich habe versucht, Ihren Code in C # und hatte keine Probleme, aber meine Tabelle war ich Laden war meistens leer.

bemerkte ich, dass der Bereich die gesamte Tabelle (von A2 auf IV65536 oder etwas), obwohl war. Ich bin mir nicht sicher, ob das beabsichtigt ist.

Eine Sache, die Sie könnten versuchen, mit ist sheet.UsedRange, das auf der Anzahl der Zellen abgeholzt werden Sie geladen werden.

Ein paar zusätzliche kleine Dinge, die ich gelernt habe, die Sie nützlich finden können:

  • Verwenden Anwendung statt ApplicationClass
  • Verwenden Sie Marshal.FinalReleaseComObject (Bereich) (und auch für Blatt, Buch, app) sonst werden Sie Ihre EXCEL.EXE Prozess kleben herum.
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top