复制/分配ExcelPackage EPPlus

时间:2016-06-02 17:35:02

标签: c# epplus

全部, 这对我来说似乎没有问题,但看起来有一个

我正在从DataTable创建一个ExcelPackage(从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的空值。我们怎么做到这一点?

2 个答案:

答案 0 :(得分:0)

您的ExcelPackage对象是IDisposable,这意味着它会在using{}块的末尾处置。

在处理之前,您需要将其保留在使用块之外的某个位置。

一些选项:

1.首先使用以下内容将文件保存到磁盘:

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

2.将它作为字节数组保存在内存中(需要在using{}块中声明 out 侧):

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

在任何一种情况下,您都可以从ExcelPackage对象或字节数组重新创建FileInfo

另一种选择可能是简单地重构代码,以便在使用块的excelPackage INSIDE中做任何事情。

答案 1 :(得分:0)

Stewart_R ir right - 这是因为文件流在离开'后使用'块。

如果由于某种原因你想延长excelPackage的生命周期,那么你应该推迟处理包资源。

1)摆脱ExcelPackage周围的使用声明; 1)标记包含IDisisable的类; 2)实现IDisposable接口并清理Dispose方法中的任何资源;

请注意,延长该excel包实例的生命周期会导致文件被锁定。