2016-06-02 22 views
1

Alle, Dies ist ein kein Problem schien mir aber sieht aus wie es istKopie/assign ExcelPackage EPPlus

ich eine ExcelPackage aus einer Datatable erschaffe (Daten aus SQL in Datatable abgerufen) und ich es kopiere zu einer öffentlichen Eigenschaft vom Typ ExcelPackage (vor dem Speichern), da ich von außerhalb der Klasse auf diese Eigenschaft zugreifen und sie dort speichern muss. Aber es sieht aus wie das Paket auf diese Eigenschaft gleichen Typs nicht zugewiesen bekommen

public ExcelPackage excelPackage { get; set; } 

using (ExcelPackage package = new ExcelPackage()) 
{ 
    try 
    { 
     //Worksheet for data 
     ExcelWorksheet ws = package.Workbook.Worksheets.Add("Data"); 

     int i = 1; 
     //header row 
     foreach (DataRow dr in ds.Tables[1].Rows) 
     { 
      ws.Cells[1, i].Value = dr["header"].ToString(); 
      i++; 
     } 

     //Start writing data from second row. 
     ws.Cells.LoadFromDataTable(ds.Tables[0], true); 

    } 
    catch (Exception ex) 
    { 

    } 

    excelPackage = package; 
} 

Wenn ich versuche, „excelPackage“ Eigenschaft zuzugreifen außerhalb dieser Klasse, bekomme ich null Wert für excelPackage.File, excelPackage.package, excelPackage.stream. Wie können wir das tun?

Antwort

0

Ihr Objekt ist ein IDisposable was bedeutet, dass es am Ende Ihres using{} Blocks entsorgt wird.

Sie müssen es irgendwo außerhalb des Verwendungsblocks persistieren, bevor es entsorgt wird.

Einige Optionen:

1.Save die Datei auf die Festplatte zuerst mit etwas wie folgt aus:

var fInfo = new FileInfo(@"C:\Temp\myExcelFile.xlsx")); 
excelPackage.SaveAs(fInfo); 

2.Keep es im Speicher als ein Byte-Array (die aus erklärt werden muss, Seite der using{} Block):

byte[] xlsxFileBytes; 
using (ExcelPackage package = new ExcelPackage()) 
{ 
    // 
    // ... snip .. 
    // 
    xlsxFileBytes = package.GetAsByteArray(); 
} 

in jedem Fall, dass Sie die ExcelPackage von der 0 neu erstellen könnenObjekt oder das Byte-Array.

Eine andere Alternative könnte darin bestehen, Ihren Code einfach umzufunktionieren, um alles zu tun, was mit excelPackage INNERHALB des Verwendungsblocks getan werden muss.

0

Stewart_R ir Recht - dies ist, weil der Dateistream nach dem Verlassen von 'using' Block geschlossen ist.

Wenn Sie aus irgendeinem Grund den Lebenszyklus von excelPackage verlängern möchten, sollten Sie die Entsorgung von Paketressourcen aufschieben.

1) loswerden mit Anweisung um ExcelPackage; 1) Markiere die Klasse als IDisposable; 2) Implementieren Sie die IDisposable-Schnittstelle und bereinigen Sie alle Ressourcen in der Dispose-Methode.

Seien Sie vorsichtig, da die Verlängerung des Lebenszyklus dieser Excel-Paket-Instanz dazu führen kann, dass die Datei gesperrt wird.