2016-06-02 3 views
1

Все, Это казалось мне не проблема, но похоже, что это одинкопировать/назначить ExcelPackage EPPlus

Я создаю ExcelPackage из DataTable (данные получены из SQL в DataTable), и я его копирования к публичному свойству типа ExcelPackage (перед сохранением), поскольку мне нужно получить доступ к этому свойству извне класса и сохранить его там. Но похоже, что пакет не получает присвоенные это свойство того же типа

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; 
} 

При попытке доступа к собственности «excelPackage» из-за этот класс, я получаю нулевое значение для excelPackage.File, excelPackage.package, excelPackage.stream. Как мы можем это сделать?

ответ

0

Ваш ExcelPackage объект IDisposable, что означает, что он находится в конце вашего блока using{}.

Вам нужно сохранить его где-то вне используемого блока, прежде чем он будет удален.

Некоторые опции:

1.Save файл на диск сначала что-то вроде этого:

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

2.Keep его в памяти как массив байтов (который должен быть объявлен из СТОРОНА using{} блок):

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

в любом случае вы можете воссоздать ExcelPackage от FileInfo объект или массив байтов.

Другой альтернативой может быть просто рефакторинг кода, чтобы сделать все, что необходимо сделать, с помощью excelPackage ВНУТРИ блока использования.

0

Stewart_R ir right - это потому, что поток файлов закрыт после выхода из блока «using».

Если по какой-либо причине вы хотите продлить жизненный цикл excelPackage, вам следует отложить удаление ресурсов пакета.

1) избавиться от использования утверждения в ExcelPackage; 1) Отметка, содержащая класс как IDisposable; 2) Внедрите IDisposable интерфейс и очистите все ресурсы в методе Dispose;

Просто будьте осторожны, так как продление жизненного цикла этого экземпляра пакета excel может привести к блокировке файла.