全部, 这对我来说似乎没有问题,但看起来有一个
我正在从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的空值。我们怎么做到这一点?
答案 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包实例的生命周期会导致文件被锁定。