在ASP.NET 4.0中加载上传文件时出现EPPlus异常

时间:2013-02-07 15:24:23

标签: asp.net epplus

这是我的代码。其目的是计算第一列中有文本的行数。

ExcelWorksheet sheet = null;
using (ExcelPackage pkg = new ExcelPackage(new MemoryStream(_fileBytes)))
{
  sheet = pkg.Workbook.Worksheets[1];
}

int rows = sheet.Dimension.End.Row;
int count = 0;
for (int i = 1; i <= rows; ++i)
{
  if (!string.IsNullOrEmpty(sheet.Cells[i, 1].Text))
    ++count;
}

当我在调试器外运行代码时,我在sheet.Cells[i, 1].Text调用时遇到异常:

Package object was closed and disposed, so cannot carry out operations 
on this object or any stream opened on a part of this package.

当我使用调试器逐步完成它时,我得到了同样的异常......除非我在Watch窗口中有这个:sheet.Cells[1, 1].Text。如果我在代码上运行调试器(即按F5),则在sheet对象初始化之前,我得到异常。如果我单步执行在我的Watch窗口中剪切的代码,则无异常。代码完美无瑕。 Watch窗口正确显示第一个单元格的内容。是什么给了什么?

1 个答案:

答案 0 :(得分:0)

您得到异常是因为您尝试访问ExcelPackage语句之外的using工作表(处理该包)。

using (ExcelPackage pkg = new ExcelPackage(new MemoryStream(_fileBytes)))
{
    sheet = pkg.Workbook.Worksheets[1];
    int rows = sheet.Dimension.End.Row;
    int count = 0;
    for (int i = 1; i <= rows; ++i)
    {
    if (!string.IsNullOrEmpty(sheet.Cells[i, 1].Text))
      ++count;
    }
}

顺便说一句,您可以使用Linq缩短代码:

using (ExcelPackage pkg = new ExcelPackage(new MemoryStream(_fileBytes)))
{
    var sheet = pkg.Workbook.Worksheets.First();
    int count = sheet.Cells[1, 1, sheet.Dimension.End.Row, 1]
        .Count(c => !string.IsNullOrEmpty(c.Text));
}